0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

RT-Thread设备驱动开发指南基础篇—以先楫bsp的hwtimer设备为例

RTThread物联网操作系统 来源:RCSN嵌入式 2024-02-20 16:01 次阅读

一、概述

(一)RT-Thread设备驱动

RT-Thread设备驱动开发指南》书籍是RT-thread官方出品撰写,系统讲解RT-thread IO设备驱动开发方法,从三方面进行讲解。

基础篇:对RT-thread以及设备框架进行介绍,再分别介绍基于IO框架中常用的外设设备,分别是UARTPIN、SPI/QSPI、HWTIMER、PWM、RTC、ADCDAC、WDT。

进阶篇:介绍基于IO框架中稍比基础篇复杂的外设设备,分别是SDIO、Touch、LCD、sensor、MTD nor、MTD nand、脉冲编码器、加解密设备、PM设备。

高级篇:介绍更为复杂的外设设备,分别是WLAN、ETH、audio mic、audio sound、USBCAN

(二)先楫hpmicro bsp

为了深入了解本书的内容,得有一个单片机平台进行案例剖析,除了本书籍以STM32arm平台进行介绍,还可以以先楫hpmicro单片机系列的riscv平台进行讲解。

刚好先楫在rtthread的bsp贡献上,也是十分丰富。无论是在rtthread studio的bsp包上,还是rtthread仓库的bsp支持上,都有提供了对应的支持。

rtthread studio的SDK支持,包括了先楫目前所有的MCU系列。

d8dc6370-cfc5-11ee-a297-92fbcf53809c.png

而在RT-Thread上,bsp包的驱动支持上,也包括了rtthread大部分设备驱动。

d8f1876e-cfc5-11ee-a297-92fbcf53809c.png

二、开发方法

(一)层级结构

RT-Thread 提供了一套简单的 I/O 设备模型框架,如下图所示,它位于硬件和应用程序之间,共分成三层,从上到下分别是 I/O 设备管理层、设备驱动框架层、设备驱动层。

d909bfaa-cfc5-11ee-a297-92fbcf53809c.png

而作为单片机的定时器外设hwtimer功能,要对接到该IO设备框架,需要实现hwtimer设备的操作方法、设备的注册、以及驱动的配置和驱动验证。本文也是基于该开发方法进行阐述。

上述对应的三层驱动层,在源码上,可以device->hwtimer->drv_hwtimer,其中drv_hwtimer是先楫官方实现的对接框架的驱动层。

d90d8874-cfc5-11ee-a297-92fbcf53809c.png

而设备驱动框架层,提供了ops操作接口,分别以下的接口需要驱动开发者实现注册。

d9191676-cfc5-11ee-a297-92fbcf53809c.png

(二)创建hwtimer设备

对hwtimer设备来说,在驱动开发时,需要先从rt_hwtimer_t结构中派生出新的hwtimer设备模型,然后根据自己的设备类型定义私有数据域。

同样先楫的hwtimer drivers也定义了自己的由rt_hwtimer_t派生出来的hwtimer设备。

d91d7220-cfc5-11ee-a297-92fbcf53809c.png

当然一个MCU也支持多个hwtimer,一个hwtimer驱动可以支持多个hwtimer设备,可以通过使能BSP_USING_GPTMRx进行开启

d921175e-cfc5-11ee-a297-92fbcf53809c.png

(三)实现hwtimer设备的操作方法

该操作方法就是上述所说的ops操作结构,属于驱动共用部分,也就是多个hwtimer设备可以共用一个ops操作。同样先楫也实现了该操作方法,并且注册到自身的hwtimer的父类hwtimer的ops中。

d92769c4-cfc5-11ee-a297-92fbcf53809c.png

d9353e32-cfc5-11ee-a297-92fbcf53809c.png

简单举例个操作方法的实现,比如获取设备当前值count_get,原型如下:

rt_uint32_t (*count_get)(struct rt_hwtimer_device *timer);

而先楫实现的count_get是以上的hpm_hwtimer_count_get,可以看到,内部是先从timer获取厂家自身定义的hwtimer设备,再从里面获取硬件定时器的基地址控制句柄,然后使用先楫自身的驱动API获取定时器的计数值进行返回。

d938b684-cfc5-11ee-a297-92fbcf53809c.png

(四)注册hwtimer设备

注册hwtimer设备,rtthread的IO设备框架提供了一个API:rt_device_hwtimer_register

d93c4132-cfc5-11ee-a297-92fbcf53809c.png

从传参句柄可知道,注册时需要提供设备句柄timer,设备名称name,用户自定义data作为传参。

在先楫的drv_hwtimer的驱动中,创建了个全局的hwtimer设备数组,里面包含了hwtimer的所有信息,包括设备名称。然后在注册初始化当中,轮询该数组使能的定时器设备依次注册到rtthread的hwtimer设备当中。

d949363a-cfc5-11ee-a297-92fbcf53809c.png

在开发指南当中,特别提到了一个注意点,hwtimer设备句柄需要实现rt_hwtimer_info,定义硬件定时器的特征信息,如计数的最大最小频率,最大计数值以及计数方向,而先楫也同样进行了实现。

d96632ee-cfc5-11ee-a297-92fbcf53809c.png

(五)hwtimer设备中断处理

在开发指南中,该部分也需要实现,目的是将定时时间导致的中断事件通知到hwtimer设备驱动框架,让驱动框架完成后续的处理并通知应用层。而该通知事件API则是rt_device_hwtimer_isr,该函数由rtthread的hwtimer设备驱动框架提供。

d96a84c0-cfc5-11ee-a297-92fbcf53809c.png

MCU下的hwtimer驱动,需要在中断处理函数调用rt_device_hwtimer_isr函数,以便通知hwtimer设备驱动框架对应中断的发生。

在先楫的hwtimer驱动中也是基于这个实现通知事件。

d97a123c-cfc5-11ee-a297-92fbcf53809c.png

从以上代码可知,hpmicro实现的hwtimer设备驱动接管了定时器的通用中断服务函数hpm_hwtmr_isr,然后内部调用了rtthread的hwtimer设备驱动框架提供的rt_device_hwtimer_isr中断处理函数,通知设备框架对应的定时器定时时间到达。

(六)驱动配置

1、Kconfig配置

驱动配置主要通过Kconfig实现,这里使用hpm6750evk2的bsp V1.4.1作为说明。

在board文件夹中,有个Kconfig配置了hpm6750evk2的板载驱动信息。对于定时器驱动的相关选项如下:

d97e96cc-cfc5-11ee-a297-92fbcf53809c.png

RT_USING_HWTIMER:RT-thread的hwtimer设备驱动框架下的代码对应的宏定义,控制hwtimer的驱动框架的相关代码是否会添加到工程中

BSP_USING_GPTMR:先楫的hwtimer驱动下的代码对应的宏定义,控制先楫的hwtimer驱动是否会添加到工程中

BSP_USING_GPTMR1: 使用先楫的定时器1

2、SConscript配置

libraries/drivers/SConscript文件为hwtimer驱动添加判断选项,如果定义了BSP_USING_GPTMR,则对应的驱动文件drv_hwtimer就会被添加到工程的源文件中。

d9822aee-cfc5-11ee-a297-92fbcf53809c.png

三、驱动验证

使用hpm6750evk2的bsp V1.4.1作为说明,新建timer_demo的示例工程。

d98f8d1a-cfc5-11ee-a297-92fbcf53809c.png

编译烧录代码,使用list_device查看设备,可以看到注册的设备已经包含了hwtimer这个设备。

d994fb42-cfc5-11ee-a297-92fbcf53809c.png

运行自带的shell命令hwtimer_sample,该命令会运行5s的定时,查看readme文档

d99898e2-cfc5-11ee-a297-92fbcf53809c.png

d99cce6c-cfc5-11ee-a297-92fbcf53809c.png

四、总结

1、基础篇包含UART、PIN、SPI/QSPI、HWTIMER、PWM、RTC、ADC、DAC、WDT这些外设,本文以先楫适配的HWTIMER驱动进行说明,能感受到先楫对于rtthread驱动适配的完整性。

2、除了本文阐述的外设,其他基础外设同样适配完整。

d9adee2c-cfc5-11ee-a297-92fbcf53809c.png




审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • WLAN
    +关注

    关注

    2

    文章

    657

    浏览量

    73081
  • 中断处理
    +关注

    关注

    0

    文章

    94

    浏览量

    10967
  • PWM波
    +关注

    关注

    0

    文章

    99

    浏览量

    16854
  • RT-Thread
    +关注

    关注

    31

    文章

    1285

    浏览量

    40058
  • 脉冲编码器
    +关注

    关注

    0

    文章

    13

    浏览量

    8249

原文标题:RT-Thread设备驱动开发指南基础篇——以先楫bsp的hwtimer设备为例

文章出处:【微信号:RTThread,微信公众号:RTThread物联网操作系统】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    RT-Thread使用未默认启用的timer作为硬件定时器HWTIMER的步骤

    初学 RT-Thread,在 RT-Thread studio 环境下,使用手里的 nucleo_L476 开发板来学习 HWTimer 的使用,运行官方
    的头像 发表于 07-19 15:17 1773次阅读
    <b class='flag-5'>RT-Thread</b>使用未默认启用的timer作为硬件定时器<b class='flag-5'>HWTIMER</b>的步骤

    RT-Thread驱动开发指南进阶-动手驱动未适配的外设LCD

    经过上一的《《RT-Thread设备驱动开发指南》基础--
    的头像 发表于 02-25 11:04 2480次阅读
    <b class='flag-5'>RT-Thread</b><b class='flag-5'>驱动</b><b class='flag-5'>开发指南</b>进阶<b class='flag-5'>篇</b>-动手<b class='flag-5'>驱动</b><b class='flag-5'>先</b><b class='flag-5'>楫</b>未适配的外设LCD

    开发者分享 | 基于RT-Thread BSP,使用CLion开发应用

    本期开发者:朱彦祖RT-Thread资深工程师,HPM6700/6400元老级开发者及骨灰级用户,辑生态社区常驻优秀开发者,江湖人称杭州吴
    的头像 发表于 06-07 08:17 2788次阅读
    <b class='flag-5'>开发</b>者分享 | 基于<b class='flag-5'>先</b><b class='flag-5'>楫</b><b class='flag-5'>RT-Thread</b> <b class='flag-5'>BSP</b>,使用CLion<b class='flag-5'>开发</b>应用

    已结束-【书籍评测活动NO.4】RT-Thread官方撰写,涵盖26种设备驱动开发指南

    本期书籍评测名单如下:大菠萝Alpha 《RT-Thread设备驱动开发指南》学习之UART设备驱动
    发表于 02-22 15:30

    RT-Thread设备驱动开发指南》读书测评

    驱动开发指南》这本书主要分了三个部分,由基础,进阶,高级组成,适用不同层次的开发者,对于不
    发表于 03-26 21:04

    RT-Thread设备驱动开发指南》学习之UART设备驱动开发学习

    首先感谢发烧友社区提供的机会,感谢RT-Thread社区。一、I/O设备模型RT-Thread 提供了一套简单的 I/O 设备模型框架,如下图所示,它位于硬件和应用程序之间,共分成三层
    发表于 04-14 23:13

    RT-Thread文档_Nordic BSP 上手指南

    RT-Thread文档_Nordic BSP 上手指南
    发表于 02-22 18:26 7次下载
    <b class='flag-5'>RT-Thread</b>文档_Nordic <b class='flag-5'>BSP</b> 上手<b class='flag-5'>指南</b>

    RT-Thread文档_HWTIMER 设备

    RT-Thread文档_HWTIMER 设备
    发表于 02-22 18:34 0次下载
    <b class='flag-5'>RT-Thread</b>文档_<b class='flag-5'>HWTIMER</b> <b class='flag-5'>设备</b>

    送《RT-Thread设备驱动开发指南》,手慢无!

    迫切地希望有一本可以指导他们在RT-Thread开发驱动指南。 为了解决开发者的燃眉之急, 《RT
    的头像 发表于 03-19 23:00 1388次阅读

    上海线下培训:RT-Thread× HPM5300 for RT-Thread ,高性能 RISC-V 平台开发快速上手

    RT-Thread的代表性产品和服务。 同时,我们也邀请到的资深工程师杨帆,他将为开发者们带来期待已久的热门技术主题培训,RT-Thread
    的头像 发表于 11-03 19:10 754次阅读
    上海线下培训:<b class='flag-5'>RT-Thread</b>×<b class='flag-5'>先</b><b class='flag-5'>楫</b>  HPM5300 for <b class='flag-5'>RT-Thread</b> ,高性能 RISC-V 平台<b class='flag-5'>开发</b>快速上手

    RT-Thread BSP v1.3.0 发布

    各位的小伙伴们,我们很高兴地通知您,半导体最新的RT-ThreadBSPv1.3.0正式发布了!!(该图片来源于网络)提供的主要功能
    的头像 发表于 11-08 08:17 584次阅读
    <b class='flag-5'>RT-Thread</b> <b class='flag-5'>BSP</b> v1.3.0 发布

    线下活动|HPM5300 for RT-Thread ,高性能 RISC-V 平台开发快速上手

    公司最新技术和创新解决方案的机会。参与者将深入了解半导体和RT-Thread的代表性产品和服务。同时,我们也邀请到的资深工程师杨帆老
    的头像 发表于 11-08 08:18 666次阅读
    线下活动|<b class='flag-5'>先</b><b class='flag-5'>楫</b>HPM5300 for <b class='flag-5'>RT-Thread</b> ,高性能 RISC-V 平台<b class='flag-5'>开发</b>快速上手

    RT-Thread BSP v1.4.0 正式发布

    亲爱的小伙伴们:我们很高兴地通知您,RT-ThreadBSPv1.4.0正式发布了!!1个小转变:从这个版本开始,我们将更侧重于利用RT-Thread丰富的组件以及特色的在线包,基
    的头像 发表于 02-19 12:20 615次阅读
    <b class='flag-5'>先</b><b class='flag-5'>楫</b> <b class='flag-5'>RT-Thread</b> <b class='flag-5'>BSP</b> v1.4.0 正式发布

    RT-Thread设备驱动开发指南》基础--bsphwtimer设备

    一、概述(一)RT-Thread设备驱动RT-Thread设备驱动
    的头像 发表于 02-24 08:16 1616次阅读
    《<b class='flag-5'>RT-Thread</b><b class='flag-5'>设备</b><b class='flag-5'>驱动</b><b class='flag-5'>开发指南</b>》基础<b class='flag-5'>篇</b>--<b class='flag-5'>以</b><b class='flag-5'>先</b><b class='flag-5'>楫</b><b class='flag-5'>bsp</b>的<b class='flag-5'>hwtimer</b><b class='flag-5'>设备</b><b class='flag-5'>为</b><b class='flag-5'>例</b>

    【好书推荐】RT-Thread设备驱动开发指南

    强烈,他们迫切地希望有一本可以指导他们在RT-Thread开发驱动指南。为了解决开发者的燃眉之急,《
    的头像 发表于 08-01 08:35 610次阅读
    【好书推荐】<b class='flag-5'>RT-Thread</b><b class='flag-5'>设备</b><b class='flag-5'>驱动</b><b class='flag-5'>开发指南</b>