其实单片机中的串口和中断问题就像设定使碗接到10滴水就溢出

其实单片机中的串口和中断问题就像设定使碗接到10滴水就溢出

170fd6c6418af9a5671075357bd28694.png

///插播一条:我自己在今年年初录制了一套还比较系统的入门单片机教程,想要的同学找我拿就行了免費的,私信我就可以哦~点我头像黑色字体加我地球呺也能领取哦。最近比较闲,带做毕设,带学生参加省级或以上比赛///8cfcb63d019c0ab993809e331b2927a0.png在学习单片机的过程中,我们经常会发现中断、串口是学习的难点,对于初学者来说,这几部分的内容是很难理解的。但是我个人觉得这几部分内容是重点,如果在一个学期的课堂学习或者自学中没有理解这几部分内容,那就等于还没有掌握51单片机,那更谈不上单片机的开发了,我们都知道在成品的单片机项目中,有很多是以这几部分为理论基础的,万年历是以定时器为主的,报警器是以中断为主的,联机通讯是以串口为主的。

在这几部分内容中,计数器/定时器对于初学者说很容易搞混淆,下面我将对这方面的内容结合自己的学习经验来讲一下。

记数器和定时器是相同的,他们都是对单片机中产生的脉冲进行计数,只不过计数器是单片机外部触发的脉冲,定时器是单片机内部在晶振的触发下产生的脉冲。当他们的脉冲间隔相同的时候,计数器和定时器就是一个概念。

在定时器和计数器中都有一个溢出的概念,那什么是溢出了。我们可以从一个生活小常识得到答案,当一个碗放在水龙头下接水的时候,过了一会儿,碗的水满了,就发生溢出。同样的道理,假设水龙头的水是一滴滴的往碗里滴,那么总有一滴水是导致碗中的水溢出的。在碗中溢出的水就浪费了,但是在单片机的中溢出将导致一次中断。

在定时器计数器中,我们有个概念叫容量,就是最大计数量。

把水滴比喻成脉冲,那么导致碗中水溢出的最后一滴水就是定时计数器溢出的最后一个脉冲。

在各种单片机书本中,在介绍定时计数器时都讲到一个计数初值,那什么是计数初值呢?在这里我们还是假设水滴碗。假设第一百滴水能够使碗中的水溢出,我们就知道这个碗的容量是100。

70c691500453f927cc241b70e66053ce.png

举例:我如何才能使碗接到10滴水就溢出呢?我可以想象,如果拿一个空碗去接水,那么还是得要100滴水才能溢出,但是如果我们拿一个已经装有水的碗去接,那就不用100滴了。

类似这种引起硬件中断冲突的问题,通常是代码不良问题。中断处理占用时间太久,导致其他中断异常。比如,我见过的糟糕的代码,是在中断里用CPU延时的。

硬件中断要求快进快出,一般不要在中断中处理实际业务。

比方说,串口接收中断中,只处理将数据加入缓存,然后置标志位或发信号量方式通知主程序或任务进行数据解析。定时中断也是如此。除非进行I/O操作,都应采用通知方式处理业务。

少数情况下,业务时序要求特别高的,那也应该采用在硬中断中开启软中断方式,来处理业务。这样优先级会低于所有的硬中断,不会影响其他中断触发,又保证业务实时处理。

Stm32f407已经非常强悍了,不用怀疑处理器会有问题。我曾经的一个407应用,几乎开启了所有的外设,以太网,USB,串口,SPI,I2C,Camera,外挂液晶屏,还跑一个很耗处理器的算法,一点没问题。

1,波特率调低

2,定时器调长

3,中断里面少干一点活,需要干的活弄成队列缓冲好到主函数中去处理。

要坚信一点,无论优先级高低,所有代码都有被调用的机会。串口中断,定时器中断,CPU代码,都是被同时调度。

如果偏监控,最好不要用定时器。我用STC的8位机也遇到过类似问题,定时器运转的太快,导致外部中断响应的非常不流畅。这个应该是业务逻辑和程度架构问题,应该从程序框架从新设计……

猜你喜欢

转载自blog.csdn.net/danpianji777/article/details/124728362