本帖最后由 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);
}
}
|