[ARM入门]假如--我变成了单片机

嗞~~~~~

一股温和的电流流进了我的身体,我从沉睡中醒来,感受着心脏稳定的跳动,我的大脑高速的运转着,我感觉到了他的运转速度,很快,非常快,一秒几十兆的运算速度,我感觉我无所不能。同时,我拥有了几十上百个手脚。我,是单片机?

渐渐地,我也发现了我的缺点,我好像脑容量比较小,感觉不能记得很多东西,我虽然思维活跃,但是好像能量很小,我的能量全来自于唤醒我的那股温和的电流,他虽然稳定,但是他所能够提供的能量很少,我可以灵活地抬放我的手脚,但是它们好像并不能拎起多大多大物体,我好像一无是处。

单片机又称微控制器,是把中央处理器(大脑)、存储器(脑缘系统)、时钟(心脏)、各种输入输出接口(手脚口)等都集成在一块集成电路芯片上的微型计算机。一般单片机的内存较小,输入电压较低,通常为3.3v-5v。运行速度(主频)在几十兆赫兹到几百兆赫兹不等。

STM32F103xx增强型模块框图

随着环境的变化,我突然觉得胸口发蒙,温度太高或者太低都让我的心跳异常,经常犯错。但是我却无可奈何,此时我听到了一个声音:你名为单片机,乃是科技的结晶,虽然你现在像个小丑,但是你可以去闯副本,解锁新的皮肤,新的地图。于是我便沉沉睡去。

当我再起醒来,我感觉背上剧痛,什么!有人在给我纹身,难道是“精忠报国”?难道我将驰骋沙场,立不世之功!原来我的副本是为了保家卫国。。。。。。

后来我才知道,背上纹的是STM32F103RB,这有个啥用啊,哎。

我没想到,这个皮肤有种魔力,让我解锁了新的地图---开发板。

在这个地图上,我拥有了另一颗心脏,一个我似乎可以使用外部的心脏,那家伙挺厉害,很多我适应不了的环境他都可以,不容易产生心跳紊乱,我只需要在我醒来时启动它便好,可好用了。

现在32位单片机内部都会集成一个晶振,即使不外挂晶振也可以正常工作,但是内部晶振收环境影响较为严重,在一些极端场合可能会造成较大的误差,所有一般应用都会外挂一个高精度晶振,可以使单片机更好的工作。

使用8MHz晶体的典型应用

探索新地图

我虽然拥有了强力的心脏,可是我啥也不会呀,我怕黑,想开灯,但是我却无从下手,我看得到地图上有个灯,我不知如何打开,直到我遇到了一个神奇的动物--程序猿。他有着人类一样的外边,但是怎么看怎么像牛,挺奇怪的。

那天,这个程序猿给了我一个开灯的说明书,这个说明书好复杂,让我做了好多事,最后让我用其中一个手拉一下开关就可以开灯,不明白为啥要这么麻烦。但是他有时候也给我很简单的说明书,里面只写了:伸手。然后灯就开了,好神奇。那之前为啥要给我那么复杂的说明书呢?

单片机本身不含任何功能,需要用户编写代码,编译成单片机熟悉的语言烧录进单片机才可实现功能。例如我们点灯,就让控制灯的引脚输出相应电平即可。在ST的开发环境中,ST提供了多种开发方式:直接操作寄存器,标准库,HAL库,LL库。其中寄存器的方式是最直接的方式,单片机的响应最快,代码执行效率最高,同时难度较高;LL库及其接近寄存器,效率次之;标准库对寄存器进行了封装,用户可以直接使用库函数实现功能,不能直面寄存器,是曾经最常用的方式;HAL库是开发最简单的方式,HAL库将寄存器和开发者隔离,开发难度特别小,但是也带来一个问题,就是执行效率相较于前几个更低。

当我会点灯之后,我发现我的思维逻辑好像有问题,我总是一根筋,不会回头,做事只会按照一条线去做。好在程序猿给了我一份新的说明书,书中说道:苦海无涯,回头是岸。反正就是让我主线任务做完了再重新来过,还让我注意自己的手脚,他碰我不同的脚我得暂停主线去做支线任务。做完支线才能回来继续做主线任务。说明书上还交代任务的紧急程度,碰我的1脚我得去做1号支线,如果没做完就碰我的2脚,那我得暂停1号支线去做2号支线的任务,等2号支线任务做完再回来做1号任务,直到两个任务都做完才能回去做主线任务

单片机就是一根筋,只会按照逻辑一直往下执行,当有紧急事件需要处理可借助单片机的中断系统来处理,单片机会暂停当前执行的任务,转向中断安排的任务,并在完成中断后返回之前跳转到节点。

中断嵌套及响应示意图

如上图所示,当中断发生,单片机会将中断发生时刻的状态和参数保存进堆栈,通过中断向量的指引去完成中断的服务任务,执行完中断服务任务后会返回之前的被打断的指令,然后继续向下执行。当正在执行的中断函数遇到更高优先级的中断请求到来,当前的中断任务保存,跳转执行更高优先级的任务,当高优先级的任务执行完成再返回之前的次优先级任务继续执行,直至中断任务全部执行完成后返回主程序。

那天,我发现了另外一块单片机,好不容易见到同类,好想和它聊天,于是我向他呼喊(UART),但是只能发出1和0,它无动于衷。于是程序猿给我一本词典(协议),我按照词典的介绍开始发音,但是对方的语言能力可能不是很好,我说的快了它反应不过来,说的慢了它会漏掉我的话(波特率匹配)。在尝试许久后终于见它有反应了,我也收到了它的回复,它也只会说什么1啊,什么0啊之类的,我只能考词典进行翻译(转码),经过词典翻译,咱俩终于可以畅所欲言啦。随着时间的推移,我们之间的距离越来越远,说话都是断断续续的,即使我叫破了喉咙也不顶用(远距离通信),于是我俩想办法找到了扩音喇叭(RS485芯片),这玩意自带能量供给,不需要我们提供(单独供电),我只需要正常说话,他就会给我放大,即使隔得很远我们也能说话,但是这玩意好像并不是十分好用,因为喇叭的声音太大了,导致我俩同时说话,我都听不到对方说的是啥(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通信

但是这样说话好累啊,我想发出声音怎么办呢?这时我发现自己有一个手上拿着一个蜂鸣器(无源他激型),只要我拼命地摇动,他就会发出声音,我摇动的频率不同,发出的声音就不同,这样我就可以发出不同的声音了,我甚至还可以给自己来首曲子(方波信号输入谐振装置转换为声音信号输出)。就是比较累,我还得算着时间来摇动。

音乐都有了,我还要灯光,可是我手上的灯只能发出一种颜色,要么让他亮,要么要他灭,于是我找到了身上的定时器,我可以让它控制我的手去开关灯(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让你储存离线数据不必节衣缩食!!

我觉得我还有很多很多的很强很强的能力等我发现,但是我突然觉得体内的能量越来越少,渐渐感觉头晕眼花,我可能需要休息一会,不知道小憩一下会不会恢复(睡眠模式),不行的话可能我要好好睡个觉了(深度睡眠),如果能量再少下去我可能就睡昏头了(待机模式),这样再醒来可能之前的事我就全忘记了(停机模式下会丢失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条件,从头开始执行程序。
---------------------
作者:呐咯密密
链接:https://bbs.21ic.com/icview-3249694-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值