打印
[APM32F0]

APM32F003 TMR2从模式复位模式

[复制链接]
1297|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Alden|  楼主 | 2023-5-30 18:53 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 Alden 于 2023-5-30 18:53 编辑

使用APM32F003开发发现,这颗20脚的小芯片输入外设较少但外设功能都很齐全。
定时器方面除了基本的SysTick、窗口看门狗、独立看门狗外。
还有两个16位高级定时器,可以实现PWM互补输出、捕获比较、外部触发输入等,一个16位的通用定时器、一个8位的基本定时器。
定时器的功能不必其他M0的mcu少,还可实现定时器之间的主从级联。实现比较复杂的功能。
尝试简单验证了下APM32F003F6P6的定时器主从模式,级联复位。
实现是配置TMR1配置主模式,用更新事件来触发。

根据用户手册中描述的寄存器配置对应的代码。
void TMR1Init(void)
{
    TMR1_TimeBaseConfig_T timeBaseConfig;

    /** Up-counter */
    timeBaseConfig.cntMode = TMR1_CNT_MODE_UP;
    /** Set counter = 4800 */
    timeBaseConfig.count = 4799;
    /** Set divider = 0 */
    timeBaseConfig.divider = 0;
    /** Repetition counter = 0x0 */
    timeBaseConfig.repetitionCount = 0;
    TMR1_ConfigTimerBase(TMR1, &timeBaseConfig);

    TMR1_EnableMasterMode(TMR1);
    TMR1_ConfigMasterMode(TMR1,TMR1_MASTER_MODE_UPDATE);


    /**  Enable TMR1  */
    TMR1_Enable(TMR1);
                   TMR1_EnableInterrupt(TMR1, TMR1_INT_UPDATE);
   NVIC_EnableIRQRequest(TMR1_UT_IRQn, 0x0f);
}
同样的TMR2按照用户手册的寄存器描述,配置内部触发连接到TMR1

对应代码如下:
void TMR2Init(void)
{        
        
        TMR2_ICConfig_T icConfig;        

        TMR2_ConfigTimerBase(1, 6000-1);
        icConfig.channel = TMR2_CHANNEL_1;
        icConfig.div = TMR2_IC_DIV_1;
        icConfig.filter = 0;
        icConfig.polarity = TMR2_IC_POLARITY_RISING;
        icConfig.selection = TMR2_IC_SELECT_DIRECTTI;
        TMR2_ConfigInputPWM(&icConfig);

        TMR2_EnableInterrupt(TMR2_INT_CH1CC);
        TMR2_EnableInterrupt(TMR2_INT_UPDATE);
        NVIC_EnableIRQRequest(TMR2_CC_IRQn, 0x0f);
        NVIC_EnableIRQRequest(TMR2_UO_IRQn, 0x00);        
        TMR2_ConfigInputTrigger(TMR2_ITC_TMR1);
        TMR2_ConfigSlaveMode(TMR2_SLAVE_MODE_RESET);
        TMR2_Enable();        


}


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






使用特权

评论回复
沙发
两只袜子| | 2023-6-7 10:31 | 只看该作者
麻雀虽小五脏俱全

使用特权

评论回复
板凳
tpgf| | 2023-6-8 08:42 | 只看该作者
有些应用场合,我们需要使用多个定时器主从级联,然后让各个定时器同时启动并做同频同相的PWM波形输出

使用特权

评论回复
地板
八层楼| | 2023-6-8 09:26 | 只看该作者
主从模式就是定时器的一个模式  而不是我们人为的操作的结果是吗

使用特权

评论回复
5
观海| | 2023-6-8 10:20 | 只看该作者
如何能保证不同定时器输出的同步性呢

使用特权

评论回复
6
guanjiaer| | 2023-6-8 11:34 | 只看该作者
两个级联的定时器是需要同时进行更新的吗

使用特权

评论回复
7
heimaojingzhang| | 2023-6-8 12:06 | 只看该作者
guanjiaer 发表于 2023-6-8 11:34
两个级联的定时器是需要同时进行更新的吗

严格说来肯定不可能的 但是目前的应用是远远可以满足了

使用特权

评论回复
8
keaibukelian| | 2023-6-8 13:04 | 只看该作者
这是在一个定时器的初始化代码中 配置另一个定时器?

使用特权

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

本版积分规则

37

主题

84

帖子

1

粉丝