Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
Numaker-IoT-M487
timer
基于RT-Thread的NuMaker-IoT-M487外设评测之TIMER
发布于 2022-05-14 17:14:55 浏览:678
订阅该版
# 基于RT-Thread的NuMaker-IoT-M487 开发板的使用分析和外设功能评测 [TOC] > 本篇文章主要是介绍NuMaker-IoT-M487开发板的Timer外设功能的使用,以及在RT-Thread实时操作系统上编程,最后通过一个定时点灯的功能带大家入手 ## 资料获取 如果您想获得更加详细的资料和教程可参考一下链接: ● NuMaker-IoT-M487驱动支持:https://github.com/RT-Thread/rt-thread/tree/master/bsp/nuvoton/libraries/m480 ● 下载板子原理图等资料:https://www.nuvoton.com/resource-download.jsp?tp_GUID=HL0320180905131830 ● NuMaker-IoT-M487用户手册:https://www.nuvoton.com/resource-download.jsp?tp_GUID=UG0120180907124835 ●基于 RT-Thread的NuMaker-IoT-M487 快速上手文档:https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/tutorial/quick-start/numaker-iot-m487/quick-start ● 下载技术参考手册: https://www.nuvoton.com/resource-download.jsp?tp_GUID=DA05-M480 ●官方技术直播回放:https://www.bilibili.com/video/BV1LF411W7Qw/(必看) ## NuMaker-IoT-M487 之TIMER外设介绍 ### 1.特性介绍 该定时器控制器包括四个32位定时器,Timer0 ~ Timer3,允许用户轻松实现一个 应用程序的定时器控制。 该定时器可以实现频率测量、延时等功能 计时,时钟生成和事件计数由外部输入引脚,间隔测量由 外部捕获别针。 定时器控制器还提供四个PWM发生器。 每个PWM发生器支持两个PWM 输出通道分别为独立模式和互补模式。 PWM输出引脚的输出状态 可通过引脚屏蔽控制,极性和断路控制,死区时间发生器控制。  经过查看数据手册6.8.2章可知,增强型的ADC具有以下特性: 四组32位定时器,每个定时器有一个24位的计数器和一个8位的预量程 计数器 每个定时器的独立时钟源 提供一次性,周期性,切换输出和连续计数操作模式 24位的计数器值通过CNT可读(TIMERx_CNT[23:0]) 支持事件计数功能 24位捕获值通过CAPDAT (TIMERx_CAP[23:0])是可读的 支持外部捕获引脚事件间隔测量 支持外部捕获引脚事件复位24位计数器 支持芯片唤醒从Idle/Power-down模式,如果定时器中断信号产生 支持Timer0 ~ Timer3超时中断信号或捕获中断信号触发 EPWM, BPWM, QEI, EADC, DAC和PDMA功能 支持内部捕获触发,同时内部ACMP输出信号转换 支持内部时钟(HIRC, LIRC)和外部时钟(HXT, LXT)捕捉事件 支持Inter-Timer触发方式 支持从内部USB SOF信号事件计数源 ### 2.定时器外设基本配置 #### 2.1引脚配置 设置这个位TIMERx_ALTCTL[0]为0是使能定时器模式。 使能定时器0 物理时钟是TMR0CKEN (CLK_APBCLK0[2])位 使能定时器1 物理时钟是TMR0CKEN (CLK_APBCLK0[3])位 使能定时器2 物理时钟是TMR0CKEN (CLK_APBCLK0[4])位 使能定时器3 物理时钟是TMR0CKEN (CLK_APBCLK0[5])位 各个定时器的引脚配置表如下图所示:  #### 2.2定时器功能描述 - 定时器中断标志可以有各种中断或者发生事件来产生中断 - 定时器计数模式可提供一次计数、周期计数、切换输出、和连续计数操作模式。 ADC的时钟频率最大为72MHZ,采样率最高达到每秒5.14MSPS(1MSPS == 1MHZ),ADC的外设时钟源是HCLK时钟提供的,ADC的时钟频率计算公式为: (PCLK1) / (EADCDIV0/1 (CKL_CLKDIV0[23:16])+1) ### 3.RT-Thread Timer外设的使用 #### 3.1打开外设驱动 RT-Thread的优点之一是外设可剪裁,比如你想使用SPI设备,你需要先打开SPI的外设驱动才能进行编程,同样的,我们想使用Timer,可通过厂家提供的可视化界面进行配置。配置完成后需保存才会生效,我使用的是RT-Thread STUDIO版本,具体操作方法如下:  我这里使能TIMER0,大家可以根据自己的需求来进行选择。 保存配置之后,我们可以在rtconfig.h里面看到响应的宏已经被生成  **原理分析**:我们打开drv_timer.c,查看源代码可知:如果要使用TIMER0外设,必须先在其他文件定义这,而我们刚刚的使能过程其实就是通过可视化软件来定义这,这三个宏保存在rtconfig.h中,有兴趣的读者也可以去看看这个文件。  我们可以看到BSP_USING_TIMER0这个宏被定义之后就会构建一个对象,这个对象包含了寄存器值,中断、各种状态的内容,我们操作这个对象就可以实现功能。 #### 3.2 Timer设备的访问 我们通过RT-Thread访问adc外设只需要下面的用到几个函数, | rt_device_find() | 查找定时器设备 | | --------------------------- | ------------------------------------------------------------ | | rt_device_open() | 以读写方式打开定时器设备 | | rt_device_set_rx_indicate() | 设置超时回调函数 | | rt_device_control() | 控制定时器设备,可以设置定时模式(单次/周期)/计数频率,或者停止定时器 | | rt_device_write() | 设置定时器超时值,定时器随即启动 | | rt_device_read() | 获取定时器当前值 | | rt_device_close() | 关闭定时器设备 | ### 4.使用IOT-M487开发板的定时器0定时让灯闪烁 1. 我们先需要查找设备,现在用的是定时器0 ,所以我们要查看定时器0的名字,因为每个厂家提供的板级驱动都不一样,所以我们先要去看一下他的定时器名字是什么,打开drv_timer.c文件,我们可以看到定时器0的名字是timer0,所以直接调用这个函数来查找就行了 ``` rt_device_find(HWTIMER_DEV_NAME) ``` {{image.png(uploading...)}} 2. 以读写方式打开设备,我们打开这个设备的形式是可读可写 ``` ret = rt_device_open(hw_dev, RT_DEVICE_OFLAG_RDWR) ``` 3.设置超时回调函数,你设定的定时器的功能最终会执行这个函数里面的内容 ``` rt_device_set_rx_indicate(hw_dev, timeout_cb); ``` 4.设置模式为周期性定时器,你可以选择是一次性还是周期性定时 ``` mode = HWTIMER_MODE_PERIOD; ret = rt_device_control(hw_dev, HWTIMER_CTRL_MODE_SET, &mode); ``` 5.写设备,设置定时器超时值并启动定时器 ``` timeout_s.sec = 5; /* 秒 */ timeout_s.usec = 0; /* 微秒 */ rt_device_write(hw_dev, 0, &timeout_s, sizeof(timeout_s)) != sizeof(timeout_s) ``` 6.读设备, 读取定时器当前值 ``` rt_device_read(hw_dev, 0, &timeout_s, sizeof(timeout_s)); ``` ### 5.演示效果和源码获取 预期效果:每两秒钟灯的状态变换一下,并通过串口输出tick定时器的值 视频演示连接:https://www.bilibili.com/video/BV1hU4y1m7dr?spm_id_from=333.999.0.0 源码获取:https://gitee.com/bes_ssss/NuMaker-IoT-M487
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
周洪璋
这家伙很懒,什么也没写!
文章
2
回答
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
定时器
ADC
GD32
flashDB
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
keil_MDK
ulog
SFUD
msh
C++_cpp
MicroPython
本月问答贡献
RTT_逍遥
10
个答案
3
次被采纳
xiaorui
3
个答案
2
次被采纳
winfeng
2
个答案
2
次被采纳
三世执戟
8
个答案
1
次被采纳
KunYi
8
个答案
1
次被采纳
本月文章贡献
catcatbing
3
篇文章
5
次点赞
lizimu
2
篇文章
9
次点赞
swet123
1
篇文章
4
次点赞
Days
1
篇文章
4
次点赞
YZRD
1
篇文章
2
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部