Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread
stm32F4
硬件定时器
基于RT-Thread的STM32F4开发第四讲——硬件定时器更新中断(缺失补齐教程)
1.00
发布于 2025-05-15 10:12:03 浏览:290
订阅该版
[tocm] # 基于RT-Thread的STM32F4开发第四讲——硬件定时器更新中断(缺失补齐教程) --- # 前言 本章是基于RT-Thread studio实现定时器更新中断教程,开发板是正点原子的STM32F4探索者,使用的RT-Thread驱动是5.1.0,使用的是TIM6和TIM7,RT-Thread目前定时器型号大量缺少,所以本章提供添加方案 --- # 一、RT-Thread工程创建 从以前文章得到驱动5.1.0不报错工程,打开cubemx,其他外设配置不多说,定时器配置如下。  生成工程后,打开board.c,按照HAWTIMER注释的4步进行初步的定时器配置。(这里省略了很多细节,因为同前几章都是重复工作,出现了问题,去看一看上文)  然后打开**tim_config.h**,可以看到这里只配置了少许定时器,把我们使用的按相同格式添加上去,我这里添加了TIM6和TIM7。注意tim_irqn指的是中断名,并不是所以定时器都是TIMx_IRQn,具体去cubemx生成的tim.c文件查看。  然后来到**drv_hwtimer.c**  以我图中为例,这部分初始化的定时器的预分配系数、预重装值。可以看出还有是大量定时器不全,不过我们不需要添加,后面有函数更改这些值,初始化就不管。  第253到261句是定时器的中断初始化,包括中断优先级设置,全局中断开启,清除更新中断是能位,使能更新中断。中断优先级按需求更改  这也是设置定时器预分频器,虽有缺失,但不用管  到这一步,是写STM的中断函数与RT-Thread中断回调函数的联系了,有了这些才能使用RT-Thread中断回调函数。这里需要添加缺失定时器的,我这里加入了TIM6和TIM7,还是一样,中断函数名因为有其他外设共用,所以有区别,注意查看。  这是函数`HAL_TIM_PeriodElapsedCallback`内部,HAL_TIM_PeriodElapsedCallback 是 STM32 HAL 库中用于定时器周期中断的回调函数。当定时器的计数器达到预设的自动重载值(ARR)并产生更新事件时,该回调函数会被调用。那这也是至关重要的,那就添加TIM6和TIM7的配置。 最后一句`stm32_hwtimer_init`是初始化,到这整个drv_hwtimer.c函数设置完成,其中的步骤对比cubemx生成的tim.c中的`MX_TIM7_Init`也都有包括,那就代表定时器初始化彻底完成。 目前我的感觉来说,RT-Thread的驱动文件drv_xxxx.c几乎都有信号缺失和配置缺失问题,所以使用一个外设前一定要检查对应的驱动文件。 # 二、HWTIMER工作函数编写 ## 1.hwtimer.c ```c #include "hwtimer.h" #define DBG_TAG "hwtimer" #define DBG_LVL DBG_LOG #include
#define HWTIMER6_NAME "timer6" #define HWTIMER7_NAME "timer7" #define LED0_PIN GET_PIN(F,9) #define LED1_PIN GET_PIN(F,10) rt_hwtimerval_t HWT6_buffer,HWT7_buffer; rt_device_t HWT6_handle,HWT7_handle; void PIN_init(void) { rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT); rt_pin_mode(LED1_PIN, PIN_MODE_OUTPUT); } static rt_err_t hwtimer6_rx_ind(rt_device_t dev,rt_size_t size); static rt_err_t hwtimer7_rx_ind(rt_device_t dev,rt_size_t size); int hwtimer6_init(void) { uint32_t HWT6_freq = 10000; rt_hwtimer_mode_t HWT6_mode = HWTIMER_MODE_PERIOD; rt_err_t HWT6_flag; HWT6_handle = rt_device_find(HWTIMER6_NAME); if(HWT6_handle == RT_NULL){ LOG_D("failed to hwtimer6 find"); return -1; } HWT6_flag = rt_device_open(HWT6_handle, RT_DEVICE_OFLAG_RDWR); if(HWT6_flag != RT_EOK){ LOG_D("failed to hwtimer6 set rx indicate"); return -1; } HWT6_flag = rt_device_set_rx_indicate(HWT6_handle, hwtimer6_rx_ind); if(HWT6_flag != RT_EOK){ LOG_D("failed to hwtimer6 set rx indicate"); return -1; } rt_device_control(HWT6_handle, HWTIMER_CTRL_FREQ_SET, &HWT6_freq); HWT6_flag = rt_device_control(HWT6_handle, HWTIMER_CTRL_MODE_SET, &HWT6_mode); if(HWT6_flag != RT_EOK){ LOG_D("failed to hwtimer6 control set"); return -1; } HWT6_buffer.sec = 0; HWT6_buffer.usec = 100000; HWT6_flag = rt_device_write(HWT6_handle, 0, &HWT6_buffer, sizeof(HWT6_buffer)); if(HWT6_flag == 0){ LOG_D("failed to hwtimer6 write time"); return -1; } LOG_D("hwtimer6 init success"); return 0; } int hwtimer7_init(void) { uint32_t HWT7_freq = 10000; rt_hwtimer_mode_t HWT7_mode = HWTIMER_MODE_PERIOD; rt_err_t HWT7_flag; HWT7_handle = rt_device_find(HWTIMER7_NAME); if(HWT7_handle == RT_NULL){ LOG_D("failed to hwtimer7 find"); return -1; } HWT7_flag = rt_device_open(HWT7_handle, RT_DEVICE_OFLAG_RDWR); if(HWT7_flag != RT_EOK){ LOG_D("failed to hwtimer7 open"); return -1; } HWT7_flag = rt_device_set_rx_indicate(HWT7_handle, hwtimer7_rx_ind); if(HWT7_flag != RT_EOK){ LOG_D("failed to hwtimer7 set rx indicate"); return -1; } rt_device_control(HWT7_handle, HWTIMER_CTRL_FREQ_SET, &HWT7_freq); HWT7_flag = rt_device_control(HWT7_handle, HWTIMER_CTRL_MODE_SET, &HWT7_mode); if(HWT7_flag != RT_EOK){ LOG_D("failed to hwtimer7 control set"); return -1; } HWT7_buffer.sec = 1; HWT7_buffer.usec = 0; HWT7_flag = rt_device_write(HWT7_handle, 0, &HWT7_buffer, sizeof(HWT7_buffer)); if(HWT7_flag == 0){ LOG_D("failed to hwtimer7 write time"); return -1; } LOG_D("hwtimer7 init success"); return 0; } static rt_err_t hwtimer6_rx_ind(rt_device_t dev,rt_size_t size) { static uint8_t pin_flag = 0; if(pin_flag == 0){ rt_pin_write(LED0_PIN, PIN_LOW); rt_pin_write(LED1_PIN, PIN_HIGH); } else{ rt_pin_write(LED1_PIN, PIN_LOW); rt_pin_write(LED0_PIN, PIN_HIGH); } pin_flag ^= 1; return 0; } static rt_err_t hwtimer7_rx_ind(rt_device_t dev,rt_size_t size) { static uint8_t hwt7_ind_flag = 1; hwt7_ind_flag++; HWT6_buffer.sec = 0; HWT6_buffer.usec = 100000 * hwt7_ind_flag; rt_device_write(HWT6_handle, 0, &HWT6_buffer, sizeof(HWT6_buffer)); return 0; } void hwtimer_finsh(int argc, char **argv) { static rt_err_t hwt6_finsh_flag,hwt7_finsh_flag; if(!rt_strcmp(argv[1],"exit")){ hwt6_finsh_flag = rt_device_close(HWT6_handle); hwt7_finsh_flag = rt_device_close(HWT7_handle); } if(hwt6_finsh_flag == RT_EOK && hwt7_finsh_flag == RT_EOK){ LOG_D("hwtimer close success"); } } MSH_CMD_EXPORT_ALIAS(hwtimer_finsh,hwt, hwtimer finsh); ``` 代码内容包括了LED_PIN、TIM6和TIM7初始化,中断回调函数编写,自定义finsh控制命令。代码逻辑就不讲了,去看官方手册很容易理解 ## 2.hwtimer.h ```c #ifndef APP_HWTIMER_H_ #define APP_HWTIMER_H_ #include "board.h" void PIN_init(void); int hwtimer6_init(void); int hwtimer7_init(void); ``` ## 3.mian.c ```c #include
#define DBG_TAG "main" #define DBG_LVL DBG_LOG #include
#include "hwtimer.h" int main(void) { PIN_init(); hwtimer6_init(); hwtimer7_init(); while (1) { rt_thread_mdelay(1000); } return RT_EOK; } ``` # 三、资源分享 通过网盘分享的文件:hardware_time.zip 链接: https://pan.baidu.com/s/1pZ5HWfvKwrldWSonxv5vtg?pwd=k13s 提取码: k13s --- # 总结 效果能完美实现,led1以初始200ms亮灭交替,每过1秒,led1交替时间增加100ms直至1s,此刻是能保持某个灯常亮。需要注意的是,`rt_device_read`读取定时器从计时开始经过的时间,更新中断不会清零时间,`rt_device_write`设置定时器超时值并清零定时器时间开时计时。
1
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
Pai同学
这家伙很懒,什么也没写!
文章
10
回答
1
被采纳
0
关注TA
发私信
相关文章
1
RT-THREAD在STM32H747平台上移植lwip
2
正点原子miniSTM32开发板读写sdcard
3
反馈rtt串口驱动对低功耗串口lpuart1不兼容的问题
4
Keil MDK 移植 RT-Thread Nano
5
RT1061/1052 带 RTT + LWIP和LPSPI,有什么坑要注意吗?
6
RT thread HID 如何收发数据
7
求一份基于RTT系统封装好的STM32F1系列的FLASH操作程序
8
RT-Thread修改项目名称之后不能下载
9
rt-studio编译c++
10
有木有移植rt-thread(nano)到riscv 32位MCU上
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
6
五分钟玩转RT-Thread新社区
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
Bootloader
AT
Hardfault
CAN总线
ART-Pi
FinSH
DMA
USB
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
FAL
RTC
rt-smart
I2C_IIC
UART
cubemx
BSP
ESP8266
PWM
ota在线升级
WIZnet_W5500
packages_软件包
flash
freemodbus
GD32
潘多拉开发板_Pandora
ADC
编译报错
keil_MDK
定时器
flashDB
ulog
socket
rt_mq_消息队列_msg_queue
msh
中断
Debug
SFUD
C++_cpp
at_device
本月问答贡献
踩姑娘的小蘑菇
6
个答案
3
次被采纳
加缪
9
个答案
1
次被采纳
RTT_逍遥
5
个答案
1
次被采纳
用户名由3_15位
5
个答案
1
次被采纳
Ryan_CW
4
个答案
1
次被采纳
本月文章贡献
纯白酱
2
篇文章
3
次点赞
530china
1
篇文章
7
次点赞
rv666
1
篇文章
7
次点赞
踩姑娘的小蘑菇
1
篇文章
3
次点赞
Lipiah
1
篇文章
3
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部