[APM32F0] APM32F003 TMR2从模式复位模式

[复制链接]
2298|7
 楼主| Alden 发表于 2023-5-30 18:53 | 显示全部楼层 |阅读模式
本帖最后由 Alden 于 2023-5-30 18:53 编辑

使用APM32F003开发发现,这颗20脚的小芯片输入外设较少但外设功能都很齐全。
定时器方面除了基本的SysTick、窗口看门狗、独立看门狗外。
还有两个16位高级定时器,可以实现PWM互补输出、捕获比较、外部触发输入等,一个16位的通用定时器、一个8位的基本定时器。
定时器的功能不必其他M0的mcu少,还可实现定时器之间的主从级联。实现比较复杂的功能。
尝试简单验证了下APM32F003F6P6的定时器主从模式,级联复位。
实现是配置TMR1配置主模式,用更新事件来触发。
013d9299af2c9d9cbe45de81b936210.png
根据用户手册中描述的寄存器配置对应的代码。
  1. void TMR1Init(void)
  2. {
  3.     TMR1_TimeBaseConfig_T timeBaseConfig;

  4.     /** Up-counter */
  5.     timeBaseConfig.cntMode = TMR1_CNT_MODE_UP;
  6.     /** Set counter = 4800 */
  7.     timeBaseConfig.count = 4799;
  8.     /** Set divider = 0 */
  9.     timeBaseConfig.divider = 0;
  10.     /** Repetition counter = 0x0 */
  11.     timeBaseConfig.repetitionCount = 0;
  12.     TMR1_ConfigTimerBase(TMR1, &timeBaseConfig);

  13.     TMR1_EnableMasterMode(TMR1);
  14.     TMR1_ConfigMasterMode(TMR1,TMR1_MASTER_MODE_UPDATE);


  15.     /**  Enable TMR1  */
  16.     TMR1_Enable(TMR1);
  17.                    TMR1_EnableInterrupt(TMR1, TMR1_INT_UPDATE);
  18.    NVIC_EnableIRQRequest(TMR1_UT_IRQn, 0x0f);
  19. }
同样的TMR2按照用户手册的寄存器描述,配置内部触发连接到TMR1
6324288a684116aeff5e14f3cfd048e.png
对应代码如下:
  1. void TMR2Init(void)
  2. {        
  3.         
  4.         TMR2_ICConfig_T icConfig;        

  5.         TMR2_ConfigTimerBase(1, 6000-1);
  6.         icConfig.channel = TMR2_CHANNEL_1;
  7.         icConfig.div = TMR2_IC_DIV_1;
  8.         icConfig.filter = 0;
  9.         icConfig.polarity = TMR2_IC_POLARITY_RISING;
  10.         icConfig.selection = TMR2_IC_SELECT_DIRECTTI;
  11.         TMR2_ConfigInputPWM(&icConfig);

  12.         TMR2_EnableInterrupt(TMR2_INT_CH1CC);
  13.         TMR2_EnableInterrupt(TMR2_INT_UPDATE);
  14.         NVIC_EnableIRQRequest(TMR2_CC_IRQn, 0x0f);
  15.         NVIC_EnableIRQRequest(TMR2_UO_IRQn, 0x00);        
  16.         TMR2_ConfigInputTrigger(TMR2_ITC_TMR1);
  17.         TMR2_ConfigSlaveMode(TMR2_SLAVE_MODE_RESET);
  18.         TMR2_Enable();        


  19. }


在两个定时器的更新中断中加入GPIO翻转的代码,就可以看到TMR1更新时TMR也会更新重置计算值,两个GPIO翻转频率相同。
  1. void TMR2_UO_IRQHandler(void)
  2. {
  3.     if(TMR2_ReadStatusFlag(TMR2_FLAG_UPDATE) == SET)
  4. {
  5. GPIO_Toggle(GPIOC, GPIO_PIN_3);
  6. TMR2_ClearStatusFlag(TMR2_FLAG_UPDATE);
  7. }
  8. }
  1. void TMR1_UT_IRQHandler(void)
  2. {
  3.     if(TMR1_ReadStatusFlag(TMR1, TMR1_FLAG_UPDATE) == SET)
  4.     {
  5.                 GPIO_Toggle(GPIOC, GPIO_PIN_7);
  6.         TMR1_ClearStatusFlag(TMR1, TMR1_FLAG_UPDATE);
  7.                
  8.     }
  9. }

342718773394c65a923123d00f18347.jpg




两只袜子 发表于 2023-6-7 10:31 来自手机 | 显示全部楼层
麻雀虽小五脏俱全
tpgf 发表于 2023-6-8 08:42 | 显示全部楼层
有些应用场合,我们需要使用多个定时器主从级联,然后让各个定时器同时启动并做同频同相的PWM波形输出
八层楼 发表于 2023-6-8 09:26 | 显示全部楼层
主从模式就是定时器的一个模式  而不是我们人为的操作的结果是吗
观海 发表于 2023-6-8 10:20 | 显示全部楼层
如何能保证不同定时器输出的同步性呢
guanjiaer 发表于 2023-6-8 11:34 | 显示全部楼层
两个级联的定时器是需要同时进行更新的吗
heimaojingzhang 发表于 2023-6-8 12:06 | 显示全部楼层
guanjiaer 发表于 2023-6-8 11:34
两个级联的定时器是需要同时进行更新的吗

严格说来肯定不可能的 但是目前的应用是远远可以满足了
keaibukelian 发表于 2023-6-8 13:04 | 显示全部楼层
这是在一个定时器的初始化代码中 配置另一个定时器?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

49

主题

116

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部