基于STM32CubeMx基本定时器实现每秒翻转一次LED的亮灭

STM32CubeMx设定

基本定时器配置

本次使用单片机为STM32F103ZET6,打开STM32CubeMx,跳转到定时器界面:
在这里插入图片描述
找到基本定时器并将其激活,可以将鼠标悬停在选项上查看属于什么定时器,或者打开相应的技术手册查看,这里需要设置定时器更新中断时间,可根据一下公式计算:
Tout= ((arr+1)*(psc+1))/Tclk,这里的参数对应:Tout为溢出时间,arr为自动重装载值,psc为预分配系数以及Tclk为输入时钟频率,其中arr、psc以及Tclk可以在STM32CubeMx中查看并设置,最终计算出Tout,这里设置时间为1s,根据公式首先会先带入psc,我们设置psc为72-1,Tclk为72M,就可以算出arr为10000-1,即下图:
在这里插入图片描述
输入时钟频率我们可以在系统时钟树配置中查看:
在这里插入图片描述

基本定时器中断设置

打开基本定时器中断并进行配置抢占优先级和响应优先级
在这里插入图片描述
可根据自身需求设置,这里设置为0,0。

工程生成及代码编写

工程生成

生成工程后我们可以看到左边已经有了相关的代码:
在这里插入图片描述
在用到基本定时器中断有以下几个比较重要的函数:

void MX_TIM6_Init(void);										//基本定时器6初始化及配置
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle);	//相关时钟使能及NVIC中断配置
HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim);//使能更新中断函数
void TIM6_IRQHandler(void);										//定时器6中断处理服务函数
void HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim);				//HAL库定时器公共服务处理函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);	//定时器溢出中断回调函数

接下来就是如何使用这些函数:

定时器6初始化及配置

打开tim.c文件即可查看到初始化相关函数:
在这里插入图片描述我们在STM32CubeMx中的配置,在keil中已经一键生成了代码,需要做的就是加入使能更新中断函数:

HAL_TIM_Base_Start_IT(&htim6);		//配置的基本定时器为定时器6

中断回调函数编写

使能了定时器中断后,下一步就是编写中断回调函数,功能比较简单,就是翻转IO口的电平即可控制灯的亮灭:

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin);
}

这里的参数参考板子上相关控制LED灯的IO口即可。

main函数

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM6_Init();
  /* USER CODE BEGIN 2 */
 
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

这里的main函数我们不需要编写,STM32CubeMx已经帮我们生成好了,至此,我们所需要实现的通过基本定时器实现每秒翻转一次LED的亮灭功能已经实现。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
首先,你需要在STM32CubeMX中配置定时器和GPIO引脚。以下是一个基本的步骤: 1. 打开STM32CubeMX并选择你的芯片型号。 2. 在"Pinout & Configuration"选项卡中,选择一个GPIO引脚作为LED控制引脚。 3. 在"Clock Configuration"选项卡中,启用定时器时钟。 4. 在"Configuration"选项卡中,选择一个定时器,并设置它的时钟源和分频器。 5. 在"NVIC Settings"选项卡中,启用定时器中断(如果需要)。 接下来,你需要在代码中编写相关的控制逻辑。以下是一个示例代码: ``` #include "main.h" #include "tim.h" void LED_Toggle(void) { HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); } int main(void) { HAL_Init(); MX_GPIO_Init(); MX_TIM2_Init(); HAL_TIM_Base_Start_IT(&htim2); while (1) { // Your main code here } } void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim->Instance == TIM2) { LED_Toggle(); } } ``` 在这个例子中,我们使用TIM2定时器控制LED的闪烁。首先,我们在main函数中启动了定时器,并在while循环中执行其他操作。然后,在HAL_TIM_PeriodElapsedCallback回调函数中,我们切换LED的状态。这个回调函数会在定时器的计数器达到设定的周期时被调用。在这个例子中,LED的状态会每个定时器周期切换一次。 注意,这个例子仅供参考,你需要根据具体的要求进行修改。例如,你可能需要改变定时器的周期和占空比,或者使用不同的GPIO引脚和定时器

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

葛叶灬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值