你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

关于串口USART的两个问题_stm32f10x

[复制链接]
xj731020999 提问时间:2014-8-8 23:16 /
 问题如下,特别奇怪,百思不得其解,求高手指点一二,谢谢。

主要功能就是串口接收字符串,并发送字符串中以‘@’开头和以‘#’结尾之间的字符串。
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("\r\n请开始输入字符串开始,#结束\r\n");
       
       
        while(1)
                {       
                        if( USART_State )  
                                        {  
                                                        printf("%s\r\n",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));   //清空串口发送寄存器
<span style="font-size: larger;">                        for(i=0,temp_Counter+=1; i
收藏 1 评论9 发布时间:2014-8-8 23:16

举报

9个回答
feel-376797 回答时间:2014-8-9 07:01:18

RE:关于串口USART的两个问题_stm32f10x

ram有没有足够大
回答时间:2014-8-9 09:23:47

RE:关于串口USART的两个问题_stm32f10x

具体说一下你的芯片名称,一般芯片的RAM是32K,甚至一部分是16K。按32K算,还要去掉一些其他的变量、寄存器的空间。实际没有32K这么大。楼主定义32K,肯定会超出RAM空间的。
串口溢出的时候,要先读取串口数据,再清除溢出标志位。
串口发送的间隔是多少?如果太短,还未等到要发生,他就又重新计算了数据。
xj731020999 回答时间:2014-8-9 11:48:02

回复:关于串口USART的两个问题_stm32f10x

回复第 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+字符就很流畅……非常困惑……感觉代码没问题啊……
 
谢谢您的耐心回复~

 

 
xj731020999 回答时间:2014-8-9 11:48:47

回复:关于串口USART的两个问题_stm32f10x

回复第 2 楼 于2014-08-09 07:01:18发表:
ram有没有足够大
 
恩。应该是ram的问题,我忽略了,谢谢~
 
回答时间:2014-8-11 10:27:57

RE:关于串口USART的两个问题_stm32f10x

1、调用这个只是读取走串口中的数据,这样才能清除掉溢出中断,读取到哪儿都无所谓了。
2、能不能把你发送的数据贴出来一下。串口中i是一个8位的变量,这个会不会有影响?
xj731020999 回答时间:2014-8-11 19:15:34

回复:关于串口USART的两个问题_stm32f10x

回复第 6 楼 于2014-08-11 10:27:57发表:
1、调用这个只是读取走串口中的数据,这样才能清除掉溢出中断,读取到哪儿都无所谓了。
2、能不能把你发送的数据贴出来一下。串口中i是一个8位的变量,这个会不会有影响?
 
谢谢您的耐心回复……
问题已经全部解决……
1、32768不行是因为SRAM的限制
2、发送字符串长度不够是因为溢出中断的问题,加了那个清ORE的if以后就解决了……
现在长度也上去了,至少测试的是70+的字符串都没问题……速度也上去了,现在设置的1ms/次没问题
3、您说的i太小的问题,确实是一个我的疏忽,这个i最好是跟buffer的元素个数一致,不然到时超过256的字符串就会出问题了……
 
谢谢您的帮助~~
 
回答时间:2014-8-12 09:36:19

RE:关于串口USART的两个问题_stm32f10x

如果有问题,可以到论坛留贴,我们第一时间为您解答。
原田夜舞love 回答时间:2016-11-15 21:39:56
peter001 回答时间:2016-11-16 01:05:00
学习一下

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版