RTT之硬件定时器使用
硬件定时器
- 问题
- 在rt编程手册中的时钟管理与HWTIME设备
- 不同点
- 使用步骤:
- 总结
- rt定时器设备框架
- 基本的处理流程
- 初始化
- 控制
- 总结
看了一下之前做的rtt笔记,还真没有做这部分的内容,看来当初没看这部分。
问题
在rt编程手册中的时钟管理与HWTIME设备
两者都实现定时器有什么不同???如何合理使用两者呢???
不同点
时钟管理的HARDTIME模式是通过使用定时器的时钟,一般的就是硬件systick,控制rt_tick,实现计时。rt_tick是系统的时间节拍。超时回调函数在中断处理程序中进行调用。而使用软件定时器,回调函数则会在timer线程中。软件定时器模式,受限于系统节拍。
由于系统节拍是OS运行的基础,所以就要兼顾高低速的设备及应用,这个值一般是MS级别。ns级别太快,会导到系统不停的切换任务,造成效率不高。
此部的应用场景,就是跟随rt-tick级别的定时需求。若是要更快级别的定时器,还要使用真正的硬件定时器。
hwtim是把硬件定时器当成是设备来处理的。也是实现定时。但可以实现更快或更慢的定时。也不再受rt-tick的局限。同时,还是随时读取定时器当前值。
使用步骤:
- 使用CubxMX配置一下定时器,生成相应的代码,使之启用HAL库的time组件。
- board文件夹下,修改kconfig文件,添加TIM开启选项代码如下所示:
menuconfig BSP_USING_TIMbool "Enable timer"default nselect RT_USING_HWTIMERif BSP_USING_TIMconfig BSP_USING_TIM1bool "Enable TIM1"default nconfig BSP_USING_TIM2bool "Enable TIM2"default nconfig BSP_USING_TIM15bool "Enable TIM15"default nendif
- 使用ENV工具配置,开启TIM.如下图所示:
重新生成一下工程。
4. 在tim_config.h文件(路径为:…\libraries\HAL_Drivers\config\l4)中添加tim1的配置。这步一定要根据在CUBmx配置写。如下图所示:
中断入口名一定要填对,可通过startup_stm32l431xx.s验证。一般的路径为:…\libraries\STM32L4xx_HAL\CMSIS\Device\ST\STM32L4xx\Source\Templates\arm\startup_stm32l431xx.s
或是stm32l4xx_hal.c文件路径为:…\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal.c
当然最简单的办法是看一下,CUBMX自动生成的中断it文件。
5. 编译整体的工程,成功后可以看到shell能成功打印出time1的设备。接下来就可以操作time1了。如下图所示:
- 可以将官方给出的例子程序执行一下,如下图所示:5s后打印当前定时器的值
总结
基本按照官方给出的例子,走了一遍流程!官方给出的只是一个最简单的定时例子,关于定时器的其他功能,还要自己研究和开发。
rt定时器设备框架
这个基本没变,延用就是linux风格的rt管理框架,如下图所示:
基本的处理流程
初始化
drv_hwtimer.c 中static int stm32_hwtimer_init(void)完成定时器初始化,并完成自动注册INIT_BOARD_EXPORT(stm32_hwtimer_init);
stm32_hwtimer_init完成了两件事。
stm32_hwtimer_obj[i].time_device.info = &_info;//定时器最大、最小频率、上升模式信息
stm32_hwtimer_obj[i].time_device.ops = &_ops;//定时时间的控制、开始、停止、定时器当前值的获取回调函数地址
rt_device_hwtimer_register(&stm32_hwtimer_obj[i].time_device, stm32_hwtimer_obj[i].name, &stm32_hwtimer_obj[i].tim_handle) //完成了注册
注册到OS的设备管理层
上步最终通过rt_device_register(),注册到了OS设备管理层,注册只是注册了名称,主要是名称,还有一些特有如中断类型,这个压根就没定义,因此也为void *.当应用层执行rt_device_open()时会初始化,调用rt_hwtimer_init()(位于hwtimer.c文件中),这是默认的初始化函数。又调用驱动层的timer->ops->init(timer, 1);也就是static void timer_init(struct rt_hwtimer_device *timer, rt_uint32_t state)函数(位于drv_hwtimer.c文件中)。
这个函数,可以来说相当重要,这就是普通硬件配置time,完成分频、中断优先级等配置。并调用了HAL_TIM_Base_Init(tim)(位于stm32l4xx_hal_tim.c中)间接调用了HAL_TIM_Base_MspInit()函数(位于stm32l4xx_hal_msp.c,这个就是由cubemx自动生成的tims时钟配置)启动time时钟。从而完成了底层的初始化的调用。
控制
应用层执行rt_device_control()(此文件位于kernel文件夹中的device.c文件中)函数时,会调用设备管理层里的
device_control(dev, cmd, arg);//实际上为一个指针,指向驱动框架层的控制函数
跳到设备驱动框架层的hwtimer.c文件中函数rt_hwtimer_control()中,根据相关的控制命令,会执行驱动层的rt_err_t timer_ctrl()(位于drv_hwtimer.c文件中)函数,从而实现控制设置。
总结
不多说,其他的相关操作,也是通过这个思路,一层层往下调用。
RTT之硬件定时器使用相关推荐
- ESP8266-SDK的硬件定时器
ESP8266的硬件定时器的使用也比较简单 1.设置定时器的时钟源和自动重装载 hw_timer_init(FRC1_SOURCE, 1);//设置时钟源 和定时器自动重装载 时钟源有两个 NMI 中 ...
- ESP32-C3入门教程 基础篇(六、TIMG 硬件定时器 与 软件定时器)
到了测试第6课,还没有玩过ESP32-C3的基本定时器,虽然FreeRTOS,可以使用软件定时器 但是软件定时器毕竟也有不适用的时候,这个在我FreeRTOS博文中有单独说明. 所以硬件定时器也得熟悉 ...
- am335x硬件定时器使用
在使用am335x硬件定时器的时候,需要操作物理地址,如果直接按照裸跑时操作寄存器的话会报错,Unable to handle kernel paging request at virtual add ...
- 基于硬件定时器的软件定时器
概括 硬件定时器很精确,软件定时器无论如何都有延迟,主要用在不需要精确定时的地方,而且软件定时比较浪费单片机资源. 梳理 讲到定时器,大家多多少少都会接触到硬件定时器,但是由于有时候资源的限制,又难免 ...
- FreeRTOS记录(八、用软件定时器?还是硬件定时器?)
FreeRTOS软件定时器,相对前面的内容来说,软件定时器还是比较简单的,我们简单测试一下 因为是简单介绍,所以原理和源码的分析不会那么详细,具体可以根据文中API查看源码 使用起来记住创建,启动,回 ...
- AM574x硬件定时器
由于任务需要精准定时,项目中决定开启am574x的硬件定时器.根据am5748的TRM手册可知,am5748提供16个GP timers:TIMER1-TIMER16.其中,TIMER1,TIMER2 ...
- 延时函数:普通延时,硬件定时器延时,系统定时器延时
一.普通延时函数 此种延时是基于让MCU做一些无意义的循环操作来打发时间,优点是简单易懂,缺点是会占用MCU的处理资源且精度较低,主要用于程序简单.无严格时间要求的场景中. //微秒级的延时 void ...
- rtthread studio与正点原子apollo(3)--硬件定时器HTIMER
rtthread studio与正点原子apollo[3]--硬件定时器HTIMER 前言 一.软件定时器和硬件定时器? 二.HTIMER使用详解 1.RT-Thread studio配置 2.功能代 ...
- 【龙芯1c库】封装硬件定时器接口和使用示例
龙芯1c库是把龙芯1c的常用外设的常用功能封装为一个库,类似于STM32库.完整源码请移步到https://gitee.com/caogos/OpenLoongsonLib1c 龙芯1c库中硬件定时器 ...
最新文章
- matlab中基本函数的用法
- php post 二维数组,php curl模拟post请求和提交多维数组的示例代码
- js 高级 call()
- vb 6.0 获取重定向的url_免费CloudFlare CDN真香,个人站点加速+Https证书+重定向
- GitLab的CICD配置文件.gitlab-ci.yml
- python语言中有3种表示字符串的方式、单引号和_Python中三种类型的引号(单引号、双引号、三引号)...
- 集美大学计算机工程学院 曾勇进,电子政务评估方法AHP 的研究及实现.pdf
- Java程序员常用软件
- 容器云系列之Docker容器监控cAdvisor
- python二叉树的非递归遍历
- 2021年全球氨基酸表面活性剂市场规模大约为47亿元(人民币),预计2028年将达到105亿元
- Python学习笔记(三)(图灵学院)
- javaFx实现直尺效果——可旋转、拖动、拉长
- 微信公众号自定义分享实现(开发者)
- 数据分析师的岗位要求和工作流程
- C/C++编程:实现hash函数
- 微信小程序云开发教程-互联网软件产品开发流程和团队分工
- html修改当前窗口大小,设置HTML页面和浏览器窗口的大小
- 新手初步了解Axure
- 【P25】JMeter 取样器超时(Sample Timeout)