打印
[开发板]

CW32L0开发板学习记录四:高级定时器ATIM学习

[复制链接]
233|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
一:CW32L0系列几种定时器介绍:
CW32L010 微控制器内部集成一个通用定时器、三个基本定时器、一个低功耗定时器和一个高级控制定时器。各个定时器的功能差异如下表所示:


高级定时器(ATIM):
高级定时器 (ATIM) 包含一个 16bit 自动重载计数器,并由一个可编程的预分频器驱动。ATIM 支持定时、计数、复位、门控、触发和编码器等多种工作模式,带6路独立的捕获/比较通道,可实现6路独立 PWM 输出或6对带死区互补PWM 输出或对6路输入进行捕获。可用于基本的定时/计数、测量输入信号的脉冲宽度和周期、产生输出波形(PWM、单脉冲、插入死区时间的互补 PWM 等)。
通用定时器(GTIM):
通用定时器 (GTIM)包含一个 16bit 自动重载计数器,并由一个可编程预分频器驱动。GTIM 支持定时、计数、复位、门控、触发和编码器等多种工作模式,带4路独立的捕获/比较通道,可以测量输入信号的脉冲宽度(输入捕获)或者产生输出波形(输出比较和 PWM)。
低功耗定时器(LPTIM):
内部集成1个 16 位低功耗定时器(LPTIM),可以以很低的功耗实现定时或对外部脉冲计数的功能。通过选择合适的时钟源和触发信号,可以实现系统低功耗休眠时将其唤醒的功能。LPTIM 内部具有一个比较寄存器,可实现比较输出和 PWM 输出,并可以控制输出波形的极性。此外,LPTIM 还可以与正交编码器连接,自动实现递增计数和递减计数。
基本定时器(BTIM1..3):
内部集成3个基本定时器(BTIM),每个 BTIM 完全独立且功能完全相同,各包含一个 16bit 自动重装载计数器并由一个可编程预分频器驱动。BTIM 支持内部计数模式、外部计数模式、触发启动模式和门控计数模式4种工作模式,支持更新事件和触发事件发生时产生中断。不同工作模式下均可由复位输入信号控制计数器复位。
独立看门口(IWDT):
内部集成独立看门狗定时器(IWDT),一旦启动 IWDT,用户需要在规定时间隔内对 IWDT的计数器进行重载,否则产生溢出会触发复位或产生中断信号。IWDT 启动后,可停止计数。用户可选择在深度休眠模式下IWDT保持运行或暂停计数。
专门设置的键值寄存器可以锁定 IWDT 的关键寄存器,防止寄存器被意外修改。

SysTick定时器:
此定时器常用于实时操作系统,但也可用作标准递减计数器。它的特点是:
24 位递减计数器
自动重装载能力
当计数器达到0时产生可屏蔽的系统中断

二:简单分享一下高级定时器的主要特点:
16bit 递增、递减和递增/递减自动重载计数器可编程预分频器支持 1、2、3、4、…、65536 分频支持单次计数模式和连续计数模式6 路独立输入捕获和输出比较通道死区时间可编程的互补 PWM 输出支持双点比较移相,支持逻辑与移相
支持2个刹车输入
触发输入信号(TRGI)控制定时器实现多种从模式定时器级联 ITR 和片内外设互联 ETR支持针对定位的增量(正交)编码器和霍尔传感器电路多种事件发生时产生中断请求
- 更新事件
触发事件
输入捕获
输出比较
换向事件
刹车事件
编码器事件

三:简单分享一下 使用外部时钟模式的编程过程:
ATIM_CH1 通道的上升沿进行计数,步骤如下:
步骤 1:设置SYSCTRL AHBEN,GPIO为1,SYSCTRL APBEN1.TIM为1,打开ATIM_CH1引脚对应的GPIO时钟和ATIM配置时钟及工作时钟;
步骤 2:将 ATIM CH1引脚对应的 GPI0 配置成复用输入模式,具体寄存器配置请参见8通用输入输出端口(GPIO);
步骤3:设置ATIM TISEL1.TI1SEL为0,选择TI1来源为ATIMCH1通道;
步骤 4:设置 ATIM_CCMRICAP.ICIF,配置输入滤波带宽,
步骤5:设置 ATIM CCER.CCINP为0、ATIM CCER.CCIP为0,选择上升沿计数有效;步骤
6: 设置ATIM SMCR.TS为0x5,选择TRGI输入为TI1FP1;
步骤7:设置ATIM_SMCR.SMS为0x7,使ATIM工作于外部时钟模式1;
步骤8:设置ATIM IER.UIE为1并配置对应NVIC,使能更新中断;
步骤 9:配置计数器预分频器 ATIM_PSC;
步骤 10:设置期望的重载值;
步骤 11:设置ATIM CR 1.CEN为1,使能计数器;
步骤 12:当计数器溢出时,ATIM_ISR.UIF标志位置1,进入中断服务程序,设置ATIM_ICR.UIF为0清除该中断标志。

四:软件编写:
4.1使用  CW32单片机的定时器时候,注意使能高级定时器的中断
void NVIC_Configuration(void)
{
    __disable_irq();
    NVIC_EnableIRQ(ATIM_IRQn);
    __enable_irq();
}
4.2 配置高级定时器的基本参数:预分频系数、分频系数、触发模式、重装值等等如下所示,配置完成后,记得使能定时器,这时候定时器开始工作
就计算方法: 定时器的主频为 8Mhz。8000000 /80 =100000   100000/10000 =10次,也就是说 每秒进入中断的次数为10次,
    ATIM_InitStruct.BufferState = ENABLE;               //使能缓存寄存器    
    ATIM_InitStruct.CounterAlignedMode = ATIM_COUNT_ALIGN_MODE_EDGE;    //边沿对齐
    ATIM_InitStruct.CounterDirection = ATIM_COUNTING_UP;        //向上计数;
    ATIM_InitStruct.CounterOPMode = ATIM_OP_MODE_REPETITIVE;    //连续运行模式   
    ATIM_InitStruct.Prescaler = 80-1;    // 80分频
    ATIM_InitStruct.ReloadValue = 9999;                 // 重载周期9999+1
    ATIM_InitStruct.RepetitionCounter = 0;              // 重复周期0

    ATIM_Init(&ATIM_InitStruct);
    ATIM_ITConfig(ATIM_IT_UIE, ENABLE);             // 有重复计数器溢出产生进入中断
   
    ATIM_Cmd(ENABLE);
4.3 定时器中断回调函数编写
void ATIM_IRQHandlerCallBack(void)
{
    if (ATIM_GetITStatus(ATIM_STATE_UIF))
    {
        ATIM_ClearITPendingBit(ATIM_STATE_UIF);
        PB03_TOG();
    }

}
试验现象:板载的LED1以100ms的间隔闪烁。



WeChat_20241209184040 00_00_00-00_00_30.gif (5.32 MB )

WeChat_20241209184040 00_00_00-00_00_30.gif

使用特权

评论回复
沙发
AdaMaYun| | 2024-12-10 08:16 | 只看该作者
高级定时器有哪些注意事项呢?

使用特权

评论回复
板凳
lulugl| | 2024-12-10 10:09 | 只看该作者
请问大佬,有编码器模式吗?

使用特权

评论回复
地板
聪聪哥哥|  楼主 | 2024-12-10 10:44 | 只看该作者
lulugl 发表于 2024-12-10 10:09
请问大佬,有编码器模式吗?

有的,官方那边是由例程的

使用特权

评论回复
5
聪聪哥哥|  楼主 | 2024-12-10 10:46 | 只看该作者
AdaMaYun 发表于 2024-12-10 08:16
高级定时器有哪些注意事项呢?

需要看用定时器的哪种模式了

使用特权

评论回复
6
DanPianJiFangAn| | 2024-12-10 11:31 | 只看该作者
昨天还在折腾这个ATIM的单脉冲模式(用于发送类似红外那种数据)。范例有点少

使用特权

评论回复
7
zhangjsh| | 2024-12-10 11:34 | 只看该作者
感谢分享

使用特权

评论回复
8
xionghaoyun| | 2024-12-10 17:29 | 只看该作者
学习一下

使用特权

评论回复
9
聪聪哥哥|  楼主 | 2024-12-10 19:20 | 只看该作者
DanPianJiFangAn 发表于 2024-12-10 11:31
昨天还在折腾这个ATIM的单脉冲模式(用于发送类似红外那种数据)。范例有点少 ...

你CW32的例程还有一个用户手册,介绍的很详细,连代码编写步骤都给提供了!!!

使用特权

评论回复
10
LOVEEVER| | 2024-12-11 17:12 | 只看该作者
CW32L010 微控制器功能还是很强大的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

36

主题

101

帖子

0

粉丝