01 

嗞~~~~~

一股温和的电流流进了我的身体,我从沉睡中醒来,感受着心脏稳定的跳动,我的大脑高速的运转着,我感觉到了他的运转速度,很快,非常快,一秒几十兆的运算速度,我感觉我无所不能。同时,我拥有了几十上百个手脚。我,是单片机?
渐渐地,我也发现了我的缺点,我好像脑容量比较小,感觉不能记得很多东西,我虽然思维活跃,但是好像能量很小,我的能量全来自于唤醒我的那股温和的电流。
他虽然稳定,但是他所能够提供的能量很少,我可以灵活地抬放我的手脚,但是它们好像并不能拎起多大多大物体,我好像一无是处。
单片机又称微控制器,是把中央处理器(大脑)、存储器(脑缘系统)、时钟(心脏)、各种输入输出接口(手脚口)等都集成在一块集成电路芯片上的微型计算机。
一般单片机的内存较小,输入电压较低,通常为3.3v-5v。运行速度(主频)在几十兆赫兹到几百兆赫兹不等。
▲STM32F103xx增强型模块框图
随着环境的变化,我突然觉得胸口发蒙,温度太高或者太低都让我的心跳异常,经常犯错。但是我却无可奈何,此时我听到了一个声音:
你名为单片机,乃是科技的结晶,虽然你现在像个小丑,但是你可以去闯副本,解锁新的皮肤,新的地图。于是我便沉沉睡去。
当我再起醒来,我感觉背上剧痛,什么!有人在给我纹身,难道是“精忠报国”?难道我将驰骋沙场,立不世之功!原来我的副本是为了保家卫国……
后来我才知道,背上纹的是STM32F103RB,这有个啥用啊,哎~
我没想到,这个皮肤有种魔力,让我解锁了新的地图——开发板。
在这个地图上,我拥有了另一颗心脏,一个我似乎可以使用外部的心脏,那家伙挺厉害,很多我适应不了的环境他都可以,不容易产生心跳紊乱,我只需要在我醒来时启动它便好,可好用了。
现在32位单片机内部都会集成一个晶振,即使不外挂晶振也可以正常工作,但是内部晶振收环境影响较为严重,在一些极端场合可能会造成较大的误差,所有一般应用都会外挂一个高精度晶振,可以使单片机更好的工作。
▲使用8MHz晶体的典型应用
02 

探索新地图
我虽然拥有了强力的心脏,可是我啥也不会呀,我怕黑,想开灯,但是我却无从下手,我看得到地图上有个灯,我不知如何打开,直到我遇到了一个神奇的动物——程序猿。他有着人类一样的外边,但是怎么看怎么像牛,挺奇怪的。
那天,这个程序猿给了我一个开灯的说明书,这个说明书好复杂,让我做了好多事,最后让我用其中一个手拉一下开关就可以开灯,不明白为啥要这么麻烦。
但是他有时候也给我很简单的说明书,里面只写了:伸手。然后灯就开了,好神奇。那之前为啥要给我那么复杂的说明书呢?
单片机本身不含任何功能,需要用户编写代码,编译成单片机熟悉的语言烧录进单片机才可实现功能。
例如我们点灯,就让控制灯的引脚输出相应电平即可。
在ST的开发环境中,ST提供了多种开发方式:直接操作寄存器、标准库、HAL库、LL库。其中,寄存器的方式是最直接的方式,单片机的响应最快,代码执行效率最高,同时难度较高;LL库及其接近寄存器,效率次之;
标准库对寄存器进行了封装,用户可以直接使用库函数实现功能,不能直面寄存器,是曾经最常用的方式;HAL库是开发最简单的方式,HAL库将寄存器和开发者隔离,开发难度特别小,但是也带来一个问题,就是执行效率相较于前几个更低。
当我会点灯之后,我发现自己的思维逻辑好像有问题,我总是一根筋,不会回头,做事只会按照一条线去做。好在程序猿给了我一份新的说明书,书中说道:苦海无涯,回头是岸。
反正就是让我主线任务做完了再重新来过,还让我注意自己的手脚,他碰我不同的脚我得暂停主线去做支线任务。做完支线才能回来继续做主线任务。
说明书上还交代任务的紧急程度,碰我的1脚我得去做1号支线,如果没做完就碰我的2脚,那我得暂停1号支线去做2号支线的任务,等2号支线任务做完再回来做1号任务,直到两个任务都做完才能回去做主线任务。
单片机就是一根筋,只会按照逻辑一直往下执行,当有紧急事件需要处理可借助单片机的中断系统来处理,单片机会暂停当前执行的任务,转向中断安排的任务,并在完成中断后返回之前跳转到节点。
▲中断嵌套及响应示意图
如上图所示,当中断发生,单片机会将中断发生时刻的状态和参数保存进堆栈,通过中断向量的指引去完成中断的服务任务,执行完中断服务任务后会返回之前的被打断的指令,然后继续向下执行。
当正在执行的中断函数遇到更高优先级的中断请求到来,当前的中断任务保存,跳转执行更高优先级的任务,当高优先级的任务执行完成再返回之前的次优先级任务继续执行,直至中断任务全部执行完成后返回主程序。
那天,我发现了另外一块单片机,好不容易见到同类,好想和它聊天。于是,我向他呼喊(UART),但是只能发出1和0,它无动于衷。随后,程序猿给我一本词典(协议),我按照词典的介绍开始发音,但是对方的语言能力可能不是很好,我说的快了它反应不过来,说的慢了它会漏掉我的话(波特率匹配)。
在尝试许久后终于见它有反应了,我也收到了它的回复,它也只会说什么1啊,什么0啊之类的,我只能考词典进行翻译(转码),但是也只能它说一句我回一句,就像对讲机一样(异步串行通信),好在虽然比较麻烦,总算能聊上了。
随着时间的推移,我们之间的距离越来越远,说话都是断断续续的,即使我叫破了喉咙也不顶用(远距离通信),于是我俩想办法找到了扩音喇叭(RS485芯片),这玩意自带能量供给,不需要我们提供(单独供电),我只需要正常说话,他就会给我放大,即使隔得很远我们也能说话。
但是不知怎么的,我们的距离越来越远,远到靠扩音喇叭都无法起作用,但是难不倒我们,我们又找来更先进的设备——无线通信模组,通过这类设备,我们可以实现天南地北通话无误。
在嵌入式开发中,UART串口通信协议是我们常用的通信协议之一,全称叫作通用异步收发传输器(Universal Asynchronous Receiver / Transmitter),是异步串口通信协议的一种。
其工作原理是将传输数据的每个字符一位接一位地传输,它能将要传输的资料在串行通信与并行通信之间加以转换,能够灵活地与外部设备进行全双工数据交换。
UART的通信需要遵守通信协议,同时匹配波特率,才能进行正常的通信。可以将通信过程按下图想象:
▲正常通信
UART发送数据就类似打开门放数据出去,波特率就是控制打开门的速度,当发送方按照一定的速率放出数据,接收方也按相同的速度开关自己的闸门。
那数据就刚好可以一个个进来。如果接收方和发送方的波特率不一样,就可能出现数据当接收方门口的时候门关了,数据进不去,导致接收异常。
▲通信异常
当通信双方距离较远,通信就会受阻,此时可采用485通信,485的出现,是为了解决232通信距离受限的问题。RS-485的数据最高传输速率为10Mbps。RS-485接口是采用平衡驱动器和差分接收器的组合,抗共模干扰能力增强,即抗噪声干扰性好。
RS-485最大的通信距离约为1219m,最大传输速率为10Mbps,传输速率与传输距离成反比,在100Kb/S的传输速率下,才可以达到最大的通信距离,如果需传输更长的距离,需要加485中继器。
RS-485总线一般最大支持32个节点,如果使用特制的485芯片,可以达到128个或者256个节点,最大的可以支持到400个节点。
485通信只需要+、-两根线,或者也叫A、B两根线。A、B两根线的差分电平信号就是作为数据信号传输。由于发送与接收都是用这两根线,也就是说每次只能用作发送或者只能用作接收。所以,485是半双工通信。
▲RS-485通信
03 

但是这样说话好累啊,我想发出声音怎么办呢?
这时我发现自己有一个手上拿着一个蜂鸣器(无源他激型),只要我拼命地摇动,他就会发出声音,我摇动的频率不同,发出的声音就不同,这样我就可以发出不同的声音了,我甚至还可以给自己来首曲子(方波信号输入谐振装置转换为声音信号输出)。
就是比较累,我还得算着时间来摇动。
音乐都有了,我还要灯光,可是我手上的灯只能发出一种颜色,要么让他亮,要么要他灭,于是我找到了身上的定时器,我可以让它控制我的手去开关灯(PWM输出),在一定时间内多让灯多亮一会,再关掉,控制打开和关闭的时间灯光就会一会亮,一会暗。
但是可能我动作得快点(频率大于人眼捕捉频率),不然会一闪一闪的,这好酷啊(动态更改PWM占空比)。
渐渐地,我觉得我还是养一条狗比较好,因为上次我做错事了,但是我钻牛角尖,不愿意放弃,一直死等(程序卡死),导致后面好多事都耽搁了,还导致自己差点出事。
决定还是养个看门狗(就是看门狗),每隔一段时间就去喂狗,它不饿就不会叫,我要是钻牛角尖了,就会忘了喂狗,这样他就会叫,我听到狗叫就会反应过来的。
但是,有问题我也得解决不是,我可以把这件事记在身上的本子上(写FLASH),这样以后就能看看到底咋回事了。
但是我的笔记本挺不好用的,每次都得把这一页擦掉才能写,而且最少得擦掉一页。
但是还是很必要的,因为我每次昏睡后(掉电)都会丢失一些数据(掉电会丢失RAM数据),为了防止我忘记也可以写在上面。
但是我的脑子可能真的有问题,每次再做笔记时总是会屏蔽其他的声音,谁都不能打扰我。
在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续工作,会造成整个系统的陷入停滞状态,发生不可预料的后果。
所以出于对单片机运行状态进行实时监测的考虑,便产生了一种专门用于监测单片机程序运行状态的芯片,俗称“看门狗”(watchdog)。
看门狗的作用是系统CPU正常工作时定时给看门狗喂狗,复位定时器,如果系统出问题,没有给看门狗喂狗,看门狗就由于超时将CPU复位。
一般工程都会使用两个看门狗,一个是独立看门狗,主要用于在代码跑飞之后复位使用,一个是窗口看门狗,主要用于在复位前对于一些重要数据进行保存。小数据量一般可以保存进单片机自己的FLASH中,下次上电还会存在。
注意:
1、每一款单片机的FLASH的大小不尽相同,在操作FLASH之前一定要根据手册确定手里的单片的FLASH的大小,超出FLASH容量的写操作是不被允许的,也无法成功完成数据写入。
2、计算好程序的内存,程序也是保存在FLASH中,如果没有计算好程序的大小,将写FLASH写入程序占用的内存中,会导致程序奔溃。
3、写数据之前必须先对页进行擦除,因为FLASH不能写1,只能写0,所以写之前要通过擦除操作将FLASH页中的数据全部恢复为FF,才能进行写操作,如果该FLASH中存在需要的数据,必须要先将数据读出来存在缓存区,再将页擦除,再进行写数据。
4、数据不超过一页,可连续写入。
5、注意FLASH的操作单位,每次最少写4个字节,可通过手册查询页的大小,因为一般采用的是整页的擦除和写入,不可随意擦写。
6、操作FLASH时会占用总线,会打断你的中断操作,且写FLASH时间一般较长,所以在操作FLASH时要保证单片机预留出足够的时间。
7、详情参见帖子:国民技术G435大容量FLASH让你储存离线数据不必节衣缩食(地址:https://bbs.21ic.com/icview-3208110-1-1.html)
我觉得我还有很多很多的很强很强的能力等我发现,但是我突然觉得体内的能量越来越少,渐渐感觉头晕眼花,我可能需要休息一会,不知道小憩一下会不会恢复(睡眠模式),不行的话,可能我要好好睡个觉了(深度睡眠)。
如果能量再少下去我可能就睡昏头了(待机模式),这样再醒来可能之前的事我就全忘记了(停机模式下会丢失RAM数据)。
呼呼~~
1、睡眠模式:在睡眠模式中,仅关闭了内核时钟,内核停止运行,但其片上外设,CPU核心的外设全都还照常运行,在软件上表现为不再执行新的代码。这个状态会保留睡眠前的内核寄存器、内存的数据。唤醒后 ,若由中断唤醒,先进入中断,退出中断服务程序后,接着执行 WFI指令后的程序;若由事件唤醒,直接接着执行 WFE 后的程序。唤醒延迟:无延迟。(WFI:Wait For Interrupt,WFE:Wait For Event)。
2、深度睡眠模式(停止模式):在停止模式中,进一步关闭了其它所有的时钟,于是所有的外设都停止了工作,但由于其 1.2V 区域的部分电源没有关闭,还保留了内核的寄存器、内存的信息,所以从停止模式唤醒,并重新开启时钟后,还可以从上次停止处继续执行代码。
唤醒后,若由中断唤醒,先进入中断,退出中断服务程序后,接着执行 WFI指令后的程序;若由事件唤醒,直接接着执行 WFE 后的程序。
停止模式唤醒后,STM32会使用 HSI(f1的HSI为8M,f4为12M)作为系统时钟。所以,有必要在唤醒以后,在程序上重新配置系统时钟,将时钟切换回HSE。
唤醒延迟 :基础延迟为 HSI振荡器的启动时间,若调压器工作在低功耗模式,还需要加上调压器从低功耗切换至正常模式下的时间,若 FLASH 工作在掉电模式,还需要加上 FLASH 从掉电模式唤醒的时间。
3、待机模式:它除了关闭所有的时钟,还把 1.2V区域的电源也完全关闭了,也就是说,从待机模式唤醒后,由于没有之前代码的运行记录,只能对芯片复位,重新检测 boot条件,从头开始执行程序。
注:以上蓝色内容仅是作者个人理解,黑体部分纯属瞎编乱造,如有错误,欢迎指正!
作者:呐咯密密
来源:21ic论坛
-END-

往期推荐:点击图片即可跳转阅读
继续阅读
阅读原文