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

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

(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。

 

4.3 主要函数

在单片机开发中,使用51定时器中断实现LED闪烁是一种常见的应用。51单片机内置了定时器,可以通过配置定时器中断实现定时任务。以下是实现LED闪烁的基本步骤: ### 硬件连接 1. 将LED的正极通过一个限流电阻连接到单片机的某个IO口(例如P1.0)。 2. 将LED的负极连接到地。 ### 软件实现 1. **初始化定时器**:设置定时器的工作模式和初始值。 2. **启动定时器**:使能定时器中断。 3. **编写中断服务程序**:在中断服务程序中切换LED的状态。 ### 示例代码 ```c #include <reg51.h> #define LED P1_0 // 定义LED连接的IO口 void Timer0_Init(void) { TMOD &= 0xF0; // 设置定时器0为模式1 TMOD |= 0x01; TH0 = 0xFC; // 设置定时初值,定时1ms TL0 = 0x66; ET0 = 1; // 使能定时器0中断 EA = 1; // 使能总中断 TR0 = 1; // 启动定时器0 } void Timer0_ISR(void) interrupt 1 { TH0 = 0xFC; // 重新加载定时初值 TL0 = 0x66; LED = ~LED; // 切换LED状态 } void main(void) { Timer0_Init(); // 初始化定时器 while (1) { // 主循环中可以执行其他任务 } } ``` ### 代码解释 1. **Timer0_Init函数**:初始化定时器0为模式1(16位定时器),设置定时初值,并使能定时器中断和总中断2. **Timer0_ISR函数**:定时器0的中断服务程序,每次中断时重新加载定时初值,并切换LED的状态。 3. **main函数**:调用Timer0_Init函数进行初始化,并在主循环中执行其他任务。 通过上述步骤和代码,可以实现使用51定时器中断控制LED闪烁的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值