本帖最后由 cry1109 于 2019-8-27 17:29 编辑
USART2接收放在接收中断里了,发送数据通过DMA发送。不通过DMA发送时可以正常发送所有数据,可是通过DMA通道发送数据时,只发送了一帧数据中的最后一个字节数据。DMA配置函数如下:
static void DMA_Config(void)
{
/* Deinitialize DMA channels */
DMA_GlobalDeInit();
DMA_DeInit(DMA1_Channel0); //USART2 TX 通道
/* DMA channe0 Tx of USART Configuration */
DMA_Init( USART_DMA_CHANNEL_TX, //DMA通道
(uint16_t)TxBuffer, //指向要发送数据的内存地址
(uint16_t)USART2_DR_ADDRESS, //外设地址 (USART2 数据寄存器地址)
DATA_TO_TRANSFER, //待传送数据的大小 DATA_TO_TRANSFER
DMA_DIR_MemoryToPeripheral, //DMA传输方向,内存到外设
DMA_Mode_Normal, //DMA工作模式
DMA_MemoryIncMode_Inc, //内存增量递增
DMA_Priority_High, //DMA通道优先级
DMA_MemoryDataSize_Byte); //每次传输1个字节 DMA_MemoryDataSize_Byte
/* Enable the USART Tx/Rx DMA requests */
USART_DMACmd(USART2, USART_DMAReq_TX, ENABLE);
//USART_DMACmd(EVAL_COM1, USART_DMAReq_RX, ENABLE);
/* Global DMA Enable */
DMA_GlobalCmd(ENABLE);
}
发送数据代码如下:
USART_ITConfig(USART2, USART_IT_RXNE, DISABLE);
//GPIO_SetBits(GPIOC, GPIO_Pin_4); //enabe RS485 send
Comm_Data_OK = 1;
DMA_ClearFlag(DMA1_FLAG_TC0); //clear send complete flag清除发送完毕标志
DMA_Cmd(DMA1_Channel0, DISABLE);
DMA_SetCurrDataCounter(DMA1_Channel0, TxCounter); //9
DMA_Cmd(DMA1_Channel0, ENABLE);
USART2经过RS232接口和上位机通讯。最初是由USART1通过485和上位机通讯,通过DMA发送一切正常,现在改成USART2通过232后就不行了?
|