前言
基于RT-Thread的STM32开发,配置使用定时器实现输入捕获。
比如配置特定通道捕获上升沿,该通道对应的引脚有上升沿信号输入,则触发捕获中断。
一、新建工程
二、工程配置
1、打开CubeMX 进行工程配置
2、时钟使用外部高速晶振
3、配置下载口
4、配置时钟树
5、打开串口一调试输出
6、配置定时器三,打算用定时器三的通道一做输入捕获。
7、生成.c和.h文件
8、生成代码
三、代码编写
1、先编译一下工程,出现如下报错
2、修改芯片支持包版本
3、将0.2.3降版本为0.2.2
4、确认切换
5、点击确定去下载资源
6、下载0.2.2版本
7、下载完成后再进行切换
8、切换完成后,再进行编译,无报错无警告
9、使能定时器模块
10、打开定时器驱动程序
11、找到CubeMX生成的 MX_TIM3_Init()进入进去
12、长这样
13、找到这个函数HAL_TIM_Base_MspInit
14、把它放到MX_TIM3_Init()定时器三初始化函数的这个位置
15、在HAL_TIM_Base_MspInit这个函数里写上开启定时器三的中断。
16、最后再在定时器三的初始化函数里写上开启定时器三通道一的输入捕获。
17、回到主函数,在函数开始时进行定时器三的初始化,编译发现报错,说函数未定义
18、找到该函数,将前面的static关键字去掉
19、前面的声明这也要去掉
20、再编译,无报错无警告
21、再看看定时器三的初始化函数,这里是输入捕获的触发边沿,可以根据需要进行修改
22、在主函数这里写上输入捕获中断函数
23、打开CubeMX查看确认一下TIM3通道一的引脚号,我这里是PA6,也就是说当PA6引脚捕获到上升沿信号时,就会进入捕获中断。
24、进入HAL_TIM_Base_MspInit()函数,配置捕获引脚为下拉输入。
25、board.h里要打开TIM3
26、再配置一下时钟,RTT默认使用的是内部时钟,找到CubeMX生成的SystemClock_Config()时钟配置函数,将其复制到drv.clk.c里面来
27、然后在时钟初始化这里做一个替换,把CubeMX生成的时钟配置函数替换进去,把原来的注释掉
28、在主函数中写入如下代码测试,找到板子上的PA6引脚(我使用的是PA6),将其接到板子上的3.3V口,看看是否能捕获上升沿进入中断,由串口打印查看。
/*
* Copyright (c) 2006-2024, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2024-10-15 RT-Thread first version
*/
#include <rtthread.h>
#include <rtdevice.h>
#include "board.h"
/* system io */
#define SYS_LED GET_PIN(A, 15)
extern TIM_HandleTypeDef htim3;
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == htim3.Instance)
{
switch(htim->Channel)
{
case HAL_TIM_ACTIVE_CHANNEL_1:
rt_kprintf("TIM3_IC_TRICK!!\r\n");
break;
default:
break;
}
}
}
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;
}
}
int main(void)
{
rt_pin_mode(SYS_LED, PIN_MODE_OUTPUT);
rt_pin_write(SYS_LED, PIN_HIGH);
MX_TIM3_Init(&htim3);
while (1)
{
SystemLedRun();
rt_thread_mdelay(500);
}
return RT_EOK;
}