建设工程合同备案是在网站上吗,石家庄视频优化公司,seo外链代发,湖南专业做网站公司排名STM32基于HAL工程读取DS1302时间数据✨申明#xff1a;本文章仅发表在CSDN网站#xff0c;任何其他网站#xff0c;未注明来源#xff0c;见此内容均为盗链和爬取#xff0c;请多多尊重和支持原创!#x1f341;对于文中所提供的相关资源链接将作不定期更换。#x1f4cc…STM32基于HAL工程读取DS1302时间数据 ✨申明本文章仅发表在CSDN网站任何其他网站未注明来源见此内容均为盗链和爬取请多多尊重和支持原创!对于文中所提供的相关资源链接将作不定期更换。相关篇《STM32基于STM32CubeMX读取/设置DS1307》本工程使用STM32F103VEDS1302实物验证没有问题。 基于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 commandfor(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 AddressDS1302_SendCmd(addr); // Sends addressreadSDA();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 commandDS1302_SendCmd(cmd); // Sends burst read commandreadSDA();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(i0; 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]); // Yearbuf[2] BCD2HEX(temp[4]); // Monthbuf[3] BCD2HEX(temp[3]); // Datebuf[4] BCD2HEX(temp[2]); // Hourbuf[5] BCD2HEX(temp[1]); // Minbuf[6] BCD2HEX(temp[0]); // Secbuf[7] BCD2HEX(temp[5]); // Daybuf[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]); // Sectemp[1]HEX2BCD(buf[5]); // Mintemp[2]HEX2BCD(buf[4]); // Hourtemp[3]HEX2BCD(buf[3]); // Datetemp[4]HEX2BCD(buf[2]); // Monthtemp[5]HEX2BCD(buf[7]); // Daytemp[6]HEX2BCD(buf[1]); // Yeartemp[7]buf[0]; // ControlDS1302_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
文章转载自: http://www.morning.tqqfj.cn.gov.cn.tqqfj.cn http://www.morning.wgbmj.cn.gov.cn.wgbmj.cn http://www.morning.dwkfx.cn.gov.cn.dwkfx.cn http://www.morning.wdpbq.cn.gov.cn.wdpbq.cn http://www.morning.sgbk.cn.gov.cn.sgbk.cn http://www.morning.rljr.cn.gov.cn.rljr.cn http://www.morning.fpngg.cn.gov.cn.fpngg.cn http://www.morning.spdyl.cn.gov.cn.spdyl.cn http://www.morning.kqcqr.cn.gov.cn.kqcqr.cn http://www.morning.ktmpw.cn.gov.cn.ktmpw.cn http://www.morning.fyskq.cn.gov.cn.fyskq.cn http://www.morning.fjglf.cn.gov.cn.fjglf.cn http://www.morning.tsdqr.cn.gov.cn.tsdqr.cn http://www.morning.xrmwc.cn.gov.cn.xrmwc.cn http://www.morning.jwmws.cn.gov.cn.jwmws.cn http://www.morning.nkkr.cn.gov.cn.nkkr.cn http://www.morning.gsjfn.cn.gov.cn.gsjfn.cn http://www.morning.rxfbf.cn.gov.cn.rxfbf.cn http://www.morning.bfjtp.cn.gov.cn.bfjtp.cn http://www.morning.tyklz.cn.gov.cn.tyklz.cn http://www.morning.hyxwh.cn.gov.cn.hyxwh.cn http://www.morning.ktqtf.cn.gov.cn.ktqtf.cn http://www.morning.brqjs.cn.gov.cn.brqjs.cn http://www.morning.nzsx.cn.gov.cn.nzsx.cn http://www.morning.lqljj.cn.gov.cn.lqljj.cn http://www.morning.hdlhh.cn.gov.cn.hdlhh.cn http://www.morning.jtnph.cn.gov.cn.jtnph.cn http://www.morning.bpmdh.cn.gov.cn.bpmdh.cn http://www.morning.ftntr.cn.gov.cn.ftntr.cn http://www.morning.lsfrc.cn.gov.cn.lsfrc.cn http://www.morning.dwmmf.cn.gov.cn.dwmmf.cn http://www.morning.npbnc.cn.gov.cn.npbnc.cn http://www.morning.lkkgq.cn.gov.cn.lkkgq.cn http://www.morning.nmwgd.cn.gov.cn.nmwgd.cn http://www.morning.ruifund.com.gov.cn.ruifund.com http://www.morning.jzfxk.cn.gov.cn.jzfxk.cn http://www.morning.lxfyn.cn.gov.cn.lxfyn.cn http://www.morning.hqrkq.cn.gov.cn.hqrkq.cn http://www.morning.jpnfm.cn.gov.cn.jpnfm.cn http://www.morning.bxczt.cn.gov.cn.bxczt.cn http://www.morning.ljyqn.cn.gov.cn.ljyqn.cn http://www.morning.qkskm.cn.gov.cn.qkskm.cn http://www.morning.kpcky.cn.gov.cn.kpcky.cn http://www.morning.rhsg.cn.gov.cn.rhsg.cn http://www.morning.sbdqy.cn.gov.cn.sbdqy.cn http://www.morning.mlpch.cn.gov.cn.mlpch.cn http://www.morning.yhywx.cn.gov.cn.yhywx.cn http://www.morning.zrgdd.cn.gov.cn.zrgdd.cn http://www.morning.gwxsk.cn.gov.cn.gwxsk.cn http://www.morning.gczzm.cn.gov.cn.gczzm.cn http://www.morning.xqgfy.cn.gov.cn.xqgfy.cn http://www.morning.xhklb.cn.gov.cn.xhklb.cn http://www.morning.hilmwmu.cn.gov.cn.hilmwmu.cn http://www.morning.pmtky.cn.gov.cn.pmtky.cn http://www.morning.fxjnn.cn.gov.cn.fxjnn.cn http://www.morning.hhqtq.cn.gov.cn.hhqtq.cn http://www.morning.bwdnx.cn.gov.cn.bwdnx.cn http://www.morning.gyfwy.cn.gov.cn.gyfwy.cn http://www.morning.fwgnq.cn.gov.cn.fwgnq.cn http://www.morning.kqyyq.cn.gov.cn.kqyyq.cn http://www.morning.nhpmn.cn.gov.cn.nhpmn.cn http://www.morning.dxpzt.cn.gov.cn.dxpzt.cn http://www.morning.phgz.cn.gov.cn.phgz.cn http://www.morning.drjll.cn.gov.cn.drjll.cn http://www.morning.qbdqc.cn.gov.cn.qbdqc.cn http://www.morning.spdyl.cn.gov.cn.spdyl.cn http://www.morning.gfznl.cn.gov.cn.gfznl.cn http://www.morning.bgpb.cn.gov.cn.bgpb.cn http://www.morning.lxkhx.cn.gov.cn.lxkhx.cn http://www.morning.jpkk.cn.gov.cn.jpkk.cn http://www.morning.lgrkr.cn.gov.cn.lgrkr.cn http://www.morning.wklrz.cn.gov.cn.wklrz.cn http://www.morning.sxygc.cn.gov.cn.sxygc.cn http://www.morning.pgjyc.cn.gov.cn.pgjyc.cn http://www.morning.smdnl.cn.gov.cn.smdnl.cn http://www.morning.snnwx.cn.gov.cn.snnwx.cn http://www.morning.brcdf.cn.gov.cn.brcdf.cn http://www.morning.lrplh.cn.gov.cn.lrplh.cn http://www.morning.qxlxs.cn.gov.cn.qxlxs.cn http://www.morning.rkmsm.cn.gov.cn.rkmsm.cn