stm32串口中断丢失数据,情况如下,请帮忙解决啊!!!

stm32串口中断丢失数据,情况如下,请帮忙解决啊!!!,第1张

并不是上位机太快,而是你把程序写慢了。

两个问题:

1)接收中断函数里怎么能有发送标志位的判断?

这句去掉:while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)

2)你这个串口用的方式不对,你每接收一个数据需要进一次中断,实际上应该是进一次中断把所有数据接收完毕。通过一个超时判断判断是否后续还有数据,没有数据了才退出中断函数。

有可能是光盘的质量问题,也有可能是

刻录软件

问题,还有可能是刻录时速度的问题,建议使用较慢的速度来

刻录光盘

,保证程序的稳定性,还有光盘建议使用质量好些的,DVD是比较好的。如果还不行,有可能是刻录机有问题了。

我们知道,我们的程序是放在Flash里的,这个Flash可以存储的时间长,即使断电也不会丢失,可以想象类似我们的手机ROM,一般比较大。所以我们的启动方式就选择这个,看他的芯片手册可以直到怎么去选择。其他两种方式我还不是很了解,后期我学习后会分享给大家。

2. 中断向量表

在正式开始之前,要知道一个东西,中断向量表,很重要。

中断向量表就是中断向量的列表。

中断向量表在内存中保存,其中存放着中断源(中断向量号或者中断类型号)所对应的中断处理程序的入口地址。

一个中断源对应一个中断处理程序,这种关系索引表,就是中断向量表。

中断是很重要的东西对吧,中断的实现就是由中断向量表中的程序实现的,假如这一个定时器中断,它会对应中断表中一项,这一项放着中断处理程序的地址,这个有点像指针。记得之前手写过一些中断(异常)向量表,是ARM汇编,有兴趣的可以了解一下。

3. 启动过程

为什么每次上电都是可以执行哪些程序呢?因为我们选择的是Flash启动。他是怎么找到那些我们烧录的程序的。每次启动就是一次中断,对应中断向量表中的复位中断,这就找到了我们的程序。

3.1 STM32启动文件

我们以具体的代码来说明。

项目里有个startup_stm32f103xb.s的文件,这就是启动文件。我们先看看他的描述。

******************** (C) COPYRIGHT 2017 STMicroelectronics ********************

* File Name : startup_stm32f103xb.s

* Author : MCD Application Team

* Description: STM32F103xB Devices vector table for MDK-ARM toolchain.

* This module performs:

* - Set the initial SP

* - Set the initial PC == Reset_Handler

* - Set the vector table entries with the exceptions ISR address

* - Configure the clock system

* - Branches to __main in the C library (which eventually

*calls main()).

* After Reset the Cortex-M3 processor is in Thread mode,

* priority is Privileged, and the Stack is set to Main.

******************************************************************************

从这个文件看一看出来启动过程大致分为五步:

初始化堆栈指针。

设置PC指针的值。

设置中断向量表。

配置系统时钟。

调用C库函数__main()。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7779213.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-09
下一篇 2023-04-09

发表评论

登录后才能评论

评论列表(0条)

保存