编写一份关于stm32的电子时钟代码C语言板
时间: 2024-09-13 19:15:59 浏览: 47
在STM32微控制器上编写一个简单的电子时钟代码,通常会涉及到硬件配置、时钟初始化以及时间同步。这里假设我们使用的是STM32F103系列,并且采用HAL库。以下是基本步骤和一个简化的示例:
```c
#include "stm32f1xx_hal.h"
// 定义时钟相关的结构体和常量
__IO uint32_t TimeElapsed = 0;
RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_ClockConfigTypeDef RCC_ClkInitStruct;
void SystemClock_Config(void)
{
// 配置系统时钟源
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_LSI; // 使用HSE和LSI作为时钟源
RCC_OscInitStruct.HSEState = RCC_HSE_ON; // 开启HSI
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; // 启动PLL
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; // 选择HSE作为PLL输入
RCC_OscInitStruct.PLL.PLLM = 8; // 分频系数
RCC_OscInitStruct.PLL.PLLN = 336; // PLL输出频率
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; // PLL预分频
RCC_OscInitStruct.PLL.PLLQ = 7; // PLL后分频
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
while(1); // 错误处理,无限循环
}
// 应用时钟配置到SYSCLK、AHB1、APB1
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_APB1;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)
{
while(1); // 错误处理,无限循环
}
}
void TIM_TimeStamp_Init()
{
TIM_HandleTypeDef hTIM;
hTIM.Instance = TIM3; // 指定定时器实例
hTIM.Init.Prescaler = 8399; // 根据系统时钟计算出合理的预分频值
hTIM.Init.CounterMode = TIM_COUNTERMODE_UP;
hTIM.Init.Period = 0xFFFF; // 设置周期为65535(取决于时钟频率)
hTIM.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
if(HAL_TIM_Base_Init(&hTIM) != HAL_OK)
{
while(1); // 错误处理,无限循环
}
HAL_TIM_Base_Start_IT(&hTIM);
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
TimeElapsed++; // 当定时器溢出时更新时间
// 可在此处添加日志或其他操作,例如显示当前时间
if (TimeElapsed % 1000 == 0)
{
printf("Current time: %d milliseconds\r\n", TimeElapsed);
}
}
int main(void)
{
HAL_Init();
SystemClock_Config(); // 初始化时钟
TIM_TimeStamp_Init(); // 初始化计时器用于时间测量
while (1)
{
// 主程序循环,其他功能代码...
}
}
```
阅读全文