问答

汇集网友智慧,解决技术难题

21ic问答首页 - F460 DMA串口发送 软件AOS触发问题

技术交流 os DMA 串口发送 触发 软件

F460 DMA串口发送 软件AOS触发问题

woai32lala2021-07-30
#define USART_DMA_UNIT                     (M4_DMA1)
#define RX_DMA_CH                          (DmaCh0)
#define RX_DMA_TRG_SEL                     (EVT_USART1_RI)
#define TX_DMA_CH                          (DmaCh1)
#define TX_DMA_TRG_SEL                     (EVT_USART1_TI)

/* DMA block transfer complete interrupt */
#define RX_DMA_BTC_INT_NUM                 (INT_DMA1_TC0)
#define RX_DMA_BTC_INT_IRQn                (Int006_IRQn)
#define TX_DMA_BTC_INT_NUM                 (INT_DMA1_TC1)
#define TX_DMA_BTC_INT_IRQn                (Int005_IRQn)
void dma_tx_init(void)
{
    stc_dma_config_t stcDmaInit;
    stc_irq_regi_conf_t stcIrqRegiCfg;

    /* Enable peripheral clock */
    PWC_Fcg0PeriphClockCmd(PWC_FCG0_PERIPH_DMA1 | PWC_FCG0_PERIPH_DMA2,Enable);

    /* Enable DMA. */
    DMA_Cmd(USART_DMA_UNIT,Enable);

    /* Initialize DMA. */
    MEM_ZERO_STRUCT(stcDmaInit);

    stcDmaInit.u16BlockSize = 10u; /* 1 block */
    stcDmaInit.u32SrcAddr = ((uint32_t)(send_buff)); /* Set source address. */
    stcDmaInit.u32DesAddr = (uint32_t)(&USART_CH->DR);     /* Set destination address. TDR*/
    stcDmaInit.stcDmaChCfg.enLlpEn = Disable;         /* Disable linked list transfer. */
    stcDmaInit.stcDmaChCfg.enSrcInc = AddressIncrease;  /* Set source address mode. */
    stcDmaInit.stcDmaChCfg.enDesInc = AddressFix;  /* Set destination address mode. */
    stcDmaInit.stcDmaChCfg.enIntEn = Enable;       /* Enable interrupt. */
    stcDmaInit.stcDmaChCfg.enTrnWidth = Dma8Bit;   /* Set data width 8bit. */
    stcDmaInit.u16TransferCnt = 1;  
    DMA_InitChannel(USART_DMA_UNIT, TX_DMA_CH, &stcDmaInit);

    /* Enable the specified DMA channel. */
    DMA_ChannelCmd(USART_DMA_UNIT, TX_DMA_CH, Enable);

    /* Clear DMA flag. */
    DMA_ClearIrqFlag(USART_DMA_UNIT, TX_DMA_CH, TrnCpltIrq);

    /* Enable peripheral circuit trigger function. */
    PWC_Fcg0PeriphClockCmd(PWC_FCG0_PERIPH_PTDIS,Enable);


    /* Set DMA trigger source. */


    DMA_SetTriggerSrc(USART_DMA_UNIT, TX_DMA_CH, EVT_AOS_STRG);


    /* Set DMA block transfer complete IRQ */
    stcIrqRegiCfg.enIRQn = TX_DMA_BTC_INT_IRQn;
    stcIrqRegiCfg.pfnCallback = &Dma_TX_IrqCallback;
    stcIrqRegiCfg.enIntSrc = TX_DMA_BTC_INT_NUM;
    enIrqRegistration(&stcIrqRegiCfg);
    NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT);
    NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn);
    NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn);
   AOS_SW_Trigger();


}
以上就是初始化,没法正常输出,有时候会输出一个字节
还想请问下 block是指 的是一次发送数据的量吧,u16TransferCnt 这个是指发送数据的次数  总数据量应该是 block*u16TransferCnt 吧。不知道这里有没有理解错误
回答 +关注 8
3369人浏览 3人回答问题 分享 举报
3 个回答

  • 看一下,用户手册,DMA章节。DMA+USART发送,属于存储器到外设。块大小,要设置成1,用传输的字节数(如10个字节)配置传输次数。如果使用软件触发源,每次软件触发,应该只能传输1个字节。建议,设置USART发送寄存器空做为触发源,如,DMA_SetTriggerSrc(DMA_UNIT, DMA_CH_TX, EVT_USART4_TI);/* Set DMA trigger source. */
    例程参考如下,
    https://bbs.21ic.com/icview-3024868-1-1.html
  • 大佬们都没用过么
  • 捣鼓了好几天了,一直不成功,希望各位大佬帮忙看看,谢谢各位了

您需要登录后才可以回复 登录 | 注册