欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【MCU】基于STM32CubeMX定时器中断实现LED闪烁

程序员文章站 2022-06-11 16:56:04
...

基于STM32CubeMX定时器中断实现 LED 闪烁

本实验基于STM32CubeMX实现对STM32开发板的配置,通过定时器中断实现 LED 闪烁。

Table of Contents

基于STM32CubeMX定时器中断实现 LED 闪烁

1. 软件与硬件

1.1 硬件要求

1.2 软件要求

2. STM32CubeMX配置开发板

2.1 Pinout & Configuration

2.2 Clock Configuration

2.3 Project Manager 

3. 程序代码

3.1 usart.c

3.2 main.c

4. 程序分析 

4.1 定时器中断逻辑

4.2 定时器周期

4.3 主要函数

 

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 配置

【MCU】基于STM32CubeMX定时器中断实现LED闪烁

(2)GPIO 配置

【MCU】基于STM32CubeMX定时器中断实现LED闪烁

 (3)NICV 配置

【MCU】基于STM32CubeMX定时器中断实现LED闪烁

  (4)SYS 配置

【MCU】基于STM32CubeMX定时器中断实现LED闪烁

 (5)Timers 配置

【MCU】基于STM32CubeMX定时器中断实现LED闪烁

  (6)USART1 配置

【MCU】基于STM32CubeMX定时器中断实现LED闪烁

2.2 Clock Configuration

【MCU】基于STM32CubeMX定时器中断实现LED闪烁

2.3 Project Manager 

【MCU】基于STM32CubeMX定时器中断实现LED闪烁

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 定时器中断逻辑

【MCU】基于STM32CubeMX定时器中断实现LED闪烁

4.2 定时器周期

本实验的时钟频率为72MHz,由此可知,时钟周期为1/72MHz

【MCU】基于STM32CubeMX定时器中断实现LED闪烁

【MCU】基于STM32CubeMX定时器中断实现LED闪烁

Tclk:时钟频率

Tout :定时器周期

不太官方的理解,有错欢迎指正:

(Prescaler+1)x 1/Tclk 可理解为一次计数的时间,(Counter Period +1) 可理解为总的计数次数,

则不难理解,定时器周期 = 一次计数时间 x 总的计数次数。通过带入参数,可知本实验的定时器周期为 500ms。

【MCU】基于STM32CubeMX定时器中断实现LED闪烁

 

4.3 主要函数

【MCU】基于STM32CubeMX定时器中断实现LED闪烁