CH32_TIM触发DMA的应用
使用定时器触发DMA是比较好用的一种操作,这里将对此做个示例说明。
EVT的例程中有一个 TIM_DMA 的例程,其功能是启用一个定时器,设置其中一路通道输出PWM,使用 TIM_CH 事件来触发DMA,然后用DMA搬运数据到 CCR 寄存器,从而来改变PWM的占空比。
该示例演示通过 TIM_UP 请求来触发DMA搬运数据。本例中通过DMA从内存中搬运数据修改 GPIOx->OUTDR 寄存器的值,从而实现修改GPIO口输出电平。使用该方式下可以实现同步控制一组GPIO口的输出,可以当作方波或是PWM输出等功能。
只需在例程代码中做简单修改即可,用以控制PB0.1.2.3.4输出或者低。可以用作并口高速输出。
// BSRR寄存器数据,高16位用于清除端口,低16位用于设置端口
uint8_t buff[4] ={0x0E, 0x0D, 0x0B, 0x07};
TIM1_PWMOut_Init(100, 48000 - 1, buff[0]);
TIM1_DMA_Init(DMA1_Channel5, (u32)&GPIOB->OUTDR, (u32)pbuf, 4);//DMA以字节长度搬运。不影响PB端口高字节位输出。
TIM_DMACmd(TIM1, TIM_DMA_Update, ENABLE);
TIM_Cmd(TIM1, ENABLE);
TIM_CtrlPWMOutputs(TIM1, ENABLE);
while(1)
{
while(DMA_GetFlagStatus(DMA1_FLAG_TC5)!=RESET)
{
i++;
DMA_ClearFlag(DMA1_FLAG_TC5) ;
if (i%2) {
GPIO_SetBits(GPIOB, GPIO_Pin_15);
break;
}
GPIO_ResetBits(GPIOB, GPIO_Pin_15);//PB15单独控制,不影响PB端口高字节位输出。
}
}
将PB0-3接LED,可以实现依次亮灭的结果。
接逻辑分析仪如下:
同样也可以用更新中断控制WS2812,见\EVT\CH32V20xEVT1.9\EVT\EXAM\APPLICATION\WS2812_LED
此例程中的其一方法就是通过TIM的更新事件不断改变输出的PWM的占空比以控制WS2812。诸如此类,可以通过TIM触发DMA控制各种外设的寄存器,符合使用规范即可。