前言
基于RT-Thread的STM32开发,配置使用定时器实现输出比较。
例如设定一定的比较值,当定时器值等于设定比较值时会触发比较中断,在中断里打印输出,查看时间戳,计算验证是否和配置的定时器输出比较中断周期一致。
一、新建工程,我是用的是STM32F407ZGT6
二、工程配置及代码编写
1、打开CubeMX
2、时钟配置使用外部高速晶振
3、配置下载口
4、配置时钟树,频率直接拉满
5、打开串口一,调试打印用
6、打开定时器三通道二输出比较。
7、代码生成
8、编译一下,出现如下报错
9、右击工程,修改芯片支持包版本
10、再编译,无报错无警告
11、打开定时器设备驱动程序
12、board.h中打开定时器三注释
13、使能定时器模块
14、找到CubeMX自动生成的定时器三初始化函数
15、进入HAL_TIM_MspPostInit(&htim3)这个函数内部
16、在HAL_TIM_MspPostInit函数内部这个位置,补充上定时器三时钟初始化
17、在这个位置补充开启定时器三中断
18、在定时器三初始化的最后这个位置开启定时器三输出比较中断
19、回到主函数这,在函数开始进行定时器三初始化,编译一下发现报错
20、找到定时器三初始化代码,把这个static关键字去掉
21、函数声明这里的static也去掉
22、再编译,就能通过了
23、找到CubeMX生成的时钟配置函数,将其剪切
24、粘贴到drv_clk.c文件里
25、在时钟初始化这里,使用CubeMX生成的时钟配置函数,将原来的替换掉
26、再打开CubeMX,得知TIM3挂载在APB1总线上,时钟频率为84MHZ
27、回到定时器三初始化代码,时钟分频填83,则计算一下,分频后的时钟为1MHZ
28、比较值为0,自动重装载值为65535,则计算一下,得知0.065535S就会进一次中断
29、主函数中写入如下代码进行测试,在比较中断中进行打印输出,然后待会在串口助手查看打印输出的时间戳。
c
/*
* Copyright (c) 2006-2024, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2024-10-19 RT-Thread first version
*/
#include <rtthread.h>
#include <rtdevice.h>
#include "board.h"
extern TIM_HandleTypeDef htim3;
#define SYS_LED GET_PIN(A, 15)
static void SystemLedRun(void)
{
static uint8_t l_ucmode = 0;
if (l_ucmode == 0)
{
rt_pin_write(SYS_LED, PIN_HIGH);
l_ucmode = 1;
}
else if (l_ucmode == 1)
{
rt_pin_write(SYS_LED, PIN_LOW);
l_ucmode = 0;
}
}
//输出比较中断函数
void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == htim3.Instance)
{
switch(htim->Channel)
{
case HAL_TIM_ACTIVE_CHANNEL_2:
rt_kprintf("TIM3_OC_TRICK!!!\r\n");
break;
default:
break;
}
}
}
int main(void)
{
MX_TIM3_Init();
rt_pin_mode(SYS_LED, PIN_MODE_OUTPUT);
rt_pin_write(SYS_LED, PIN_HIGH);
while (1)
{
SystemLedRun();
rt_thread_mdelay(500);
}
return RT_EOK;
}