基于STM32CubeMX利用定时器中断
定时器本质上就是一个记录脉冲数量的计数器,当记下的数达到上限(或者递减至下限)时会发生“溢出”,让计时器清零同时产生一个信号,这个信号可以代表很多事件。
这里利用“溢出”设计中断,从而做间隔相同时间的中断事件,设计可记录的电子时钟。
这里使用TIM2配置 挂载在总线APB2上 时钟频率为84MHz
在 CUBEMX 设置 PSC = 84 -1 ARR = 1000000 – 1
根据公式计算周期
T = (ARR+1)*(PSC+1)*(对应时钟频率的倒数)
这里的中断周期为1s
添加按键中断
添加串口USART1
定义结构体变量clock
/* USER CODE BEGIN PTD */
typedef struct
{
uint8_t hour;
uint8_t minute;
uint8_t second;
}CLOCK_TypeDef;
/* USER CODE END PTD */
初始化
/* USER CODE BEGIN PV */
CLOCK_TypeDef clock = {0};
/* USER CODE END PV */
编写主函数
/* USER CODE BEGIN 2 */
HAL_TIM_Base_Start_IT (&htim2); //启用TIM中断
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
printf("%02d:%02d:%02d \r\n",clock.hour,clock.minute ,clock.second);
HAL_Delay (1000);
}
/* USER CODE END 3 */
编写中断回调函数
编写串口printf重定义
/* USER CODE BEGIN 4 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
HAL_GPIO_TogglePin (GPIOA, GPIO_PIN_1);
if(1)
{
clock.second ++;
if(clock.second == 60){
clock.second = 0;
clock.minute++;
if(clock.minute == 60){
clock.minute = 0;
clock.hour++;
if(clock.hour == 24){ clock.hour=0; }
}
}
}
}
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == K001_Pin)
{
printf("RecordTIME:%02d:%02d:%02d \r\n",clock.hour,clock.minute ,clock.second);
}
}
int fputc(int ch,FILE *f)
{
HAL_UART_Transmit(&huart1 ,(uint8_t *)&ch,1,HAL_MAX_DELAY );
return ch;
}
int fgetc(FILE *f)
{
uint8_t ch;
HAL_UART_Receive (&huart1,(uint8_t *)&ch,1,HAL_MAX_DELAY );
return ch;
}
/* USER CODE END 4 */
效果演示:
摁下 K1 记入当前时间
![](https://img-blog.csdnimg.cn/94dc94e77ac6488faddcf94c72db50c8.png)
这里只精确到秒,读者可以自行设计更为精确的电子时钟。
该文章作为个人学习stm32的记录,欢迎交流。