yangjiaoshai 发表于 2021-9-10 11:00

hc32f460串口发送


发数,不知道哪里出问题了,设置发送11次,只有9个数出来,设置13,才有11个数据发送出来

tianmeijiao 发表于 2021-9-10 11:24

CH340为什么导致蓝屏啊?

martinhu 发表于 2021-9-10 13:56

你用的例程吗?是MCU收到什么回复什么?

yangjiaoshai 发表于 2021-9-13 14:32

本帖最后由 yangjiaoshai 于 2021-9-13 14:34 编辑

martinhu 发表于 2021-9-10 13:56
你用的例程吗?是MCU收到什么回复什么?
自己照着论坛和手册改的一个模板出来,
发送函数:
void    usart_send(uint8_t *pbuff, uint16_tsize)
{
    uint16_t i;

    DMA_SetBlockSize(DMA_UNIT1, DMA_CH1_TX, 1);
    DMA_SetTransferCnt(DMA_UNIT1, DMA_CH1_TX, 13);
    DMA_SetSrcAddress(DMA_UNIT1, DMA_CH1_TX, (uint32_t)(uart1_rcv));
    DMA_ChannelCmd(DMA_UNIT1, DMA_CH1_TX, Enable);
                DMA_ClearIrqFlag(DMA_UNIT1, DMA_CH1_TX, TrnCpltIrq);
    USART_FuncCmd(USART_CH1, UsartTx, Enable);
    USART_FuncCmd(USART_CH1, UsartTxEmptyInt, Enable);
}
发送DMA配置:

static void DmaUartTxInit(void)
{
      
    stc_dma_config_t stcDmaInitTX;
    stc_irq_regi_conf_t stcIrqRegiCfgTX;

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

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

    /* Initialize DMA. */
    MEM_ZERO_STRUCT(stcDmaInitTX);
    stcDmaInitTX.u16BlockSize = 1u; /* 1 block */
                stcDmaInitTX.u16TransferCnt = 11u;
    stcDmaInitTX.u32SrcAddr = (uint32_t)(uart1_TX); /* Set source address. */
    stcDmaInitTX.u32DesAddr = ((uint32_t)(&USART_CH1->DR));//&USART_CH->DR);   /* Set destination address. */
    stcDmaInitTX.stcDmaChCfg.enSrcInc = AddressIncrease;/* Set source address mode. */
    stcDmaInitTX.stcDmaChCfg.enDesInc = AddressFix;/* Set destination address mode. */
    stcDmaInitTX.stcDmaChCfg.enIntEn = Enable;       /* Enable interrupt. */
    stcDmaInitTX.stcDmaChCfg.enTrnWidth = Dma8Bit;   /* Set data width 8bit. */


    DMA_InitChannel(DMA_UNIT1, DMA_CH1_TX, &stcDmaInitTX);


    /* Set DMA trigger source. */
    DMA_SetTriggerSrc(DMA_UNIT1, DMA_CH1_TX, EVT_USART1_TI);

    /* Set DMA block transfer complete IRQ */
    stcIrqRegiCfgTX.enIRQn = Int003_IRQn;//DMA_BTC_TX_INT_IRQn;//DMA_BTC_INT_IRQn;//int numb
    stcIrqRegiCfgTX.pfnCallback = &DmaTXBtcIrqCallback;//callback fun
    stcIrqRegiCfgTX.enIntSrc = INT_DMA1_TC1;//DMA_BTC_TX_INT_NUM;//int sourc
    enIrqRegistration(&stcIrqRegiCfgTX);
    NVIC_SetPriority(stcIrqRegiCfgTX.enIRQn, DDL_IRQ_PRIORITY_DEFAULT);
    NVIC_ClearPendingIRQ(stcIrqRegiCfgTX.enIRQn);
    NVIC_EnableIRQ(stcIrqRegiCfgTX.enIRQn);
}

电脑发数给板子,板子收到数据后,置一个标志,然后去主while里去调用发送函数,发送长度是直接设置的,与接收数据个数没关系。接收数组长度为20,大于发送数据的个数

kiwis66 发表于 2021-9-13 14:42

就是总差两个?
回车换行?

martinhu 发表于 2021-9-14 13:54

你这里的发送框里面只有11个字节啊,发送的数组定义是多长???
期望它回复多出两个字节?

yangjiaoshai 发表于 2021-11-11 12:31

搞定了,原因是在DMA的传输完成中断内就把发送关闭了,此时传送还没完成。
页: [1]
查看完整版本: hc32f460串口发送