STM32基于HAL工程读取DS1302时间数据

✨申明:本文章仅发表在CSDN网站,任何其他网站,未注明来源,见此内容均为盗链和爬取,请多多尊重和支持原创!对于文中所提供的相关资源链接将作不定期更换。相关篇《STM32基于STM32CubeMX读取/设置DS1307》本工程使用STM32F103VE+DS1302实物验证没有问题。

基于STM32CubeMX配置工程,当然不局限与STM32其他型号的芯片的使用,只要是stm32芯片都可以使用该源文件进行驱动,方便适配移植,减少不必要的重复开发工作。

串口打印信息:

STM32CubeMX配置

只需配置串口,用于读取DS1302数据输出。

当然你也可以在STM32CubeMX先指定DS1302引脚。

如果你不想使用系统嘀嗒定时器作为微秒延时函数来时基,可以启用一个定时器。时钟源根据个人具体的STM32型号自己配置。

KEIL工程配置

usart.c文件中添加printf重映射,并在Keil设置中勾选MicroLib选项。

#include "stdio.h"

/*可调用printf*/

int fputc(int ch,FILE *f)

{

/*&huart1指的是串口1,如果用别的串口就修改数字*/

HAL_UART_Transmit(&huart1 , (uint8_t *)&ch , 1 , 1000);

return ch;

}

设置时间到DS1302中

创建一个数组存放当前时间,注意数组下标和时间参数对应关系。

uint8_t buf[8]={1,23/*年*/,4/*月*/,3/*日*/,17/*时*/,34/*分*/,8/*秒*/,1};

DS1302_WriteTime(buf);

DS1302驱动代码

DS1302.h文件

/*

如何使用:

1.根据所使用的控制器替换头文件 "stm32f3xx_hal.h"。我使用的是STM32F103VC。

2.重新分配与芯片连接的端口和引脚(DS1302_GPIO、DS1302_SCLK、DS1302_SDA、DS1302_RST)。

3.在主函数中执行 DS1302_Init();。

现在就可以使用了。

*/

#ifndef _DS1302_H

#define _DS1302_H

#include "stm32f1xx_hal.h"

#include "dwt_delay.h"

//----------------------------------------------------------------------------------

//将下面列出的端口和引脚根据自己的需求进行重新分配

//----------------------------------------------------------------------------------

#define DS1302_CLK_Pin GPIO_PIN_7

#define DS1302_IO_Pin GPIO_PIN_6

#define DS1302_RST_Pin GPIO_PIN_4

#define DS1302_GPIO GPIOA

#define DS1302_SCLK DS1302_CLK_Pin

#define DS1302_SDA DS1302_IO_Pin

#define DS1302_RST DS1302_RST_Pin

//存放时间

typedef struct _time

{

uint8_t second;

uint8_t minute;

uint8_t hour;

uint8_t date;

uint8_t month;

uint8_t week;

uint8_t year;

} DS1302_Time_t;

/* 初始化 */

/* 配置 STM32 端口,启动微秒定时器,并将时钟从省电模式唤醒 */

void DS1302_Init(void);

/* Reads time byte by byte to 'buf' */

void DS1302_ReadTime(DS1302_Time_t* time);

/* Writes time byte by byte from 'buf' */

void DS1302_WriteTime(uint8_t *buf);

/* Writes 'val' to ram address 'addr' */

/* Ram addresses range from 0 to 30 */

void DS1302_WriteRam(uint8_t addr, uint8_t val);

/* Чтение из RAM по адресу 'addr' */

uint8_t DS1302_ReadRam(uint8_t addr);

/* Очистка RAM памяти */

void DS1302_ClearRam(void);

/* Reads time in burst mode, includes control byte */

void DS1302_ReadTimeBurst(uint8_t * temp);

/* Writes time in burst mode, includes control byte */

void DS1302_WriteTimeBurst(uint8_t * buf);

/* Reads ram in burst mode 'len' bytes into 'buf' */

void DS1302_ReadRamBurst(uint8_t len, uint8_t * buf);

/* Writes ram in burst mode 'len' bytes from 'buf' */

void DS1302_WriteRamBurst(uint8_t len, uint8_t * buf);

//Запуск часов.

void DS1302_ClockStart(void);

//Остановка часов.

void DS1302_ClockStop(void);

//Сброс часов

void DS1302_ClockClear(void);

#endif //_DS1302_H

DS1302.c文件

#include "DS1302.h"

// Регистры DS1302

#define DS1302_SEC 0x80

#define DS1302_MIN 0x82

#define DS1302_HOUR 0x84

#define DS1302_DATE 0x86

#define DS1302_MONTH 0x88

#define DS1302_DAY 0x8A

#define DS1302_YEAR 0x8C

#define DS1302_CONTROL 0x8E

#define DS1302_CHARGER 0x90

#define DS1302_CLKBURST 0xBE

#define DS1302_RAMBURST 0xFE

#define RAMSIZE 0x31 // Размер RAM в байтах

#define DS1302_RAMSTART 0xC0 // Первый адрес RAM

#define HEX2BCD(v) ((v) % 10 + (v) / 10 * 16)

#define BCD2HEX(v) ((v) % 16 + (v) / 16 * 10)

// SDA Write(output) Mode

static void writeSDA(void) {

GPIO_InitTypeDef GPIO_InitStructure;

GPIO_InitStructure.Pin = DS1302_SDA;

GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;

GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;

HAL_GPIO_Init(DS1302_GPIO, &GPIO_InitStructure);

}

// SDA Read(input) Mode

static void readSDA(void) {

GPIO_InitTypeDef GPIO_InitStructure;

GPIO_InitStructure.Pin = DS1302_SDA;

GPIO_InitStructure.Mode = GPIO_MODE_INPUT;

GPIO_InitStructure.Pull = GPIO_PULLDOWN;

GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;

HAL_GPIO_Init(DS1302_GPIO, &GPIO_InitStructure);

}

/* Отправка адреса или команды */

static void DS1302_SendCmd(uint8_t cmd) {

uint8_t i;

for (i = 0; i < 8; i ++)

{

// DS1302_SDA = (bit)(addr & 1);

HAL_GPIO_WritePin(DS1302_GPIO, DS1302_SDA, (cmd & 1) ? GPIO_PIN_SET : GPIO_PIN_RESET);

// DS1302_SCK = 1;

HAL_GPIO_WritePin(DS1302_GPIO, DS1302_SCLK, GPIO_PIN_SET);

delayUS_DWT(1);

// DS1302_SCK = 0;

HAL_GPIO_WritePin(DS1302_GPIO, DS1302_SCLK, GPIO_PIN_RESET);

delayUS_DWT(1);

cmd >>= 1;

}

}

/* Прочитать байт по адресу 'addr' */

static void DS1302_WriteByte(uint8_t addr, uint8_t d)

{

uint8_t i;

// DS1302_RST = 1;

HAL_GPIO_WritePin(DS1302_GPIO, DS1302_RST, GPIO_PIN_SET);

//addr = addr & 0xFE;

DS1302_SendCmd(addr); // Отправка адреса

for (i = 0; i < 8; i ++)

{

// DS1302_SDA = (bit)(d & 1);

HAL_GPIO_WritePin(DS1302_GPIO, DS1302_SDA, (d & 1) ? GPIO_PIN_SET : GPIO_PIN_RESET);

// DS1302_SCK = 1;

HAL_GPIO_WritePin(DS1302_GPIO, DS1302_SCLK, GPIO_PIN_SET);

delayUS_DWT(1);

// DS1302_SCK = 0;

HAL_GPIO_WritePin(DS1302_GPIO, DS1302_SCLK, GPIO_PIN_RESET);

delayUS_DWT(1);

d >>= 1;

}

// DS1302_RST = 0;

HAL_GPIO_WritePin(DS1302_GPIO, DS1302_RST, GPIO_PIN_RESET);

// DS1302_SDA = 0;

HAL_GPIO_WritePin(DS1302_GPIO, DS1302_SDA, GPIO_PIN_RESET);

}

/* Sends 'cmd' command and writes in burst mode 'len' bytes from 'temp' */

static void DS1302_WriteBurst(uint8_t cmd, uint8_t len, uint8_t * temp)

{

uint8_t i, j;

DS1302_WriteByte(DS1302_CONTROL, 0x00); // Отключить защиту от записи

// DS1302_RST = 1;

HAL_GPIO_WritePin(DS1302_GPIO, DS1302_RST, GPIO_PIN_SET);

DS1302_SendCmd(cmd); // Sends burst write command

for(j = 0; j < len; j++) {

for (i = 0; i < 8; i ++)

{

// DS1302_SDA = (bit)(d & 1);

HAL_GPIO_WritePin(DS1302_GPIO, DS1302_SDA, (temp[j] & 1) ? GPIO_PIN_SET : GPIO_PIN_RESET);

// DS1302_SCK = 1;

HAL_GPIO_WritePin(DS1302_GPIO, DS1302_SCLK, GPIO_PIN_SET);

delayUS_DWT(1);

// DS1302_SCK = 0;

HAL_GPIO_WritePin(DS1302_GPIO, DS1302_SCLK, GPIO_PIN_RESET);

delayUS_DWT(1);

temp[j] >>= 1;

}

}

// DS1302_RST = 0;

HAL_GPIO_WritePin(DS1302_GPIO, DS1302_RST, GPIO_PIN_RESET);

// DS1302_SDA = 0;

HAL_GPIO_WritePin(DS1302_GPIO, DS1302_SDA, GPIO_PIN_RESET);

DS1302_WriteByte(DS1302_CONTROL, 0x80); // Включить защиту от записи

}

/* Reads a byte from addr */

static uint8_t DS1302_ReadByte(uint8_t addr)

{

uint8_t i;

uint8_t temp = 0;

// DS1302_RST = 1;

HAL_GPIO_WritePin(DS1302_GPIO, DS1302_RST, GPIO_PIN_SET);

addr = addr | 0x01; // Generate Read Address

DS1302_SendCmd(addr); // Sends address

readSDA();

for (i = 0; i < 8; i ++)

{

temp >>= 1;

// if(DS1302_SDA)

if(HAL_GPIO_ReadPin(DS1302_GPIO, DS1302_SDA))

temp |= 0x80;

// DS1302_SCK = 1;

HAL_GPIO_WritePin(DS1302_GPIO, DS1302_SCLK, GPIO_PIN_SET);

delayUS_DWT(1);

// DS1302_SCK = 0;

HAL_GPIO_WritePin(DS1302_GPIO, DS1302_SCLK, GPIO_PIN_RESET);

delayUS_DWT(1);

}

writeSDA();

// DS1302_RST = 0;

HAL_GPIO_WritePin(DS1302_GPIO, DS1302_RST, GPIO_PIN_RESET);

// DS1302_SDA = 0;

HAL_GPIO_WritePin(DS1302_GPIO, DS1302_SDA, GPIO_PIN_RESET);

return temp;

}

/* Sends 'cmd' command and reads in burst mode 'len' bytes into 'temp' */

static void DS1302_ReadBurst(uint8_t cmd, uint8_t len, uint8_t * temp)

{

uint8_t i, j;

// DS1302_RST = 1;

HAL_GPIO_WritePin(DS1302_GPIO, DS1302_RST, GPIO_PIN_SET);

cmd = cmd | 0x01; // Generate read command

DS1302_SendCmd(cmd); // Sends burst read command

readSDA();

for (j = 0; j < len; j ++) {

temp[j] = 0;

for (i = 0; i < 8; i ++)

{

temp[j] >>= 1;

// if(DS1302_SDA)

if(HAL_GPIO_ReadPin(DS1302_GPIO, DS1302_SDA))

temp[j] |= 0x80;

// DS1302_SCK = 1;

HAL_GPIO_WritePin(DS1302_GPIO, DS1302_SCLK, GPIO_PIN_SET);

delayUS_DWT(1);

// DS1302_SCK = 0;

HAL_GPIO_WritePin(DS1302_GPIO, DS1302_SCLK, GPIO_PIN_RESET);

delayUS_DWT(1);

}

}

writeSDA();

// DS1302_RST = 0;

HAL_GPIO_WritePin(DS1302_GPIO, DS1302_RST, GPIO_PIN_RESET);

HAL_GPIO_WritePin(DS1302_GPIO, DS1302_SDA, GPIO_PIN_RESET);

}

/* Writes time byte by byte from 'buf' */

void DS1302_WriteTime(uint8_t *buf)

{

DS1302_WriteByte(DS1302_CONTROL, 0x00); // 解除保护

delayUS_DWT(1);

DS1302_WriteByte(DS1302_SEC, 0x80);

DS1302_WriteByte(DS1302_YEAR, HEX2BCD(buf[1]));

DS1302_WriteByte(DS1302_MONTH, HEX2BCD(buf[2]));

DS1302_WriteByte(DS1302_DATE, HEX2BCD(buf[3]));

DS1302_WriteByte(DS1302_HOUR, HEX2BCD(buf[4]));

DS1302_WriteByte(DS1302_MIN, HEX2BCD(buf[5]));

DS1302_WriteByte(DS1302_SEC, HEX2BCD(buf[6]));

DS1302_WriteByte(DS1302_DAY, HEX2BCD(buf[7]));

DS1302_WriteByte(DS1302_CONTROL, 0x80); // 写保护

delayUS_DWT(1);

}

/* Reads time byte by byte to 'buf' */

void DS1302_ReadTime(DS1302_Time_t* time)

{

uint8_t tmp;

tmp = DS1302_ReadByte(DS1302_YEAR);

time->year= BCD2HEX(tmp);

tmp = DS1302_ReadByte(DS1302_MONTH);

time->month = BCD2HEX(tmp);

tmp = DS1302_ReadByte(DS1302_DATE);

time->date = BCD2HEX(tmp);

tmp = DS1302_ReadByte(DS1302_HOUR);

time->hour = BCD2HEX(tmp);

tmp = DS1302_ReadByte(DS1302_MIN);

time->minute = BCD2HEX(tmp);

tmp = DS1302_ReadByte((DS1302_SEC)) & 0x7F;

time->second = BCD2HEX(tmp);

tmp = DS1302_ReadByte(DS1302_DAY);

time->week = BCD2HEX(tmp);

}

/* DS1302初始化 */

void DS1302_Init(void)

{

DWT_Delay_Init(); //初始化计时器以进行毫秒级定时。

GPIO_InitTypeDef GPIO_InitStructure;

GPIO_InitStructure.Pin = DS1302_SCLK | DS1302_SDA | DS1302_RST;

GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;

GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;

HAL_GPIO_Init(DS1302_GPIO, &GPIO_InitStructure);

DS1302_WriteByte(DS1302_CHARGER, 0x00); // Отключить Trickle Charger

// DS1302_RST = 0;

HAL_GPIO_WritePin(DS1302_GPIO, DS1302_RST, GPIO_PIN_RESET);

// DS1302_SCK = 0;

HAL_GPIO_WritePin(DS1302_GPIO, DS1302_SCLK, GPIO_PIN_RESET);

delayUS_DWT(10); // 不小于10微秒的延时。.

DS1302_ClockStart();

}

/* Writes 'val' to ram address 'addr' */

/* Ram addresses range from 0 to 30 */

void DS1302_WriteRam(uint8_t addr, uint8_t val) {

DS1302_WriteByte(DS1302_CONTROL, 0x00); // 禁用写入保护

delayUS_DWT(1);

if (addr >= RAMSIZE) {

return;

}

DS1302_WriteByte(DS1302_RAMSTART + (2 * addr), val);

DS1302_WriteByte(DS1302_CONTROL, 0x80); // 启用写入保护。

delayUS_DWT(1);

}

/* Reads ram address 'addr' */

uint8_t DS1302_ReadRam(uint8_t addr) {

if (addr >= RAMSIZE) {

return 0;

}

return DS1302_ReadByte(DS1302_RAMSTART + (2 * addr));

}

/* Clears the entire ram writing 0 */

void DS1302_ClearRam(void) {

uint8_t i;

for(i=0; i< RAMSIZE; i++){

DS1302_WriteRam(i, 0x00);

}

}

/* Reads time in burst mode, includes control byte */

void DS1302_ReadTimeBurst(uint8_t * buf) {

uint8_t temp[8] = {0, 0, 0, 0, 0, 0, 0, 0};

DS1302_ReadBurst(DS1302_CLKBURST, 8, temp);

buf[1] = BCD2HEX(temp[6]); // Year

buf[2] = BCD2HEX(temp[4]); // Month

buf[3] = BCD2HEX(temp[3]); // Date

buf[4] = BCD2HEX(temp[2]); // Hour

buf[5] = BCD2HEX(temp[1]); // Min

buf[6] = BCD2HEX(temp[0]); // Sec

buf[7] = BCD2HEX(temp[5]); // Day

buf[0] = temp[7]; // Control

}

/* Writes time in burst mode, includes control byte */

void DS1302_WriteTimeBurst(uint8_t * buf) {

uint8_t temp[8];

temp[0]=HEX2BCD(buf[6]); // Sec

temp[1]=HEX2BCD(buf[5]); // Min

temp[2]=HEX2BCD(buf[4]); // Hour

temp[3]=HEX2BCD(buf[3]); // Date

temp[4]=HEX2BCD(buf[2]); // Month

temp[5]=HEX2BCD(buf[7]); // Day

temp[6]=HEX2BCD(buf[1]); // Year

temp[7]=buf[0]; // Control

DS1302_WriteBurst(DS1302_CLKBURST, 8, temp);

}

/* Reads ram in burst mode 'len' bytes into 'buf' */

void DS1302_ReadRamBurst(uint8_t len, uint8_t * buf) {

uint8_t i;

if(len <= 0) {

return;

}

if (len > RAMSIZE) {

len = RAMSIZE;

}

for(i = 0; i < len; i++) {

buf[i] = 0;

}

DS1302_ReadBurst(DS1302_RAMBURST, len, buf);

}

/* Writes ram in burst mode 'len' bytes from 'buf' */

void DS1302_WriteRamBurst(uint8_t len, uint8_t * buf) {

if(len <= 0) {

return;

}

if (len > RAMSIZE) {

len = RAMSIZE;

}

DS1302_WriteBurst(DS1302_RAMBURST, len, buf);

}

//启动时钟。

//DS1302 最初处于 Halt 模式(已停止,省电模式)。

//为了开始计时,需要执行此函数一次。

void DS1302_ClockStart(void)

{

uint8_t buf = 0x00;

DS1302_WriteByte(DS1302_CONTROL, 0x00); // 禁用写入保护。

delayUS_DWT(1);

buf = DS1302_ReadByte(DS1302_SEC) & 0x7F; // 写入 8 位中的零的同时,保留当前秒数的值

DS1302_WriteByte(DS1302_SEC, buf);

DS1302_WriteByte(DS1302_CONTROL, 0x80); // 启用写入保护。

delayUS_DWT(1);

}

//停止时钟。

//为了进入 Halt 模式(省电模式),此功能可能并不实用

void DS1302_ClockStop(void)

{

uint8_t buf = 0x00;

DS1302_WriteByte(DS1302_CONTROL, 0x00); // 禁用写入保护

delayUS_DWT(1);

buf = DS1302_ReadByte(DS1302_SEC) | 0x80; // 写入 8 位中的1的同时,保留当前秒数的值

DS1302_WriteByte(DS1302_SEC, buf);

DS1302_WriteByte(DS1302_CONTROL, 0x80); // 启用写入保护

delayUS_DWT(1);

}

//重置时钟

//将0写入所有时钟寄存器(从0x80到0x8C)并将 DS1302 传输到 Halt 模式(省电模式)。

//要启动时钟,请使用 DS1302_ClockStart() 函数。

void DS1302_ClockClear(void)

{

DS1302_WriteByte(DS1302_CONTROL, 0x00); // 禁用写入保护

delayUS_DWT(1);

DS1302_WriteByte(DS1302_SEC, 0x80); //重置秒并进入 Halt 模式。

DS1302_WriteByte(DS1302_MIN, 0x00);

DS1302_WriteByte(DS1302_HOUR, 0x00);

DS1302_WriteByte(DS1302_DATE, 0x00);

DS1302_WriteByte(DS1302_MONTH, 0x00);

DS1302_WriteByte(DS1302_DAY, 0x00);

DS1302_WriteByte(DS1302_YEAR, 0x00);

DS1302_WriteByte(DS1302_CONTROL, 0x80); // 启用写入保护。

delayUS_DWT(1);

}

dwt_delay.c文件

uint32_t DWT_Delay_Init(void) {

/* Disable TRC */

CoreDebug->DEMCR &= ~CoreDebug_DEMCR_TRCENA_Msk; // ~0x01000000;

/* Enable TRC */

CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; // 0x01000000;

/* Disable clock cycle counter */

DWT->CTRL &= ~DWT_CTRL_CYCCNTENA_Msk; //~0x00000001;

/* Enable clock cycle counter */

DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk; //0x00000001;

/* Reset the clock cycle counter value */

DWT->CYCCNT = 0;

/* 3 NO OPERATION instructions */

__ASM volatile ("NOP");

__ASM volatile ("NOP");

__ASM volatile ("NOP");

/* Check if clock cycle counter has started */

if(DWT->CYCCNT)

{

return 0; /*clock cycle counter started*/

}

else

{

return 1; /*clock cycle counter not started*/

}

}

dwt_delay.h文件

#ifndef DWT_DELAY_H

#define DWT_DELAY_H

#ifdef __cplusplus

extern "C" {

#endif

#include "stm32f1xx_hal.h"

/**

* @brief Initializes DWT_Cycle_Count for DWT_Delay_us function

* @return Error DWT counter

* 1: DWT counter Error

* 0: DWT counter works

*/

uint32_t DWT_Delay_Init(void);

/**

* @brief This function provides a delay (in microseconds)

* @param microseconds: delay in microseconds

*/

__STATIC_INLINE void delayUS_DWT(volatile uint32_t microseconds)

{

uint32_t clk_cycle_start = DWT->CYCCNT;

/* Go to number of cycles for system */

microseconds *= (HAL_RCC_GetHCLKFreq() / 1000000);

/* Delay till end */

while ((DWT->CYCCNT - clk_cycle_start) < microseconds);

}

#ifdef __cplusplus

}

#endif

#endif //DWT_DELAY_H

main主程序代码

/* USER CODE BEGIN Header */

/**

******************************************************************************

* @file : main.c

* @brief : Main program body

******************************************************************************

* @attention

*

* Copyright (c) 2023 STMicroelectronics.

* All rights reserved.

*

* This software is licensed under terms that can be found in the LICENSE file

* in the root directory of this software component.

* If no LICENSE file comes with this software, it is provided AS-IS.

*

******************************************************************************

*/

/* USER CODE END Header */

/* Includes ------------------------------------------------------------------*/

#include "main.h"

#include "tim.h"

#include "usart.h"

#include "gpio.h"

/* Private includes ----------------------------------------------------------*/

/* USER CODE BEGIN Includes */

#include "stdio.h"

#include "DS1302.h"

/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/

/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/

/* USER CODE BEGIN PD */

/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/

/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/

void SystemClock_Config(void);

/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/

/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**

* @brief The application entry point.

* @retval int

*/

int main(void)

{

/* USER CODE BEGIN 1 */

DS1302_Time_t time = {0};

// uint8_t buf[8]={23,4,3,14,34,8,1};

const char *WEEK[7] = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" };

/* USER CODE END 1 */

/* MCU Configuration--------------------------------------------------------*/

/* Reset of all peripherals, Initializes the Flash interface and the Systick. */

HAL_Init();

/* USER CODE BEGIN Init */

/* USER CODE END Init */

/* Configure the system clock */

SystemClock_Config();

/* USER CODE BEGIN SysInit */

/* USER CODE END SysInit */

/* Initialize all configured peripherals */

MX_GPIO_Init();

MX_USART1_UART_Init();

MX_TIM6_Init();

/* USER CODE BEGIN 2 */

printf("Hello World \r\n");

DWT_Delay_Init();

DS1302_Init();

// DS1302_WriteTime(buf);

uint32_t TimerUART = HAL_GetTick();

/* USER CODE END 2 */

/* Infinite loop */

/* USER CODE BEGIN WHILE */

while (1)

{

/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */

if ((HAL_GetTick() - TimerUART) > 1500)

{

/* 定义时间结构体 */

/* 获取并打印当前时间 */

DS1302_ReadTime(&time);

printf("Current Time: 20%02d-%02d-%02d %02d:%02d:%02d T=%s \r\n", time.year, time.month, time.date, time.hour, time.minute, time.second, WEEK[time.week]);

TimerUART = HAL_GetTick();

HAL_GPIO_TogglePin(GPIOE, LED_Pin);

}

}

/* USER CODE END 3 */

}

/**

* @brief System Clock Configuration

* @retval None

*/

void SystemClock_Config(void)

{

RCC_OscInitTypeDef RCC_OscInitStruct = {0};

RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

/** Initializes the RCC Oscillators according to the specified parameters

* in the RCC_OscInitTypeDef structure.

*/

RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;

RCC_OscInitStruct.HSEState = RCC_HSE_ON;

RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;

RCC_OscInitStruct.HSIState = RCC_HSI_ON;

RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;

RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;

RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;

if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)

{

Error_Handler();

}

/** Initializes the CPU, AHB and APB buses clocks

*/

RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK

| RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;

RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;

RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;

RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;

RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)

{

Error_Handler();

}

}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

/**

* @brief This function is executed in case of error occurrence.

* @retval None

*/

void Error_Handler(void)

{

/* USER CODE BEGIN Error_Handler_Debug */

/* User can add his own implementation to report the HAL error return state */

__disable_irq();

while (1)

{

}

/* USER CODE END Error_Handler_Debug */

}

#ifdef USE_FULL_ASSERT

/**

* @brief Reports the name of the source file and the source line number

* where the assert_param error has occurred.

* @param file: pointer to the source file name

* @param line: assert_param error line source number

* @retval None

*/

void assert_failed(uint8_t *file, uint32_t line)

{

/* USER CODE BEGIN 6 */

/* User can add his own implementation to report the file name and line number,

ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

/* USER CODE END 6 */

}

#endif /* USE_FULL_ASSERT */

工程源码

✨申明:本文章仅发表在CSDN网站,任何其他网站,未注明来源,见此内容均为盗链和爬取,请多多尊重和支持原创!对于文中所提供的相关资源链接将作不定期更换。

链接: https://pan.baidu.com/s/1VPiYExdvXEcQOXrpDiWnGg

提取码: m7jc

好文阅读

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: