新唐MCU技术
直播中

陈文博

8年用户 970经验值
擅长:测量仪表
私信 关注
[问答]

NANO系列MCU在非PWM波输出引脚上能否利用PDMA和TIMER输出PWM?

更进一步的疑问:1.GPIO的DOUT寄存器能否作为PDMA的目标地址?
2.如果1可行,DMASK寄存器会不会对PDMA写DOUT生效?
我尝试配置了一下,结果会传输失败,PDMA会置位TABORT_IS。

下面是我的配置,目标是在PE15上输出PWM:
const uint32_t DMA_PWM_Data[20] = {
    0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF,
    0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF};

void configPDMA2(void)
{
   CLK_EnableModuleClock(DMA_MODULE);

   PDMAGCR->GCRCSR |= DMA_GCR_GCRCSR_CLK2_EN_Msk;
   // DMA连接tiMER2
   PDMAGCR->DSSR0  = ~DMA_GCR_DSSR0_CH2_SEL_Msk;
   PDMAGCR->DSSR0 |= PDMA_TMR2 << DMA_GCR_DSSR0_CH2_SEL_Pos;

   // 存储到外设
   PDMA2->CSR = (PDMA2->CSR   ~PDMA_CSR_MODE_SEL_Msk) | (0 << PDMA_CSR_MODE_SEL_Pos);
   // 32bit长度
   PDMA2->CSR = (PDMA2->CSR   ~PDMA_CSR_APB_TWS_Msk) | PDMA_WIDTH_32;
   // 源地址循环
   PDMA2->CSR = (PDMA2->CSR   ~PDMA_CSR_SAD_SEL_Msk) | PDMA_SAR_WRA;
   // 目标地址固定
   PDMA2->CSR = (PDMA2->CSR   ~PDMA_CSR_DAD_SEL_Msk) | PDMA_DAR_FIX;

   //
   PE->DMASK = 0x7FFF;

   // 源地址设置
   PDMA2->SAR = (uint32_t) DMA_PWM_Data[5]; // Duty50%
   // 目标地址设置
   PDMA2->DAR = (uint32_t) PE->DOUT;
   // 传输字节数设置
   PDMA2->BCR = 10 * 4;

   // 使能传输完成中断
   // PDMA2->IER |= PDMA_IER_TD_IE_Msk;
   // 使能错误中断,发生错误后应复位DMA
   // PDMA2->IER |= PDMA_IER_TABORT_IE_Msk;
   // NVIC_EnableIRQ(PDMA_IRQn);

   // 打开DMA,开始接收传输请求
   PDMA2->CSR |= PDMA_CSR_TRIG_EN_Msk | PDMA_CSR_PDMACEN_Msk;
}

void configTIMER2(void)
{
   CLK_EnableModuleClock(TMR2_MODULE);
   // TMR2_CLK  12Mhz
   CLK_SetModuleClock(TMR2_MODULE, CLK_CLKSEL2_TMR2_S_HXT, 0);

   TIMER2->PRECNT = 0;
   TIMER2->CMPR = 12000000 / 10 / 10000;

   // 周期模式
   TIMER2->CTL = (TIMER2->CTL   ~TIMER_CTL_MODE_SEL_Msk) | TIMER_PERIODIC_MODE;
   // TIM_IS 用于触发外设
   TIMER2->CTL  = ~TIMER_CTL_CAP_TRG_EN_Msk;
   // 使能TIMER触发PDMA
   TIMER2->CTL |= TIMER_CTL_PDMA_TEEN_Msk;
}




也尝试过把MODE_SEL改成Mem2Mem,结果也是TABORT。

请问是这种做法不可行,还是我的配置不对?

更多回帖

发帖
×
20
完善资料,
赚取积分