完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
问题如下,特别奇怪,百思不得其解,求高手指点一二,谢谢。
主要功能就是串口接收字符串,并发送字符串中以‘@’开头和以‘#’结尾之间的字符串。 1、当调整USART_Rx_Buffer[4096]数组个数时会出现问题,当大于4096(具体没测试,换成32768肯定出问题)时,运行程序会卡在HardFault_Handler中断。 网上查了下,只知道局部变量会进堆栈,且受到Stack_Size EQU 0x00000400的限制,但是我声明的是全局变量,应该不会存在类似问题啊,但是问题还是发生了,也就是说全局变量数组的个数还是有上限的,请问怎么计算,或者查找? 亦或者是其他问题造成的硬件HardFault_Handler中断? 请问怎么解决? 2、目前程序功能是实现了,问题是,当发送字符串大于估计有25+左右字符的时候,发送几次就停止了……我串口助手那端设置的自动循环发送…… 当发送字符数较小的字符串时,一点问题没有……很奇怪,不知道是什么问题造成的? 请问如何解决? 3、看了一些资料说STM32的USART有一个中断bug,请问是否值得是ore溢出的标志位bug,如果是请问怎么在代码上做修改,谢谢。 请问2的问题是否是因为这个问题产生的呢?目前只能瞎猜了…… 诚心请教! #include "stm32f10x.h" #include "usart1.h" #include u8 USART_State = 0; uint16_t Uart1_Len; unsigned char USART_Rx_Buffer[4096]; //串口接收数据缓冲区 unsigned char USART_Tx_Buffer[4096]; //串口发送数据缓冲区 uint16_t temp_Counter = 0; uint16_t Rx_Counter = 0; /* * 函数名:main * 描述 :主函数 * 输入 :无 * 输出 :无 */ int main(void) { /* USART1 config 115200 8-N-1 */ USART1_Config(); NVIC_Configuration(); printf("rn请开始输入字符串开始,#结束rn"); while(1) { if( USART_State ) { printf("%srn",USART_Tx_Buffer); USART_State = 0; Rx_Counter = 0; temp_Counter = 0; } } } void USART1_IRQHandler(void) { u8 i; if(USART_GetITStatus(USART1,USART_IT_RXNE) != RESET) //中断产生 { USART_Rx_Buffer[Rx_Counter] = USART_ReceiveData(USART1); if(USART_Rx_Buffer[Rx_Counter] == '@') //头 temp_Counter = Rx_Counter; if((USART_Rx_Buffer[temp_Counter] == '@')&&(USART_Rx_Buffer[Rx_Counter] == '#')) //检测到头的情况下检测到尾 { Uart1_Len = Rx_Counter - temp_Counter - 1; //长度 memset(USART_Tx_Buffer,0,sizeof(USART_Tx_Buffer)); //清空串口发送寄存器 for(i=0,temp_Counter+=1; i |
|
相关推荐
9个回答
|
|
ram有没有足够大
|
|
|
|
具体说一下你的芯片名称,一般芯片的RAM是32K,甚至一部分是16K。按32K算,还要去掉一些其他的变量、寄存器的空间。实际没有32K这么大。楼主定义32K,肯定会超出RAM空间的。
串口溢出的时候,要先读取串口数据,再清除溢出标志位。 串口发送的间隔是多少?如果太短,还未等到要发生,他就又重新计算了数据。 |
|
|
|
回复第 3 楼 于2014-08-09 09:23:47发表:
具体说一下你的芯片名称,一般芯片的RAM是32K,甚至一部分是16K。按32K算,还要去掉一些其他的变量、寄存器的空间。实际没有32K这么大。楼主定义32K,肯定会超出RAM空间的。 串口溢出的时候,要先读取串口数据,再清除溢出标志位。 串口发送的间隔是多少?如果太短,还未等到要发生,他就又重新计算了数据。 stm32f103rc ARM 32-bit Cortex-M3 Microcontroller, 72MHz, 256kB Flash, 48kB SRAM, PLL, Embedded Internal RC 8MHz and 32kHz, Real-Time Clock, Nested Interrupt Controller, Power Saving Modes, JTAG and SWD, 4 Synch. 16-bit Timers with Input Capture, Output Compare and PWM, 2 16-bit Advanced Timer, 2 16-bit Basic Timer, 2 16-bit Watchdog Timers, SysTick Timer, 3 SPI/I2S, 2 I2C, 5 USART, USB 2.0 Full Speed Interface, CAN 2.0B Active, 3 12-bit 16-ch A/D Converter, 2 12-bit D/A Converter, SDIO, Fast I/O Ports 1、恩,这么看来多半是sram不够的原因了,多谢! 2、串口溢出的网上找了一个版本,那您看对吗?我看的不是很明白…… if(USART_GetFlagStatus(USART2,USART_FLAG_ORE) == SET) //溢出 { USART_ClearFlag(USART2,USART_FLAG_ORE); //读SR USART_ReceiveData(USART2); //读DR } 加在中断后面…… 他调用了USART_ReceiveData,但是这个寄存器的内容,读到哪去了呢,如果是想利用USART_Tx_Buffer继续存起来,应该怎么处理呢?还有这个溢出中断不是发送中断标志位,不该置位的时候置位,就算中断吗,在中断程序里,怎么体现的? 3、串口时间我都调整过,最少的是10ms/次,最长的是100ms/次,都会应为25+个字符的数组停止接收,短的例如10+字符就很流畅……非常困惑……感觉代码没问题啊…… 谢谢您的耐心回复~ |
|
|
|
|
|
|
|
|
|
|
|
回复第 6 楼 于2014-08-11 10:27:57发表:
1、调用这个只是读取走串口中的数据,这样才能清除掉溢出中断,读取到哪儿都无所谓了。 2、能不能把你发送的数据贴出来一下。串口中i是一个8位的变量,这个会不会有影响? 谢谢您的耐心回复…… 问题已经全部解决…… 1、32768不行是因为SRAM的限制 2、发送字符串长度不够是因为溢出中断的问题,加了那个清ORE的if以后就解决了…… 现在长度也上去了,至少测试的是70+的字符串都没问题……速度也上去了,现在设置的1ms/次没问题 3、您说的i太小的问题,确实是一个我的疏忽,这个i最好是跟buffer的元素个数一致,不然到时超过256的字符串就会出问题了…… 谢谢您的帮助~~ |
|
|
|
如果有问题,可以到论坛留贴,我们第一时间为您解答。
|
|
|
|
|
|
学习一下
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1980 浏览 1 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
1836 浏览 3 评论
4416 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
1985 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
2489 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-19 13:49 , Processed in 0.778565 second(s), Total 88, Slave 71 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号