在CH582M的定时器的模式设置寄存器(R8_TMRx_CTRL_MOD)中有一个和重复已发送有关的位:RB_TMR_PWM_REPEAT,对该位的功能描述为:

经过长时间的测试,发现这个位在实际上只对定时器1(TMR1)和定时器2(TMR2)有用。使用该重复发送功能需要配合DMA功能使用。利用DMA自动从数据源取得占空比数据传送给FIFO寄存器,控制定时器产生指定次数的重复的PWM波。
测试代码如下:
#include "CH58x_common.h"
#define PWM_BUF_SIZE 100
uint32_t PwmBuf[PWM_BUF_SIZE] = {1000, 5000, 500, 6000, 100};
void DebugInit(void) {
GPIOA_SetBits(GPIO_Pin_9);
GPIOA_ModeCfg(GPIO_Pin_8, GPIO_ModeIN_PU);
GPIOA_ModeCfg(GPIO_Pin_9, GPIO_ModeOut_PP_5mA);
UART1_DefInit();
}
int main() {
uint8_t i;
SetSysClock(CLK_SOURCE_PLL_60MHz);
/* 配置串口调试 */
DebugInit();
PRINT("Start ......\r\n");
//=======================================TMR1
PRINT("TMR1\n");
// 设置PB10为输出模式
GPIOB_SetBits(GPIO_Pin_10);
GPIOB_ModeCfg(GPIO_Pin_10, GPIO_ModeOut_PP_5mA);
// 映射到PB10
GPIOPinRemap(ENABLE, RB_PIN_TMR1);
// 配置TMR1为PWM模式,输出到PB10
TMR1_PWMCycleCfg(6000); // PWM周期 100us : 6000/(60000000)=0.0001秒
TMR1_PWMInit(High_Level, PWM_Times_4); // 重复发送4次
TMR1_DMACfg(ENABLE, (uint16_t)(uint32_t)&PwmBuf[0], (uint16_t)(uint32_t)&PwmBuf[2], Mode_LOOP);
//=======================================TMR2
PRINT("TMR2\n");
GPIOB_ModeCfg(GPIO_Pin_11, GPIO_ModeOut_PP_5mA);
// 映射到PB11
GPIOPinRemap(ENABLE, RB_PIN_TMR2);
TMR2_PWMInit(Low_Level, PWM_Times_8); // 重复发送8次
TMR2_PWMCycleCfg(6000); // 周期 100us
TMR2_DMACfg(ENABLE, (uint16_t)(uint32_t)&PwmBuf[0], (uint16_t)(uint32_t)&PwmBuf[2], Mode_LOOP);
while(1) ;
}代码的功能是让定时器1由指定的占空比数组获取占空比系数,产生每个占空比发送四次的波形;让定时器2由指定的占空比数组获取占空比系数,产生每个占空比发送八次波形;两个定时器产生的PWM波形的周期都固定为100μs,占空比系数数组长度为2,分别是1000,5000。对应的占空比为1000/6000,5000/6000,即16.67%和83.33%。
程序运行后,逻辑分析仪获得的信号:

对于定时器0和定时器3,如果想要实现同样的结果,无法通过指定RB_TMR_PWM_REPEAT完成,但是可以在中断中通过代码手动实现。
我要赚赏金
