CH571的定时器PWM模式怎么用DMA的

文档写的DMA起始结束地址只有14位有效,16K的地址空间不是在codedate区吗image.png

所以是得在固定地址定义缓存区吗image.png

例程没翻到DMA的demo

这里14位指的是RAM:

image.png

我们TMR例程中是有PWM DMA的

image.png


好的多谢,看的是PWM例程,没注意


@TECH_Rzz

测试用例程DMA循环模式正常,单次模式一直有问题,DMA缓存起始结束地址怎么修改都是发送大约七十多个PWM才停止

__attribute__((aligned(4))) uint32_t PwmBuf[48];
#if 1 /* 定时器2,DMA PWM.*/
    GPIOA_ModeCfg(GPIO_Pin_11, GPIO_ModeOut_PP_5mA);
    //GPIOPinRemap(ENABLE, RB_PIN_TMR2);

    TMR2_PWMCycleCfg(72); // 周期72/60M 1.2us
    PwmBufWriteData();

    TMR2_DMACfg(ENABLE, (uint16_t)(uint32_t)&PwmBuf[0], (uint16_t)(uint32_t)&PwmBuf[5], Mode_Single);
    TMR2_PWMInit(High_Level, PWM_Times_1);

    TMR2_ClearITFlag(TMR1_2_IT_DMA_END);
    PFIC_EnableIRQ(TMR2_IRQn);
    TMR2_ITCfg(ENABLE, TMR1_2_IT_DMA_END);

#endif

__attribute__((interrupt("WCH-Interrupt-fast")))
__attribute__((section(".highcode")))
void TMR2_IRQHandler(void)
{
    if(TMR2_GetITFlag(TMR0_3_IT_CYC_END))
    {
        TMR2_ClearITFlag(TMR0_3_IT_CYC_END);
        /* 计数器计满,硬件自动清零,重新开始计数 */
        /* 用户可自行添加需要的处理 */
    }
    if(TMR2_GetITFlag(TMR1_2_IT_DMA_END))
    {
        TMR2_ClearITFlag(TMR1_2_IT_DMA_END);
        PRINT("DMA end\n");
        /* DMA 结束 */
        /* 用户可自行添加需要的处理 */
        R8_TMR2_CTRL_MOD &= ~RB_TMR_COUNT_EN;
        GPIOA_ResetBits(GPIO_Pin_11);
    }
}



在使用single模式,需要做如下处理:

自行定义一个DMA地址,手动关闭中断;image.png

可以留一个邮箱将对应工程发送给你


好的多谢,邮箱:个人信息保护,已隐藏


已发送,注意查收


只有登录才能回复,可以选择微信账号登录