PC机通过串口发送数据给STM32,STM32接收用DMA,把收到的数据通过串口发送给PC机,我的程序问题是PC机还没给STM32发数据,但是STM32不停的给PC机发送00,求各位高手帮忙。。。
#include "UART.H"
u8 USART_RX_BUF[4]; //接收缓冲,最大48个字节
_UART1 UART1;
void uart_init(u32 bound)
{
USART_InitTypeDef USART_InitStruct;
GPIO_InitTypeDef GPIO_InitStruct;
NVIC_InitTypeDef NVIC_InitStruct;
DMA_InitTypeDef DMA_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE); //使能GPIO和串口1的时钟
USART_DeInit(USART1); //复位串口1
//GPIO初始化
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9; // PA.9 USART1_TX
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz; //IO口的速度
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP; // 推挽复用输出
GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10; // PA.10 USART1_RX
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING; // 浮空输入
GPIO_Init(GPIOA, &GPIO_InitStruct);
//DMA初始化
DMA_DeInit(DMA1_Channel4); //DMA1 通道4
DMA_InitStruct.DMA_PeripheralBaseAddr=UART1_DR_Address; // 从UART1_DR 中拷贝数据
DMA_InitStruct.DMA_MemoryBaseAddr=(u32)&UART1.UART1ConvertedValue; // UART1数据接收结果保存缓冲
DMA_InitStruct.DMA_DIR=DMA_DIR_PeripheralDST; //DMA数据拷贝方向,从内存到外设
DMA_InitStruct.DMA_BufferSize=4; // DMA拷贝数据一次循环的个数
DMA_InitStruct.DMA_PeripheralInc=DMA_PeripheralInc_Disable; // 外设地址是否增加
DMA_InitStruct.DMA_MemoryInc=DMA_MemoryInc_Enable; //内存地址连续增加
DMA_InitStruct.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte; // 外设数据类型,8字节
DMA_InitStruct.DMA_MemoryDataSize=DMA_MemoryDataSize_Byte; // 内存数据类型
DMA_InitStruct.DMA_Mode=DMA_Mode_Normal; // 工作在正常模式;
DMA_InitStruct.DMA_Priority = DMA_Priority_High; // 优先级
DMA_InitStruct.DMA_M2M = DMA_M2M_Disable; // 是否允许内存到内存传输
DMA_Init(DMA1_Channel4,&DMA_InitStruct);
// DMA_ITConfig(DMA1_Channel4, DMA_IT, ENABLE); // //DMA14传输完成中断
USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE); //串口DMA接收使能
DMA_Cmd(DMA1_Channel4, ENABLE); // 使能DMA,启动 DMA
//USART初始化
USART_InitStruct.USART_BaudRate= bound; //波特率
USART_InitStruct.USART_WordLength= USART_WordLength_8b; //8位字长
USART_InitStruct.USART_StopBits= USART_StopBits_1; //1个停止位
USART_InitStruct.USART_Parity= USART_Parity_No; //无奇偶校验
USART_InitStruct.USART_Mode= USART_Mode_Rx|USART_Mode_Tx; //收发模式
USART_InitStruct.USART_HardwareFlowControl= USART_HardwareFlowControl_None; //无硬件数据流控制
USART_Init(USART1,&USART_InitStruct);
//NVIC初始化
NVIC_InitStruct.NVIC_IRQChannel=USART1_IRQn; //串口中断1
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=3; //抢占优先级3
NVIC_InitStruct.NVIC_IRQChannelSubPriority= 3; //子优先级3
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE; //使能中断
NVIC_Init(&NVIC_InitStruct); //中断优先级初始化
// USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //开启串口接收中断
USART_Cmd(USART1, ENABLE); //使能串口
}
/***************************
串口发送函数
****************************/
void RS232_Send_Data(u8 *buf,u8 len)
{
u8 t;
for(t=0;t<len;t++) //循环发送数据
{
while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
USART_SendData(USART1,buf[t]);
}
while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
}
//开启一次DMA传输
void MYDMA_Enable()
{
u8 i;
for(i=0;i<4;i++)
{
USART_SendData(USART1, UART1.UART1ConvertedValue);
}
}
|