淘先锋技术网

首页 1 2 3 4 5 6 7

前言

折腾了很久终于在rt_thread studio中调通定时器的输入捕获功能


一、使用RT_Thread studio创建工程

过程不在啰嗦,创建完成后如果使用外部时钟记得更改时钟配置。

另外,习惯性点亮一颗LED,直观监测板子运行状态,后续会体会到。

 

二、CubeMX配置定时器

1.打开CubeMX

在rtthread studio中打开cubemx,首次使用需要指定cubemx路径。

 

 

2.配置定时器

示例为TIM3

 


1、设置定时器Slave Mode为Reset Mode,当检测到上升沿时,定时器复位;

2、PWM由CH1进入,触发源设置为TI1FP1,并设置IC1为上升沿捕获;

3、通道1设置为直接模式,通道2设置为间接模式触发为ti1fp2;

4、根据输入信号频率选择适当分频,通道1上升沿触发,通道2下降沿触发。

具体步骤如下:

3、第一次捕获到上升沿时,定时器复位,计数寄存器CNT清零;

4、tim_IC2捕获到下降沿时,计数值CNT会被存到捕获寄存器CCR2中;

5、tim_IC1再次捕获到上升沿时,计数值CNT会被存到捕获寄存器CCR1中,同时将定时器复位;

所以,CCR1的值就是周期,CCR2的值是高电平时间。

打开tim中断后点击右上角generate cooe生成代码。

3、打开rt硬件定时器驱动

 1、打开HWTIMER外设并保存。

2、宏定义

   board.h中定义 #define BSP_USING_TIM和#define BSP_USING_TIM3(根据实际使用情况)

3、复制定时器初始化代码

到cubemx的main.c文件中复制MX_TIM3Init函数到自己创建的驱动文件中。下图中我放到了我的pwm_input.c里,并去掉了static修饰便于在其它文件中调用。

哦,记得TIM_HandleTypeDef htim3;一起复制过去。在末尾打开中断。

 

 

 到此处board.h中的四部已经完成三部了,但是第四步一般cubemx会自动定义,就不用管了。另外第三步的msp中的函数现在rt会自动调用,也不管。

4、写回调

以上硬件定时器配置完成,下面开始码代码。首先在rt的main.c的main函数中调用tim初始化函数。

 

uint16_t PWM_RisingCount;
uint16_t PWM_FallingCount;
float duty;

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{

    if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
    //注意这里为HAL_TIM_ACTIVE_CHANNEL_1而不是TIM_CHANNEL_1
    {
        PWM_RisingCount = HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_1);
        duty = (float)PWM_FallingCount / PWM_RisingCount*100.00;
    }

    if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
    {
        PWM_FallingCount = HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_2);
    }
}

 在回调中计算频率以及占空比,并在while中循环打印数据。

 以上定时器的输入捕获正常使用了。但是如果把TIM换成TIM2或者tim4就傻眼了。我最开始用的TIM4,打开中断后神奇的发现板子卡死了,抓耳挠腮一天后找到问题了。

看下图RTTHREAD在注册定时器设备时注册了TIM3的回调函数,导致如果使用TIM2的话回调函数为空,卡死。如果使用TIM2就照葫芦画瓢就行。