• CMT2380F32模块开发8-Base Timer例程


    Base Timer 包含三个定时器 Timer0/1/2。Timer0/1/2 功能完全相同。Timer0/1/2 是同步定时/计数器,可以作为 16 位自动重装载功能的定时/计数器,也可以作为 32 位无重载功能的定时/计数器。Timer0/1/2 可以对外部脉冲进行计数或者实现系统定时。

    Timer0/1/2 每个定时/计数器都有独立的控制启动信号,以及外部输入时钟,门控信号。

    TIM0/1/2 的定时/计数器支持两种工作模式,模式 1为 32 位自由计数模式。模式 2 是 16 位重载模式。

    通过定时器的翻转输出功能可以实现驱动 Buzzer 的功能。还给出了在计数时钟为 4M 情况下 Buzzer 输出不同频率的Timer 重载模式配置值。

    bt_cnt例程

    本样例Base Timer对内部4M时钟进行计数,直到计数到溢出值时产生中断,并停止计数,LED1点亮,大约上电4.2s左右。
    使用内部4MHz,定时器进行256分频,周期为15625Hz,定时器初始值0xFFFF0000,需要16位溢出,计数值65536。
    溢出时间为65536/15625=4.19s

    1. en_result_t BtCntTest(void)
    2. {
    3. stc_bt_config_t stcConfig;
    4. en_result_t enResult = Error;
    5. uint32_t u32InitCntData = 0xFFFFFFFA; // 设置初始值,实际使用16位
    6. // INT ENABLE
    7. EnableNvic(TIM0_IRQn, 3, TRUE);
    8. Bt_EnableIrq(TIM0);
    9. //对外部ext0计数,GPIO配置
    10. Gpio_SetFunc_TIM0_EXT_P34();
    11. stcConfig.enGateP = BtPositive;
    12. stcConfig.enGate = BtGateDisable;
    13. stcConfig.enPRS = BtPCLKDiv256;
    14. stcConfig.enTog = BtTogDisable;
    15. stcConfig.enCT = BtCounter;
    16. stcConfig.enMD = BtMode1;
    17. stcConfig.pfnTim0Cb = Bt0Int;
    18. // Bt配置初始化
    19. if (Ok != Bt_Init(TIM0, &stcConfig)) {
    20. enResult = Error;
    21. }
    22. //设置计数值,启动计数
    23. Bt_Cnt32Set(TIM0, u32InitCntData);
    24. Bt_Run(TIM0);
    25. Gpio_InitIO(1, 5, GpioDirOut);
    26. Gpio_SetIO(1, 5, 0);
    27. //等待计数完成后进入中断……
    28. while (1) {
    29. if (0x01 == u32BtTestFlag) {
    30. //进入中断后,停止计数
    31. u32BtTestFlag = (u32BtTestFlag & (~0x01));
    32. Bt_Stop(TIM0);
    33. enResult = Ok;
    34. break;
    35. }
    36. }
    37. Gpio_SetIO(1, 5, 1);
    38. return enResult;
    39. }

    设置tim0计数器,在开始计数时点亮LED3,当计数到时熄灭LED3.

    1. void Bt0Int(void)
    2. {
    3. if (TRUE == Bt_GetIntFlag(TIM0)) {
    4. Bt_ClearIntFlag(TIM0);
    5. u32BtTestFlag = 0x01;
    6. }
    7. }

    在中断中置位,主程序此时会退出while循环向下执行,熄灭LED3。

    bt_timer例程

    本样例使用门控控制定时器定时,定时溢出后产生中断,翻转LED1,并重新载入初值进行定时,并再次溢出进入中断,翻转LED1。
    使用内部4MHz,定时器进行256分频,周期为15625Hz,定时器初始值0x2000,溢出需要57344计数。
    溢出时间为57344/15625=3.67s

    1. en_result_t BtTimerTest(void)
    2. {
    3. stc_bt_config_t stcConfig;
    4. en_result_t enResult = Error;
    5. uint16_t u16ArrData = 0xF000; // 重载值
    6. uint16_t u16InitCntData = 0xF000; // 计数值
    7. EnableNvic(TIM0_IRQn, 3, TRUE);
    8. Bt_EnableIrq(TIM0);
    9. // P35设置为门控使能IO
    10. Gpio_SetFunc_TIM0_GATE_P35();
    11. stcConfig.pfnTim0Cb = Bt0Int;
    12. stcConfig.enGateP = BtPositive;
    13. stcConfig.enGate = BtGateEnable;
    14. stcConfig.enPRS = BtPCLKDiv256;
    15. stcConfig.enTog = BtTogDisable;
    16. stcConfig.enCT = BtTimer;
    17. stcConfig.enMD = BtMode2;
    18. // Bt初始化
    19. if (Ok != Bt_Init(TIM0, &stcConfig)) {
    20. enResult = Error;
    21. }
    22. //设置重载值和计数值,启动计数
    23. Bt_ARRSet(TIM0, u16ArrData);
    24. Bt_Cnt16Set(TIM0, u16InitCntData);
    25. Bt_Run(TIM0);
    26. //此处进入中断……
    27. while (1) {
    28. //判断是否第二次进入中断
    29. if (0x02 == u32BtTestFlag) {
    30. u32BtTestFlag = u32BtTestFlag & (~0x02);
    31. if (10 == u32Cnt) {
    32. Bt_Stop(TIM0);
    33. enResult = Ok;
    34. break;
    35. }
    36. u32Cnt++;
    37. }
    38. }
    39. return enResult;
    40. }

    这里是对定时器的设置,已经门控引脚的设置。

    1. void Bt0Int(void)
    2. {
    3. if (TRUE == Bt_GetIntFlag(TIM0)) {
    4. Bt_ClearIntFlag(TIM0);
    5. u32BtTestFlag = 0x02;
    6. Data = ~Data;
    7. Gpio_SetIO(2, 3, Data);
    8. }
    9. }

    在中断中翻转LED1。

    bt_tog例程

    本样例展示翻转输出功能,可输出两路相位相反的波形,该功能可用于驱动Buzzer。
    使用内部4MHz,定时器进行64分频,周期为62500Hz,定时器初始值0x0BDC,溢出需要62500计数。
    溢出时间为1s,间隔1s翻转一次,翻转10次后停止。

    1. en_result_t BtTogTest(void)
    2. {
    3. stc_bt_config_t stcConfig;
    4. en_result_t enResult = Ok;
    5. ///<(4Mhz->1000Hz)
    6. uint16_t u16ArrData = 0x0BDC;
    7. uint16_t u16InitCntData = 0x0BDC;
    8. // config P14/P15 as toggleB/toggle
    9. Gpio_SetFunc_TIM2_TOGN_P14();
    10. Gpio_SetFunc_TIM2_TOG_P15();
    11. EnableNvic(TIM2_IRQn, 3, TRUE);
    12. Bt_EnableIrq(TIM2);
    13. stcConfig.pfnTim2Cb = Bt2Int;
    14. stcConfig.enGateP = BtPositive;
    15. stcConfig.enGate = BtGateDisable;
    16. stcConfig.enPRS = BtPCLKDiv64;
    17. stcConfig.enTog = BtTogEnable;
    18. stcConfig.enCT = BtTimer;
    19. stcConfig.enMD = BtMode2;
    20. if (Ok != Bt_Init(TIM2, &stcConfig)) {
    21. enResult = Error;
    22. }
    23. //设置重载值,计数值,启动计数
    24. Bt_ARRSet(TIM2, u16ArrData);
    25. Bt_Cnt16Set(TIM2, u16InitCntData);
    26. Bt_Run(TIM2);
    27. //等待波形输出……
    28. u32Cnt = 10;
    29. while (u32Cnt)
    30. ;
    31. Bt_Stop(TIM2);
    32. return enResult;
    33. }

    在中断中进行自减计数。

    1. void Bt2Int(void)
    2. {
    3. if (TRUE == Bt_GetIntFlag(TIM2)) {
    4. Bt_ClearIntFlag(TIM2);
    5. u32BtTestFlag = 0x04;
    6. u32Cnt--;
    7. }
    8. }

    定时器在软件设计中非常常用,2380提供的库还是很好用。

    这里简单说一下,下一节要将的lpt,低功耗定时器,因为例程中需要用到的引脚模块并没有引出,所以这一节的例程就没有改,也没做,需要用到的时候读一下例程应该就会用了,都差不多。

  • 相关阅读:
    MVC拦截器
    好用的Android软件汇总
    Java---刷题02
    ESlint配合Prettier完成代码风格配置
    django中Models常用的字段及属性介绍
    vm虚拟机硬盘扩充(linux)
    Vue实现简单的接口封装
    【halcon】外观检测总结之灰度操作
    【K8S 八】使用containerd作为CRI
    完犊子!原单位的离职证明丢了,下周要入职了,用AI做一个行不行?
  • 原文地址:https://blog.csdn.net/andylauren/article/details/126172021