求助STM32F407VG串口通信接收数据有误

scofield_michea 2013-01-17 11:31:40

使用原厂的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);
}

}
...全文
1227 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
qzxfv 2015-01-21
  • 打赏
  • 举报
回复
求楼主帮助,我也是和你一样的板子,也是同样的问题,但不知道怎么改,楼主可用的例子能否发给我,万分感谢1290815000@qq.com
serebiij10 2013-09-04
  • 打赏
  • 举报
回复
引用 22 楼 scofield_michea 的回复:
问题找到了,大意马虎电路图看错了,PA9 和 PA10 被占用了,换成USART2就没问题了,感谢大家帮助。
请问是PA2,PA3的,还是remap到PD5和PD6啊。
caveguy 2013-09-02
  • 打赏
  • 举报
回复
PA9 和 PA10 被占用了怎么还会有数据出来??
scofield_michea 2013-01-23
  • 打赏
  • 举报
回复
问题找到了,大意马虎电路图看错了,PA9 和 PA10 被占用了,换成USART2就没问题了,感谢大家帮助。
lr2131 2013-01-22
  • 打赏
  • 举报
回复
引用 20 楼 Alex_rcpilot 的回复:
前几天才扔掉一片207VET6,也不知道怎么弄坏的。上电之后微热,可以进SWD调试,全速运行和端点调试均无碍,但就是IO口没反应,有些口线始终输出低电平,似乎只是内核在工作。换掉之后就好了。 搞这些,手里还是得留点储备的,关键时候硬件嫌疑实在太大了就换片子。
可能是那几个管脚烧了,之前我也遇到过。
Simality 2013-01-22
  • 打赏
  • 举报
回复
前几天才扔掉一片207VET6,也不知道怎么弄坏的。上电之后微热,可以进SWD调试,全速运行和端点调试均无碍,但就是IO口没反应,有些口线始终输出低电平,似乎只是内核在工作。换掉之后就好了。 搞这些,手里还是得留点储备的,关键时候硬件嫌疑实在太大了就换片子。
lr2131 2013-01-22
  • 打赏
  • 举报
回复
引用 18 楼 scofield_michea 的回复:
引用 17 楼 lr2131 的回复:引用 16 楼 scofield_michea 的回复: 引用 13 楼 lr2131 的回复:有数据收到至少硬件该是没问题的。做回环测试,如果通信正常,那就是波特率等等的软件方面设置有问题。 回环测试不成功,发现发送的数据不能被正常接收,经常有发出数据但是接收不到的情况,偶尔收到的数据也并非是自己发送的。很奇怪,串口通信这么简单……
这回环测试本身就是在对硬件和最基本的设置做检查,是不是!!!如果设置正确(这个其实比较容易做到),那剩下的不就是对硬件做检查吗,这不就是在做串口的软硬件最小系统检查吗,这不就是在对硬件做检查吗。如果软件上没问题这样做还是不通,那当然是硬件有问题啦!!! 上面的各位仁兄绝大多数都说是设置的问题,特别都说是波特率的问题,那都是基于你的硬件没问题的基础上来说的,因为你也没有直接和间接说硬件可能有问题。不过一般情况,99%的情况都是这样,所以就这么给你说。 但是我个人的习惯是喜欢稳打稳扎的做好每一步,特别是新的硬件,或者说不能确保硬件没问题时,我都是一上来做回环测试,等双方各自回环通过了再对接。这样的好处是可以检查硬件和设置,是不是,剩下的就是双方之间的物理联线了和通信设置了。 就算是波特率的问题,就算是晶振不准,就算是其他设置不对,你要仔细想想,串口自己给自己做的回环,就算设置不对,那也是对的,为什么!!!收发双方都是自己,收发的设置也一模一样,你怎么说是错的。设置本身没有对错一说,只有匹配不匹配一说是不是,不匹配改双方其中一个都可以你怎么说这是错的!!!除非你能设置你的串口收和发用不同的设置。 假如说你自己只会说中文,那你一定能听懂自己说的中文,自己都听不懂那还得了,那就说明自己嘴巴或耳朵有问题,或者从嘴巴到耳朵之间声音被隔离了(这个可以排除)。如果还是不行,那自然是自己的嘴巴有问题或者是耳朵有问题啦!管它对面是不是老外呢,这就是检查自己的方法。 但是保险起见,之前还是建议你要保证你的最基本设置,通信的代码简单可靠。然后硬件上,尽量不走那些可以不走的路线,也就是说走最短的路线,最小单元的检查嘛。不要走什么电平转换芯片,出来MCU后马上就回环,如果串口内部支持回环的设置那测试的可靠性就更好了。 这些都保证了,还是不行,那确认是串口有问题了。那到底是从MCU的管脚出来就有问题(可能性很小)还是在这后面的硬件有问题(可能性比较大)就需要自己排查了。怀疑是板子做工不行,在从MCU引出来后线路有问题,那么是RX还是TX不通还是都不通呢???,你有万用表和示波器或逻辑分析仪就好查了。如果板子上你用到的串口硬件没用到什么电平转换芯片啥的,那确定很可能是板子做工不好,什么地方出现了虚焊,或者说其他原因导致的线路不通(我的硬件学的很烂,也给不了太多建议)。另外,建议你要多看看开发板的注意事项和电路图,是不是有些注意事项没做到,或者说硬件线路上什么拨码开关没拨对或者是哪些跳线帽没短接或者是哪些跳线没短接或者是外部没接接上拉电阻....
Simality 2013-01-21
  • 打赏
  • 举报
回复
引用 14 楼 scofield_michea 的回复:
发现很奇怪的问题,调用库函数 USART_SendData(USART1, '2');无法完成对寄存器DR的写操作,在函数调用前后仍然DR的值一直都是0x00,即使直接对寄存器进行赋值仍然不可以。 赋值语句如下:USART1->DR = (0x55); 该语句执行前后DR的值没有任何变化。 查看控制寄存器的值:CR1 = 0x0000206C,该设置的标志位都设置上……
正常,不是所有寄存器都能通过监控窗口实时看到实际值的,DR就是这类寄存器。它本来就是由TDR和RDR两个物理寄存器构成的一个逻辑地址。程序里没必要去读刚才发送出去的字节是什么内容,所以就没做成这个功能。调试器返回寄存器内容显示在调试窗口里,它获取寄存器内容的机理和固件读取寄存器的机理是一样的。往外发的内容读不出来。 还是用仪器检测端口的物理活动最直接。
scofield_michea 2013-01-21
  • 打赏
  • 举报
回复
引用 17 楼 lr2131 的回复:
引用 16 楼 scofield_michea 的回复: 引用 13 楼 lr2131 的回复:有数据收到至少硬件该是没问题的。做回环测试,如果通信正常,那就是波特率等等的软件方面设置有问题。 回环测试不成功,发现发送的数据不能被正常接收,经常有发出数据但是接收不到的情况,偶尔收到的数据也并非是自己发送的。很奇怪,串口通信这么简单的事儿,只写一个控制寄存器就可以完成,为什么出现这样那样的问题,……
用的官方发布的正品开发板,但是不带技术支持(淘宝买的),官方没有可执行的串口通信程序。一直怀疑硬件有问题,但是如何证实呢?
lr2131 2013-01-21
  • 打赏
  • 举报
回复
引用 16 楼 scofield_michea 的回复:
引用 13 楼 lr2131 的回复:有数据收到至少硬件该是没问题的。做回环测试,如果通信正常,那就是波特率等等的软件方面设置有问题。 回环测试不成功,发现发送的数据不能被正常接收,经常有发出数据但是接收不到的情况,偶尔收到的数据也并非是自己发送的。很奇怪,串口通信这么简单的事儿,只写一个控制寄存器就可以完成,为什么出现这样那样的问题,之前用过STM32F103的开发板……
回环测试都不通过这问题感觉就大了。如果软件上用最简单最可靠的代码来做回环都不能通过,且基本的联线无误那一定是硬件问题了。 检查方法: 1.用最简单最可靠的代码,最好是官方提供的demo来让开发板的串口工作,注意其他可以不用的模块就不开,需要用的一定要用的就设置好。 2.注意你的串口是不是有什么电平转换啊啥的,这里最好是从开发板的MCU上从串口出来的联线不要经过其他的什么模块,这样一步一步的排查。有些MCU(MSP430F1611)甚至支持软件设置来让硬件内部rx和tx连接来做自回环测试。 回环是最基本最简单的,如果回环都不行,你都不用直接连双方了。打个比方,自己给自己说话,自己都听不到或者听不清或者听不懂,还指望别人能听到听清听懂吗!!!
scofield_michea 2013-01-21
  • 打赏
  • 举报
回复
引用 13 楼 lr2131 的回复:
有数据收到至少硬件该是没问题的。做回环测试,如果通信正常,那就是波特率等等的软件方面设置有问题。
回环测试不成功,发现发送的数据不能被正常接收,经常有发出数据但是接收不到的情况,偶尔收到的数据也并非是自己发送的。很奇怪,串口通信这么简单的事儿,只写一个控制寄存器就可以完成,为什么出现这样那样的问题,之前用过STM32F103的开发板和STM32F107的开发板,很容易就调通了的。这个STM32F407 Discovery有人用过么,如果有调试好的串口程序能否发来一份,小弟对照比较,不胜感激啊。 邮箱as-long-as@163.com
scofield_michea 2013-01-20
  • 打赏
  • 举报
回复
发现很奇怪的问题,调用库函数 USART_SendData(USART1, '2');无法完成对寄存器DR的写操作,在函数调用前后仍然DR的值一直都是0x00,即使直接对寄存器进行赋值仍然不可以。 赋值语句如下:USART1->DR = (0x55); 该语句执行前后DR的值没有任何变化。 查看控制寄存器的值:CR1 = 0x0000206C,该设置的标志位都设置上了呢,为什么DR不能写操作呢?求指点!
lr2131 2013-01-19
  • 打赏
  • 举报
回复
有数据收到至少硬件该是没问题的。做回环测试,如果通信正常,那就是波特率等等的软件方面设置有问题。
john_liqinghan 2013-01-19
  • 打赏
  • 举报
回复
void USART1_IRQHandler(void) { if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE) != RESET) { USART_SendData(USART1 ,USART_ReceiveData(USART1)); while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET); USART_ClearFlag(USART1,USART_FLAG_RXNE); USART_ClearITPendingBit(USART1,USART_IT_RXNE); } }
scofield_michea 2013-01-18
  • 打赏
  • 举报
回复
抱歉抱歉,居然把最关键的部分漏发了。以下是UART配置的函数。
void USART_Configuration(void)
{

USART_InitTypeDef USART_InitStructure;

USART_DeInit(USART1);

USART_InitStructure.USART_BaudRate = 9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No ;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;


/* Configure USART1 basic and asynchronous paramters */
USART_Init(USART1, &USART_InitStructure);
    
  /* Enable USART1 */
  USART_Cmd(USART1, ENABLE);
}
查过了控制寄存器,没有问题,示波器看过上位机发送数据的波特率,是正确的,跟打架一样,深切怀疑是波特率的问题,总觉得是时钟配置错误导致的的。 但是尝试过按照时钟设定systemtick,这个是对的,说明主时钟设置应该是对的吧。大家能否帮忙分析下原因呢?如果谁有调试过的串口程序,请发我邮箱as-long-as@163.com,小弟现行谢过了!
Simality 2013-01-18
  • 打赏
  • 举报
回复
引用 10 楼 scofield_michea 的回复:
Tx引脚设置正确,发送数据0x55,示波器看到的图像却是这样的,低电平没拉下来,为什么呢
TX脚是完全开路测试的么?先断开一切外围再测试。包括有源的和无源的外围器件。 我现在手里用的是F2系列的,初始化流程不一样。暂时没法做详细比较。
scofield_michea 2013-01-18
  • 打赏
  • 举报
回复

Tx引脚设置正确,发送数据0x55,示波器看到的图像却是这样的,低电平没拉下来,为什么呢
Simality 2013-01-18
  • 打赏
  • 举报
回复
引用 5 楼 scofield_michea 的回复:
查过了控制寄存器,没有问题,示波器看过上位机发送数据的波特率,是正确的,跟打架一样,深切怀疑是波特率的问题,总觉得是时钟配置错误导致的的。……
死脑筋了吧,接收多被动啊,你直接写一个发送语句,发个0xAA或者0x55什么的,拿示波器量一下一个bit是多宽不就知道实际波特率是多少了?有时候可能是RCC那边的时钟设置问题造成的。如果存在倍频关系,通常不会那么容易在数据上直接看出来,因为起始位和停止位之类都相应地被缩放了。
scofield_michea 2013-01-18
  • 打赏
  • 举报
回复
寄存器的值贴出来,大家帮忙看下呗。

关于波特率,仔细算了下应该是对的
Tx/Rx BuadRate = (26880000)/8*(2-0)*(14.5625) = 11536
期望配置的波特率是115200,误差范围内啊。

大家帮忙看下呗,除了波特率还会是什么原因引起接收和发送数据的错误呢?
scofield_michea 2013-01-18
  • 打赏
  • 举报
回复
引用 6 楼 woshi_ziyu 的回复:
可以尝试一下修改USART_InitStructure.USART_BaudRate = 9600;的波特率

看看什么时候是正确 然后确定系统是否存在倍频或者其他情况

试过了,尝试了115200,2400,等波特率,还是不行。查看系统时钟如下:

外部晶振是8M。
加载更多回复(5)

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧