【MCU】基于STM32CubeMX定时器中断实现LED闪烁
程序员文章站
2022-06-11 16:56:04
...
基于STM32CubeMX定时器中断实现 LED 闪烁
本实验基于STM32CubeMX实现对STM32开发板的配置,通过定时器中断实现 LED 闪烁。
Table of Contents
1. 软件与硬件
1.1 硬件要求
(1)ALIENTEK ELITE STM32F103 开发板 (STM32F103ZET6 芯片)
(2)USB转TTL 模块
1.2 软件要求
(1)Java Runtime Environment (JRE) 1.8.0 版本
(2)STM32CubeMX 5.6.1 版本
(3)IAR Embedded Workbench 8.0
(4)串口调试工具
2. STM32CubeMX配置开发板
LED 0:PB5
LED 1:PE5
USART1_TX:PA9
USART1_RX:PA10
2.1 Pinout & Configuration
(1)RCC 配置
(2)GPIO 配置
(3)NICV 配置
(4)SYS 配置
(5)Timers 配置
(6)USART1 配置
2.2 Clock Configuration
2.3 Project Manager
3. 程序代码
3.1 usart.c
实现printf的重定向
/* USER CODE BEGIN 0 */
/******************************************************************
*@brief Retargets the C library printf function to the USART.
*@param None
*@retval None
******************************************************************/
#include "stdio.h"
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int _io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__*/
PUTCHAR_PROTOTYPE
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}
/* USER CODE END 0 */
3.2 main.c
(1)添加头文件
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <stdio.h>
#include <string.h>
/* USER CODE END Includes */
(2)主函数中开启定时器中断
/* USER CODE BEGIN 2 */
HAL_TIM_Base_Start_IT(&htim2);
/* USER CODE END 2 */
(3)中断回调函数中反转 LED 状态
/* USER CODE BEGIN 4 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
static unsigned char ledState = 0;
if (htim == (&htim2))
{
if (ledState == 0)
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_5,GPIO_PIN_RESET);
else
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_5,GPIO_PIN_SET);
ledState = !ledState;
}
}
/* USER CODE END 4 */
4. 程序分析
4.1 定时器中断逻辑
4.2 定时器周期
本实验的时钟频率为72MHz,由此可知,时钟周期为1/72MHz
Tclk:时钟频率
Tout :定时器周期
不太官方的理解,有错欢迎指正:
(Prescaler+1)x 1/Tclk 可理解为一次计数的时间,(Counter Period +1) 可理解为总的计数次数,
则不难理解,定时器周期 = 一次计数时间 x 总的计数次数。通过带入参数,可知本实验的定时器周期为 500ms。