打印
[技术问答]

hc32f460串口发送

[复制链接]
4727|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主

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

46652613ac9f2af0bd.png (193.55 KB )

46652613ac9f2af0bd.png

使用特权

评论回复
沙发
tianmeijiao| | 2021-9-10 11:24 | 只看该作者
CH340为什么导致蓝屏啊?

使用特权

评论回复
评论
martinhu 2021-9-10 13:57 回复TA
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_t  size)
{
    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,大于发送数据的个数

使用特权

评论回复
5
kiwis66| | 2021-9-13 14:42 | 只看该作者
就是总差两个?
回车换行?

使用特权

评论回复
6
martinhu| | 2021-9-14 13:54 | 只看该作者
你这里的发送框里面只有11个字节啊,发送的数组定义是多长???
期望它回复多出两个字节?

使用特权

评论回复
评论
yangjiaoshai 2021-11-11 10:07 回复TA
跟接收长度没关系,接收数组长度是20,预填了数值的,接收数据就相当于一个触发源,接收完后然后发送,就将接收数组里面的前面13个数据发送出来,始终少2个字节。你们没有碰到类似问题吗,难道是哪里设置有问题 
7
yangjiaoshai|  楼主 | 2021-11-11 12:31 | 只看该作者
搞定了,原因是在DMA的传输完成中断内就把发送关闭了,此时传送还没完成。

使用特权

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

本版积分规则

11

主题

43

帖子

2

粉丝