基于RT-THREAD STM32F429IGT6 BSP的HWTIMER设备应用
硬件平台:野火STM32挑战者 MCU:STM32F429IGT6
开发工具:
- MDK Version:5.25
- VSCode
- env
- STM32CubeMX Version:5.2.1
- rt-thread源码 Version:4.0.1
工具获取
说明:
这次先介绍下HWTIMER设备
(硬件定时器设备)的操作方法,然后一步一步完成HWTIMER设备的BSP过程。
该BSP主要实现使用HWTIMER设备管理接口
来定时(定时器TIM4
),同时使用信号量
传递消息,当定时器时间到时,释放一次信号量;线程获得信号量以后蜂鸣器发出“滴”声,其中蜂鸣器硬件图下图:
ADC设备的操作方法
应用程序通过RT-Thred提供的I/O设备管理接口操作hwtimer设备
,相关函数接口如下表:
方法名称 | 方法描述 |
---|---|
rt_device_find() | 根据 定时器 设备名称查找设备获取设备句柄 |
rt_device_open() | 根据 以读写方式打开定时器 RT_DEVICE_FLAG_RDWR |
rt_device_set_rx_indicate() | 设置超时回调函数 |
rt_device_control() | 控制定时器设备,可以设置定时模式(单次/周期)/计数频率,或者停止定时器 |
rt_device_write() | 设置定时器超时值,定时器随即启动 |
rt_device_read() | 获取定时器当前值 |
rt_device_close() | 关闭定时器设备 |
1. 查找HWTIMER设备
在使用HWTIMER设备之前需要先查找HWTIMER设备句柄,通过下面函数完成:
rt_device_t rt_device_find(const char* name);
参数 | 描述 |
---|---|
name | HWTIMER设备名字 |
返回 | 描述 |
设备句柄 | 无查找到正确的设备后返回对应的设备句柄 |
RT_NULL | 没有查找到设备 |
根据 rt-thread 设备注册格式,一般注册到设备块的 adc 设备名字为timer0
、timer1
等等。找到了该设备也就是打开了设备
2. 使能HWTIMER设备
跟我们前面使用其他设备一样,具体操作之前都得先使能,使能HWTIMER设备用如下函数完成:
rt_err_t rt_device_open(rt_device_t dev, rt_uint16_t oflags);
参数 | 描述 |
---|---|
dev | HWTIMER设备句柄 |
oflags | HWTIMER设备使能方式: RT_DEVICE_OFLAG_RDWR (读写方式) |
返回 | 描述 |
RT_EOK | 使能成功 |
其他值 | 使能失败 |
3. 设置HWTIMER设备超时回调函数
读取HWTIMER设备超时回调函数使用如下函数完成:
rt_err_t rt_device_set_rx_indicate(rt_device_t dev, rt_err_t (*rx_ind)(rt_device_t dev,rt_size_t size))
参数 | 描述 |
---|---|
dev | HWTIMER设备句柄 |
rt_ind | 超时回调函数,由用户提供 |
返回 | 描述 |
RT_EOK | 设置成功 |
4. 控制HWTIMER设备
定时器设备的计数频率
(定时时间=计数值/计数频率)以及定时模式
(单次定时:HWTIMER_MODE_ONESHOT,还是周期定时:HWTIMER_MODE_PERIOD)由如下函数完成:
rt_err_t rt_device_control(rt_device_t dev, rt_uint8_t cmd, void* arg);
参数 | 描述 |
---|---|
dev | HWTIMER设备句柄 |
cmd | 计数频率设置还是定时模式设置命令字 ,见表4 |
arg | 计数频率或者定时模式的参数 |
返回 | 描述 |
RT_EOK | 关闭成功 |
-RT_ENOSYS | 关闭失败,设备操作方法为空 |
其他值 | 关闭失败 |
参数 | 描述 |
---|---|
HWTIMER_CTRL_FREQ_SET | 设置计数频率 |
HWTIMER_CTRL_STOP | 停止定时器 |
HWTIMER_CTRL_INFO_GET | 获取定时器特征信息 |
HWTIMER_CTRL_MODE_SET | 设置定时器模式 |
5. 设置HWTIMER设备的超时值
定时器设备的超时值(即定时时间)由如下函数完成:
rt_size_t rt_device_write(rt_device_t dev, rt_off_t pos, const void* buffer, rt_size_t size);
该函数设置完之后,定时器变立即启动。
参数 | 描述 |
---|---|
dev | HWTIMER设备句柄 |
pos | 定时时间偏移量,一般不使用,为0 |
buffer | 指向定时器的超时时间结构体的指针 |
size | 超时时间结构体的大小 |
返回 | 描述 |