Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
timer
HWTIMER_硬件定时器
rt-thread使用hwtimer不工作的问题
发布于 2025-02-27 13:46:31 浏览:22
订阅该版
使用hwtimer可以提高定时精度和us级定时,配合回调函数和信号量也不用担心系统自带的us延迟函数 `void rt_hw_us_delay(rt_uint32_t us)`造成的阻塞问题 芯片:stm32g070 使用hwtimer需要改动的地方如下 1. board.h中打开timer的相关宏定义,比如使用timer15就打开 2. board.c中添加对应timer的HAL_TIM_Base_MspInit();初始化函数,实际就是打开定时器的时钟 3. drivers下stm32g0xx_hal_conf.h中打开#define HAL_TIM_MODULE_ENABLED 4. tim_config.h中添加定时器的默认配置 ```c //board.h#define BSP_USING_TIM #ifdef BSP_USING_TIM #define BSP_USING_TIM15 /*#define BSP_USING_TIM16*/ /*#define BSP_USING_TIM17*/ #endif ``` ```c //tim_config.h#ifdef BSP_USING_TIM15 #ifndef TIM15_CONFIG #define TIM15_CONFIG \ { \ .tim_handle.Instance = TIM15, \ .tim_irqn = TIM15_IRQn, \ .name = "timer15", \ } #endif /* TIM15_CONFIG */ #endif /* BSP_USING_TIM15 */ ``` ```c //tim_config.h#ifdef BSP_USING_TIM15 #ifndef TIM15_CONFIG #define TIM15_CONFIG \ { \ .tim_handle.Instance = TIM15, \ .tim_irqn = TIM15_IRQn, \ .name = "timer15", \ } #endif /* TIM15_CONFIG */ #endif /* BSP_USING_TIM15 */ ``` **问题现象和解决** 根据例程添加hwtimer组件和相关驱动代码的完善后发现启动定时器后无法进入回调函数 问题原因:timer的中断函数名不对 原来的代码如下 drv_hwtimer.c中 TIM1_BRK_TIM15_IRQHandler是错误的 ```c #ifdef BSP_USING_TIM15 void TIM1_BRK_TIM15_IRQHandler(void) { /* enter interrupt */ rt_interrupt_enter(); HAL_TIM_IRQHandler(&stm32_hwtimer_obj[TIM15_INDEX].tim_handle); /* leave interrupt */ rt_interrupt_leave(); } #endif ``` 应该改为TIM15_IRQHandler,如下 ```c void TIM15_IRQHandler(void) { /* enter interrupt */ rt_interrupt_enter(); HAL_TIM_IRQHandler(&stm32_hwtimer_obj[TIM15_INDEX].tim_handle); /* leave interrupt */ rt_interrupt_leave(); } ``` 利用hwtimer实现精确定时 ```c #define HWTIMER_DEV_NAME "timer15" /* 定时器名称 */ rt_sem_t tim_sem; rt_device_t tim_dev = RT_NULL; /* 定时器设备句柄 */ static rt_err_t timeout_cb(rt_device_t dev, rt_size_t size); int tim_init(void) { /* 初始化信号量*/ tim_sem = rt_sem_create("timer", 0, RT_IPC_FLAG_FIFO); if (tim_sem == RT_NULL) { LOG_E("init tim_sem failed.\n"); } /* 查找定时器设备 */ tim_dev = rt_device_find(HWTIMER_DEV_NAME); if (tim_dev == RT_NULL) { rt_kprintf("can't find %s device!\n", HWTIMER_DEV_NAME); return RT_ERROR; } /* 以读写方式打开设备 */ ret = rt_device_open(tim_dev, RT_DEVICE_OFLAG_RDWR); if (ret != RT_EOK) { rt_kprintf("open %s device failed!\n", HWTIMER_DEV_NAME); return ret; } /* 设置超时回调函数 */ rt_device_set_rx_indicate(tim_dev, timeout_cb); #if 0 //默认配置就行,无需配置 /* 设置计数频率(若未设置该项,默认为1Mhz 或 支持的最小计数频率) */ rt_device_control(tim_dev, HWTIMER_CTRL_FREQ_SET, &freq); /* 设置模式为周期性定时器(若未设置,默认是HWTIMER_MODE_ONESHOT)*/ mode = HWTIMER_MODE_ONESHOT; ret = rt_device_control(tim_dev, HWTIMER_CTRL_MODE_SET, &mode); if (ret != RT_EOK) { rt_kprintf("set mode failed! ret is :%d\n", ret); return ret; } #endif return 0; } //回调 static rt_err_t timeout_cb(rt_device_t dev, rt_size_t size) { rt_sem_release(tim_sem); return RT_EOK; } void hwtimer_delay_us(uint32_t us) { rt_hwtimerval_t timeout_s; /* 定时器超时值 */ /* 设置定时器超时值并启动定时器 */ timeout_s.sec = 0; /* 秒 */ timeout_s.usec = us; /* 微秒 */ rt_sem_control(tim_sem, RT_IPC_CMD_RESET, RT_NULL); if (rt_device_write(tim_dev, 0, &timeout_s, sizeof(timeout_s)) != sizeof(timeout_s)) { //rt_kprintf("set timeout value failed\n"); return ; } rt_sem_take(tim_sem, RT_WAITING_FOREVER); } ```
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
arthurly888
这家伙很懒,什么也没写!
文章
5
回答
0
被采纳
0
关注TA
发私信
相关文章
1
不同的pwm能否使用同一个timer的不同channel?
2
硬件定时器的问题咨询
3
hard fault on thread: timer
4
NANO移植finsh会导致启动时卡死在rt_object_init
5
rt_timer_start 链表死循环
6
定时器 rt_timer_init 里超时时间无效
7
timer文件的源码分析
8
定时器API bug反馈
9
关于RT-Thread中的软定时器使用疑问请教
10
rt_timer_detach脱离定时器后,定时器还在执行
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
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
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
DMA
USB
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
rt-smart
FAL
I2C_IIC
UART
ESP8266
cubemx
WIZnet_W5500
ota在线升级
PWM
BSP
flash
freemodbus
packages_软件包
潘多拉开发板_Pandora
定时器
GD32
ADC
flashDB
编译报错
socket
中断
Debug
rt_mq_消息队列_msg_queue
keil_MDK
ulog
SFUD
msh
C++_cpp
MicroPython
本月问答贡献
RTT_逍遥
12
个答案
3
次被采纳
踩姑娘的小蘑菇
7
个答案
3
次被采纳
xiaorui
3
个答案
3
次被采纳
winfeng
2
个答案
2
次被采纳
三世执戟
12
个答案
1
次被采纳
本月文章贡献
arthurly888
5
篇文章
2
次点赞
catcatbing
3
篇文章
5
次点赞
jinchanchan
3
篇文章
4
次点赞
lizimu
2
篇文章
9
次点赞
alight
1
篇文章
5
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部