毕业论文开发语言企业开发JAVA技术.NET技术WEB开发Linux/Unix数据库技术Windows平台移动平台嵌入式论文范文英语论文
您现在的位置: 毕业论文 >> 嵌入式 >> 正文

STM32F407VG串口通信接收数据有误

更新时间:2013-1-25:  来源:毕业论文

STM32F407VG串口通信接收数据有误

使用原厂的STM32F407VG Discovery开发板,进行串口通信的调试。发现接收数据有错误
比如接收到0x55的时候没有问题,接收到0x74的时候却变成了0x11,接收0x33,变成了0x66。。。
原厂开发板,晶振8M,系统时钟配置也是8M,没有更改例程的内容。配置代码如下,请各位大虾帮忙,不胜感激。

int main(void) {  NVIC_InitTypeDef NVIC_InitStructure;     /* Configure the system clocks */   RCC_ClocksTypeDef RCC_Clocks;     /* SysTick end of count event each 10ms */  RCC_GetClocksFreq(&RCC_Clocks);   SysTick_Config(RCC_Clocks.HCLK_Frequency / 100);      /********************* NVIC Configuration **********************/  /* Enable the USARTx Interrupt */  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;   NVIC_Init(&NVIC_InitStructure);  NVIC_Config();        /*GPIO Config*/  GPIO_InitTypeDef GPIO_InitStructure;     /* Enable GPIO clock */  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOA, ENABLE);      /* Enable UART clock */  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);        /************************GPIO Config************************/  GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);     /* Connect PXx to USARTx_Rx*/  GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);       GPIO_StructInit(&GPIO_InitStructure);        /* Configure USART Tx as alternate function  */  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   GPIO_Init(GPIOA, &GPIO_InitStructure);     /* Configure USART Rx as alternate function  */  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;   GPIO_Init(GPIOA, &GPIO_InitStructure);          /************************GPIO Config************************/  USART_Configuration();   USART_ITConfig(USART1, USART_IT_TXE, ENABLE);   USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);     while (1)   {      Delay(0xfFFFFF);      Delay(0xfFFFFF);      USART_SendData(USART1, 3);     } } /*ISR 函数*/void USARTx_IRQHANDLER(void) {    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)    {     /* Read one byte from the receive data register */    RxData = USART_ReceiveData(USART1);       RxData = 0x000000FF&RxData;     USART_SendData(USART1, RxData+1);    }   }

接收多被动啊,你直接写一个发送语句,发个0xAA或者0x55什么的,拿示波器量一下一个bit是多宽不就知道实际波特率是多少了?有时候可能是RCC那边的时钟设置问题造成的。如果存在倍频关系,通常不会那么容易在数据上直接看出来,因为起始位和停止位之类都相应地被缩放了。

有数据收到至少硬件该是没问题的。做回环测试,如果通信正常,那就是波特率等等的软件方面设置有问题

正常,不是所有寄存器都能通过监控窗口实时看到实际值的,DR就是这类寄存器。它本来就是由TDR和RDR两个物理寄存器构成的一个逻辑地址。程序里没必要去读刚才发送出去的字节是什么内容,所以就没做成这个功能。调试器返回寄存器内容显示在调试窗口里,它获取寄存器内容的机理和固件读取寄存器的机理是一样的。往外发的内容读不出来。

还是用仪器检测端口的物理活动最直接。

设为首页 | 联系站长 | 友情链接 | 网站地图 |

copyright©youerw.com 优尔论文网 严禁转载
如果本毕业论文网损害了您的利益或者侵犯了您的权利,请及时联系,我们一定会及时改正。