芯源半导体CW32
直播中

任凭风吹

10年用户 1084经验值
擅长:可编程逻辑 电源/新能源 MEMS/传感技术 制造/封装 模拟技术
私信 关注
[经验]

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

一: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();
  •     }

  • }

更多回帖

发帖
×
20
完善资料,
赚取积分