硬件定时器

  • 问题
    • 在rt编程手册中的时钟管理与HWTIME设备
      • 不同点
    • 使用步骤:
    • 总结
  • rt定时器设备框架
    • 基本的处理流程
      • 初始化
      • 控制
      • 总结

 看了一下之前做的rtt笔记,还真没有做这部分的内容,看来当初没看这部分。

问题

在rt编程手册中的时钟管理与HWTIME设备

两者都实现定时器有什么不同???如何合理使用两者呢???

不同点

时钟管理的HARDTIME模式是通过使用定时器的时钟,一般的就是硬件systick,控制rt_tick,实现计时。rt_tick是系统的时间节拍。超时回调函数在中断处理程序中进行调用。而使用软件定时器,回调函数则会在timer线程中。软件定时器模式,受限于系统节拍。
由于系统节拍是OS运行的基础,所以就要兼顾高低速的设备及应用,这个值一般是MS级别。ns级别太快,会导到系统不停的切换任务,造成效率不高。
此部的应用场景,就是跟随rt-tick级别的定时需求。若是要更快级别的定时器,还要使用真正的硬件定时器。

hwtim是把硬件定时器当成是设备来处理的。也是实现定时。但可以实现更快或更慢的定时。也不再受rt-tick的局限。同时,还是随时读取定时器当前值。

使用步骤:

  1. 使用CubxMX配置一下定时器,生成相应的代码,使之启用HAL库的time组件。
  2. 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
  1. 使用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了。如下图所示:

  1. 可以将官方给出的例子程序执行一下,如下图所示:5s后打印当前定时器的值

总结

基本按照官方给出的例子,走了一遍流程!官方给出的只是一个最简单的定时例子,关于定时器的其他功能,还要自己研究和开发。

rt定时器设备框架

这个基本没变,延用就是linux风格的rt管理框架,如下图所示:

基本的处理流程

初始化

  1. 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) //完成了注册

  2. 注册到OS的设备管理层
    上步最终通过rt_device_register(),注册到了OS设备管理层,注册只是注册了名称,主要是名称,还有一些特有如中断类型,这个压根就没定义,因此也为void *.

  3. 当应用层执行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文件中)。

  4. 这个函数,可以来说相当重要,这就是普通硬件配置time,完成分频、中断优先级等配置。并调用了HAL_TIM_Base_Init(tim)(位于stm32l4xx_hal_tim.c中)间接调用了HAL_TIM_Base_MspInit()函数(位于stm32l4xx_hal_msp.c,这个就是由cubemx自动生成的tims时钟配置)启动time时钟。从而完成了底层的初始化的调用。

控制

  1. 应用层执行rt_device_control()(此文件位于kernel文件夹中的device.c文件中)函数时,会调用设备管理层里的device_control(dev, cmd, arg);//实际上为一个指针,指向驱动框架层的控制函数

  2. 跳到设备驱动框架层的hwtimer.c文件中函数rt_hwtimer_control()中,根据相关的控制命令,会执行驱动层的rt_err_t timer_ctrl()(位于drv_hwtimer.c文件中)函数,从而实现控制设置。

总结

不多说,其他的相关操作,也是通过这个思路,一层层往下调用。

RTT之硬件定时器使用相关推荐

  1. ESP8266-SDK的硬件定时器

    ESP8266的硬件定时器的使用也比较简单 1.设置定时器的时钟源和自动重装载 hw_timer_init(FRC1_SOURCE, 1);//设置时钟源 和定时器自动重装载 时钟源有两个 NMI 中 ...

  2. ESP32-C3入门教程 基础篇(六、TIMG 硬件定时器 与 软件定时器)

    到了测试第6课,还没有玩过ESP32-C3的基本定时器,虽然FreeRTOS,可以使用软件定时器 但是软件定时器毕竟也有不适用的时候,这个在我FreeRTOS博文中有单独说明. 所以硬件定时器也得熟悉 ...

  3. am335x硬件定时器使用

    在使用am335x硬件定时器的时候,需要操作物理地址,如果直接按照裸跑时操作寄存器的话会报错,Unable to handle kernel paging request at virtual add ...

  4. 基于硬件定时器的软件定时器

    概括 硬件定时器很精确,软件定时器无论如何都有延迟,主要用在不需要精确定时的地方,而且软件定时比较浪费单片机资源. 梳理 讲到定时器,大家多多少少都会接触到硬件定时器,但是由于有时候资源的限制,又难免 ...

  5. FreeRTOS记录(八、用软件定时器?还是硬件定时器?)

    FreeRTOS软件定时器,相对前面的内容来说,软件定时器还是比较简单的,我们简单测试一下 因为是简单介绍,所以原理和源码的分析不会那么详细,具体可以根据文中API查看源码 使用起来记住创建,启动,回 ...

  6. AM574x硬件定时器

    由于任务需要精准定时,项目中决定开启am574x的硬件定时器.根据am5748的TRM手册可知,am5748提供16个GP timers:TIMER1-TIMER16.其中,TIMER1,TIMER2 ...

  7. 延时函数:普通延时,硬件定时器延时,系统定时器延时

    一.普通延时函数 此种延时是基于让MCU做一些无意义的循环操作来打发时间,优点是简单易懂,缺点是会占用MCU的处理资源且精度较低,主要用于程序简单.无严格时间要求的场景中. //微秒级的延时 void ...

  8. rtthread studio与正点原子apollo(3)--硬件定时器HTIMER

    rtthread studio与正点原子apollo[3]--硬件定时器HTIMER 前言 一.软件定时器和硬件定时器? 二.HTIMER使用详解 1.RT-Thread studio配置 2.功能代 ...

  9. 【龙芯1c库】封装硬件定时器接口和使用示例

    龙芯1c库是把龙芯1c的常用外设的常用功能封装为一个库,类似于STM32库.完整源码请移步到https://gitee.com/caogos/OpenLoongsonLib1c 龙芯1c库中硬件定时器 ...

最新文章

  1. matlab中基本函数的用法
  2. php post 二维数组,php curl模拟post请求和提交多维数组的示例代码
  3. js 高级 call()
  4. vb 6.0 获取重定向的url_免费CloudFlare CDN真香,个人站点加速+Https证书+重定向
  5. GitLab的CICD配置文件.gitlab-ci.yml
  6. python语言中有3种表示字符串的方式、单引号和_Python中三种类型的引号(单引号、双引号、三引号)...
  7. 集美大学计算机工程学院 曾勇进,电子政务评估方法AHP 的研究及实现.pdf
  8. Java程序员常用软件
  9. 容器云系列之Docker容器监控cAdvisor
  10. python二叉树的非递归遍历
  11. 2021年全球氨基酸表面活性剂市场规模大约为47亿元(人民币),预计2028年将达到105亿元
  12. Python学习笔记(三)(图灵学院)
  13. javaFx实现直尺效果——可旋转、拖动、拉长
  14. 微信公众号自定义分享实现(开发者)
  15. 数据分析师的岗位要求和工作流程
  16. C/C++编程:实现hash函数
  17. 微信小程序云开发教程-互联网软件产品开发流程和团队分工
  18. html修改当前窗口大小,设置HTML页面和浏览器窗口的大小
  19. 新手初步了解Axure
  20. 【P25】JMeter 取样器超时(Sample Timeout)

热门文章

  1. 一个敏感词检查功能是怎么来的
  2. 什么是天翼企业云盘?天翼企业云盘如何收费
  3. ABP框架初始化数据(自定义)
  4. 第二代计算机网络的贡献,在第二代计算机上,有操作系统支持其运行。
  5. 一个时间字段引发的血案
  6. 七彩cms云转码_云转码+cms一体化自适应自动发布系统
  7. MultipartFile格式转File
  8. 通过修改 DOM 的文本内容,动态改变网页的内容。
  9. 海洋地球物理十年个人总结
  10. DE2-115驱动问题