打印

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

[复制链接]
3682|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
#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 吧。不知道这里有没有理解错误

使用特权

评论回复
沙发
woai32lala|  楼主 | 2021-7-30 17:51 | 只看该作者

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

捣鼓了好几天了,一直不成功,希望各位大佬帮忙看看,谢谢各位了

使用特权

评论回复
板凳
woai32lala|  楼主 | 2021-7-31 08:25 | 只看该作者
大佬们都没用过么

使用特权

评论回复
地板
h32446975| | 2021-7-31 11:15 | 只看该作者

看一下,用户手册,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

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

107

主题

534

帖子

5

粉丝