求助STM32F407VG串口通信接收数据有误
使用原厂的STM32F407VG Discovery开发板,进行串口通信的调试。发现接收数据有错误
比如接收到0x55的时候没有问题,接收到0x74的时候却变成了0x11,接收0x33,变成了0x66。。。
原厂开发板,晶振8M,系统时钟配置也是8M,没有更改例程的内容。配置代码如下,请各位大虾帮忙,不胜感激。
int main(void)STM32F407?Discovery
{
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两个物理寄存器构成的一个逻辑地址。程序里没必要去读刚才发送出去的字节是什么内容,所以就没做成这个功能。调试器返回寄存器内容显示在调试窗口里,它获取寄存器内容的机理和固件读取寄存器的机理是一样的。往外发的内容读不出来。
还是用仪器检测端口的物理活动最直接。
[解决办法]
这回环测试本身就是在对硬件和最基本的设置做检查,是不是!!!如果设置正确(这个其实比较容易做到),那剩下的不就是对硬件做检查吗,这不就是在做串口的软硬件最小系统检查吗,这不就是在对硬件做检查吗。如果软件上没问题这样做还是不通,那当然是硬件有问题啦!!!
上面的各位仁兄绝大多数都说是设置的问题,特别都说是波特率的问题,那都是基于你的硬件没问题的基础上来说的,因为你也没有直接和间接说硬件可能有问题。不过一般情况,99%的情况都是这样,所以就这么给你说。
但是我个人的习惯是喜欢稳打稳扎的做好每一步,特别是新的硬件,或者说不能确保硬件没问题时,我都是一上来做回环测试,等双方各自回环通过了再对接。这样的好处是可以检查硬件和设置,是不是,剩下的就是双方之间的物理联线了和通信设置了。
就算是波特率的问题,就算是晶振不准,就算是其他设置不对,你要仔细想想,串口自己给自己做的回环,就算设置不对,那也是对的,为什么!!!收发双方都是自己,收发的设置也一模一样,你怎么说是错的。设置本身没有对错一说,只有匹配不匹配一说是不是,不匹配改双方其中一个都可以你怎么说这是错的!!!除非你能设置你的串口收和发用不同的设置。
假如说你自己只会说中文,那你一定能听懂自己说的中文,自己都听不懂那还得了,那就说明自己嘴巴或耳朵有问题,或者从嘴巴到耳朵之间声音被隔离了(这个可以排除)。如果还是不行,那自然是自己的嘴巴有问题或者是耳朵有问题啦!管它对面是不是老外呢,这就是检查自己的方法。
但是保险起见,之前还是建议你要保证你的最基本设置,通信的代码简单可靠。然后硬件上,尽量不走那些可以不走的路线,也就是说走最短的路线,最小单元的检查嘛。不要走什么电平转换芯片,出来MCU后马上就回环,如果串口内部支持回环的设置那测试的可靠性就更好了。
这些都保证了,还是不行,那确认是串口有问题了。那到底是从MCU的管脚出来就有问题(可能性很小)还是在这后面的硬件有问题(可能性比较大)就需要自己排查了。怀疑是板子做工不行,在从MCU引出来后线路有问题,那么是RX还是TX不通还是都不通呢???,你有万用表和示波器或逻辑分析仪就好查了。如果板子上你用到的串口硬件没用到什么电平转换芯片啥的,那确定很可能是板子做工不好,什么地方出现了虚焊,或者说其他原因导致的线路不通(我的硬件学的很烂,也给不了太多建议)。另外,建议你要多看看开发板的注意事项和电路图,是不是有些注意事项没做到,或者说硬件线路上什么拨码开关没拨对或者是哪些跳线帽没短接或者是哪些跳线没短接或者是外部没接接上拉电阻....