RT-Thread之STM32使用定时器实现输入捕获

前言

基于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口,看看是否能捕获上升沿进入中断,由串口打印查看。

c 复制代码
/*
 * 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;
}

29、最后我把PA6脚触到3.3V电,则会触发捕获中断

相关推荐
启雀AI23 分钟前
培训平台移动端离线学习方案设计与实现:视频缓存、断点续传与进度同步的工程实践
android·学习·缓存·音视频·企业lms
神经智研社38 分钟前
ROS2-第十七章:网络通信,win11系统 通过镜像配置 打通 WSL 下的ros2与 同局域网(同IP段)的里其它设备上的ros2通信
机器人·机器人环境搭建·win11 ros2 开发环境
双星系统2 小时前
双臂机器人迎来广阔应用风口!既是工业柔性主力,也是人形机器人优质上肢配件
人工智能·机器人
Fa_Mian_Tuan2 小时前
图论基础|邻接矩阵超详细讲解(含无向/有向/带权图+完整可运行C语言代码)
c语言·数据结构·笔记·算法·图论
Bruce_Liuxiaowei3 小时前
从零到可运行:基于 Vue3 + FastAPI + DeepSeek-V3 的 AI 英语单词学习系统全栈实战
人工智能·python·学习·fastapi·全栈·智能体
恒锐丰-罗生3 小时前
SS8103 芯片解析:45V 同步整流降压半桥恒流驱动控制器 大功率光源国产优选 告别低灰闪烁!
驱动开发·嵌入式硬件·硬件工程
FakeOccupational4 小时前
【电路笔记 STM32】stm32f103 实现HAL_UART_Transmit_DMA + 普通模式/连续模式的 UART DMA 收发
笔记·stm32·嵌入式硬件
bkspiderx4 小时前
从零开始:VS Code搭建C/C++开发环境全指南(Windows/macOS/Linux)
c语言·c++·windows·vs code·c/c++开发环境
雪的季节4 小时前
OPENCV学习(补充1)
人工智能·opencv·学习
wuyk5554 小时前
第 6 章 FOC 完整系统整合:从算法到真机跑起来
c语言·开发语言·stm32·单片机·嵌入式硬件