打印
[产品介绍及宣传专区]

CW32定时器及其中断介绍

[复制链接]
432|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
deliahouse887|  楼主 | 2024-8-24 10:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

以CW32L083为例,其定时器分为6种:


基本定时器:CW32L083 内部集成 3 个基本定时器 (BTIM),每个 BTIM 完全独立且功能完全相同,各包含一个 16bit 自动重装 载计数器并由一个可编程预分频器驱动。BTIM 支持定时器模式、计数器模式、触发启动模式和门控模式 4 种工作模式,支持溢出事件触发中断请求和 DMA 请求。得益于对触发信号的精细处理设计,使得 BTIM 可以由硬件自 动执行触发信号的滤波操作,还能令触发事件产生中断和 DMA 请求。


低功耗定时器:CW32L083 内部集成 1 个 16 位低功耗定时器(LPTIM),可以以很低的功耗实现定时或对外部脉冲计数的功能。通过选择合适的时钟源和触发信号,可以实现系统低功耗休眠时将MCU唤醒的功能。LPTIM 内部具有一个比较寄存器,可实现比较输出和 PWM 输出,并可以控制输出波形的极性。此外,LPTIM 还可以与正交编码器连接,自动 实现递增计数和递减计数。


通用定时器:CW32L083 内部集成 4 个通用定时器(GTIM),每个 GTIM 完全独立且功能完全相同,各包含一个16bit 自动重 装载计数器并由一个可编程预分频器驱动。GTIM 支持定时器模式、计数器模式、触发启动模式和门控模式 4 种基本工作模式,每组带4 路独立的捕获 / 比较通道,可以测量输入信号的脉冲宽度(输入捕获)或者产生输出波形(输出比较和 PWM)。


高级定时器:高级定时器 (ATIM) 由一个 16 位的自动重载计数器和 7 个比较单元组成,并由一个可编程的预分频器驱动。ATIM 支持 6 个独立的捕获 / 比较通道,可实现 6 路独立 PWM 输出或 3 对互补 PWM 输出或对 6 路输入进行捕获。可 用于基本的定时 / 计数、测量输入信号的脉冲宽度和周期、产生输出波形(PWM、单脉冲、插入死区时间的互补 PWM 等)。


独立看门狗定时器 (IWDT):CW32L083 内部集成独立看门狗定时器 (IWDT),使用专门的内部 RC 时钟源 RC10K,可避免运行时受到外部因素 影响。一旦启动 IWDT,用户需要在规定时间间隔内对 IWDT 的计数器进行重载,否则计数器溢出会触发复位或 产生中断信号。IWDT 启动后,可停止计数。可选择在深度休眠模式下 IWDT 保持运行或暂停计数。专门设置的键值寄存器,可以锁定 IWDT 的关键寄存器,防止寄存器被意外修改。


窗口看门狗定时器 (WWDT):CW32L083 内部集成窗口看门狗定时器 (WWDT),用户需要在设定的时间窗口内进行刷新,否则将触发系统复位。WWDT 通常被用来监测有严格时间要求的程序执行流程,防止由外部干扰或未知条件造成应用程序的执行异常, 导致发生系统故障。


01

CW32定时器中断

定时器中断是由CW32中的定时器引起的中断,所谓中断就是程序正常顺序执行的时候,出现了突发事件,CPU停止当前的程序的执行,转去处理突发事件,处理完毕后又返回原程序被中断的位置继续执行。


02

CW32定时器中断源

定时器主要中断源包括如下:

基本定时器(BTIM): 计数器(ARR/TOP)溢出中断、计数器触发中断。

低功耗定时器(LPTIM): 计数方向反向中断、ARR更新完成中断、比较寄存器更新完成中断、计数器触发中断、ARR自动重载匹配中断、比较匹配中断。

通用定时器(GTIM): 编码器计数方向变化中断、CHx捕获比较中断、计数器下溢中断、计数器触发中断、计数器ARR溢出中断。

高级定时器(ATIM): CHxA/B捕获比较中断、CHxA/B捕获数据丢失中断、计数器上溢中断、计数器下溢中断、刹车中断、CH4比较匹配中断、事件更新中断。

更新事件, 触发事件。

独立看门狗定时器(IWDT): 计数器溢出中断。

窗口看门狗定时器(WWDT):计数器溢出中断。

各中断源的含义详细描述参见对应产品的用户手册内容。


03

实际操作

以CW32L083为例,控制基本定时器BTIM1以固定的时间间隔产生中断,并在ARR溢出中断中控制口线电平翻转。


1. RCC时钟初始化

void RCC_Configuration(void){RCC_HSI_Enable(RCC_HSIOSC_DIV6);//系统时钟设置为HSI时钟6分频,8MHz, PCLK、HCLK不分频,PCLK=HCLK=SysClk=8MHz__RCC_BTIM_CLK_ENABLE();__RCC_GPIOB_CLK_ENABLE();}

2.初始化GPIO口

void GPIO_Configuration(void){GPIO_InitTypeDef GPIO_InitStruct = {0};GPIO_InitStruct.IT = GPIO_IT_NONE;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pins = GPIO_PIN_8;GPIO_Init(CW_GPIOB, &GPIO_InitStruct);}

3.配置嵌套矢量中断控制器

void NVIC_Configuration(void){    __disable_irq();    NVIC_EnableIRQ(BTIM1_IRQn);    __enable_irq();}

4.主函数

int32_t main(void){BTIM_TimeBaseInitTypeDef BTIM_TimeBaseInitStruct = {0};/* System Clocks Configuration */    RCC_Configuration();    /* NVIC Configuration */    NVIC_Configuration();    /* GPIO Configuration */    GPIO_Configuration();BTIM_TimeBaseInitStruct.BTIM_Mode = BTIM_Mode_TIMER;/* 工作模式,00:定时器模式01:计数器模式10:触发计数模式11:门控计数模式  */BTIM_TimeBaseInitStruct.BTIM_Period = 49999;/* 计数重载周期,取值范围0x0000 到 0xFFFF.  */    BTIM_TimeBaseInitStruct.BTIM_Prescaler = 7;    // 8分频/*8分频, 预分配系数,取值范围2的n次幂,n=0,1,2…15 */BTIM_TimeBaseInit(CW_BTIM1, &BTIM_TimeBaseInitStruct);//BTIM基本定时器初始化    BTIM_ITConfig(CW_BTIM1, BTIM_IT_OV, ENABLE);   // 使能BTIMx的溢出中断    BTIM_Cmd(CW_BTIM1, ENABLE);    /*BTIM1以1MHz时钟进行计数,设置ARR寄存器为49999,则BTIM1将每50ms溢出一次,并触发中断服务程序。*/    while (1)    {        /* 中断服务程序中 PB8输出翻转 */    }}

5.中断函数:PB08输出翻转

void BTIM1_IRQHandler(void){    /* USER CODE BEGIN */if (BTIM_GetITStatus(CW_BTIM1, BTIM_IT_OV))// 检查BTIM的状态寄存器的各状态位是否置位    {        BTIM_ClearITPendingBit(CW_BTIM1, BTIM_IT_OV);          // 清除BTIM的状态寄存器的各状态位        PB08_TOG();//PB08口信号翻转    }    /* USER CODE END */}

使用特权

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

本版积分规则

29

主题

1199

帖子

0

粉丝