QQ 1274510382
Wechat JNZ_aming
商业联盟 QQ群538250800
技术搞事 QQ群599020441
解决方案 QQ群152889761
加入我们 QQ群649347320
共享学习 QQ群674240731
纪年科技aming
网络安全 ,深度学习,嵌入式,机器强化,生物智能,生命科学。
纸上得来终觉浅,绝知此事要躬行 !!!寻找志同道合伙伴抱团创业中。。。
STM32是由STMicroelectronic公司开发的32位微处理器集成电路.其内核是Arm的Cortex架构
.I/O口众多,功能强大.
飞控系统◉‿◉
“工欲善其事,必先利其器”开发板
程序仿真错误,只有烧入到开发板上才能看到对不对
STM32F103系列,性价比高、应用广泛.
eg:野火STM32开发板 正点原子新战舰
板子质量都可以,关键是资料很详细,对新手很友好.
熟悉了STM32的使用之后
自己要开发一些小玩意的时候考虑到成本可以购买最小系统板.
2.开发环境常用的开发环境有KEIL和IAR.目前来看用KEIL的人比较多
有内存限制,一开始前几个小程序还好,到后面LCD显示就悲催了,
因为LCD的程序较大,所以一直报错,
百度了好久才找到原因.直接搜索KEIL注册机,按照说明进行破解就行了.
还需要下载STM32F10x_StdPeriph_Lib_V3.5.0,编程用到的库函数都来自于这个文件
程序的烧录有三种方式
ST-Link,J-Link和串口下载
串口烧录工具mcuisp比较方便,用的频率也比较高
STM32CubeMX 简单的设置可以自动生成模版 配置工程
3.三本参考资料
《STM32 参考手册》和《Cortex-M3 权威指南》《STM32 不完全手册-库函数版本 》
4.一个简单的例子各种寄存器、串口、花里胡哨的外设之前,
不如先做一个点亮LED灯的实验.这个不需要什么基础,
基本概念印象,知道STM32的基本原理、实现过程
5.调试技巧Keil可以设置寄存器来查看结果,
一般是直接编译没有错误之后直接烧录看运行情况,
这样的结果更加直观而且比较方便.
关于程序:
- 可以右键go to definition来查看各个函数的申明与定义
- 看别人程序会看到u16,u32,uint等等代表的是无符号整数
- 有些函数参数使用了const &是传常量引用调用,为的是提高运行效率
开发所需资料:
STM32F1XX芯片电路原理图STM32F1XX系列芯片手册
XX代表系列版本号,ARM公司开发的芯片大多数都是一样的,除非增加了新功能才会更正芯片手册,XX就代表该文档支持系列版本!
第一步,分析电路原理图首先第一步打开STM32F1XX芯片的电路原理图:找到LED模块电路的原理图,其次也是看一下这个板子上有没有设计LED电路模块找到之后代表该板子已经设计了LED电路模块,那么放大来看一下:从LED模块电路原理图中可以看到,每个LED(LED1-LED8)都有一个二极管(D1-D8)连接着
二极管的两个引脚具有正负极区分,从原理图中可以得知该二极管的正极对应着LED,而负极对应着输入源
(图1.3)
所以如果我们想要让LED灯亮起,首先要经过连接在LED上的二极管,所以我们要让该二极管工作,从输入源里输入一个低电平,即可让二极管的负极一端引脚工作,相反输入高电平则二极管的负极一端不会产生任何作用!
(二极管极性连接识别方法)
并且输入源中设有两个排阻,每个排阻中有四个电阻,用于简化PCB板设计但内部电阻作用原理图并没有明确给出,博主推断应该是上拉下拉电阻用于限流作用除此之外同时又得知该电路模块最大承受电平值为+3.3v(0-3.3v)LED模块的电路原理图看懂了,那么就要知道LED模块连接在处理器的哪个总线上!
看一下电路原理图中,CPU这一块的连接电路原理图每个LED模块(1-8)分别对应着PC特殊功能寄存器(0-7bit位)知道LED对应的特殊功能寄存器,那么就要知道该特殊功能寄存器挂设在哪个总线上,映射地址是多少特殊功能寄存器?什么是映射地址?
答:
特殊功能寄存器
本质上也是一个存储单元
和内存里的存储单元没有什么区别,
只是内存里的存储单元用于存储单字节数据的,
而微型处理器内部的存储单元往往都是4字节或8字节作为一个单元,
用于做特殊计算/操作时用到的,
比如DS段寄存器用于存储地址,它的大小决定了CPU的寻址能力!
CPU会根据DS寄存器里的地址来寻址,
再则地址总线位宽也要和DS寄存器一致,
假如说地址总线位宽小于DS寄存器
那么地址总线将没有能力表示出大于自身的地址!
什么叫映射地址?
答:
这里做个比喻,假如说你家住某某小区xx栋楼xx号室,
那么这个地址就是你房间的地址,
每次点外卖或者快递我们一般都会填写这个地址,
那么快递员有了这个地址就可以轻而易举的找到我们的房间并把货物递送给我们,
这个地址就是你房间的映射,
而对特殊功能寄存器的映射如上所说,
就是把开发板上的一个物理地址分配给它,就叫做地址映射!
内存是由很多个内存单元组成的,每个内存单元占8个bit位(1字节)也就是说内存中有多少个内存单元就意味着可以存储多少个字节,下面是一个只有两个内存单元的内存概念图上图只是根据CPU通过前端总线与北桥和内存之间进行交互画的概念图,并非真正PCB设计图,这里只是讲解CPU是如何与内存单元通讯的。
地址总线:
地址总线的位宽决定了CPU的寻址范围能力,
地址总线越多CPU能寻址的范围也就越大,
地址总线就相当于计数器,告诉我们寻址范围,
地址总线是连接在内存的电路接口处的,
地址总线的位宽以2的次方来算。
上图是一个有两个内存单元的RAM,所以一根地址总线就可以表示,
2的1次方为2,所以CPU的寻址最大范围是2,
对应的编号就是00,01,
内存中的存储顺序是以0开始的,这也是为什么数组下标都是以0开始。
数据总线:
数据总线决定了内存中有多少bit位,
当通过地址总线找对应的内存单元时
可以通过与指定内存单元连接的数据总线将数据传送回来!
数据总线的位宽决定了一次可以传送多少个bit 位回来,一般均为8bit!
位宽不能代表有多少根数据总线.
位宽决定了数据总线一次传输bit 位的能力,
比如上图有两个内存单元,CPU 通过地址总线找到了第二个内存单元的地址,
此时的数据总线位宽为:位;
那么一次可以将第二个内存单元里的bit 全部读取出来,
那么倘若将第一个内存单元和第二个内存单元全部读取出来,
那么需要分两次来读,如果数据总线的位宽是16 位,
那么可以一次读完,
数据总线的位宽是和地址总线直接挂钩的,
假如说数据总线的宽度是32 位,每一次读取数据都会动用32 根数据总线来读取,
也就是一次可以读取4 字节,同时地址总线一次寻址范围也必须能够满足4字节,
也就是说每一次寻址都需要2根地址总线!
如果地址总线不满足要求则会出现硬件中断等,
还有就是如果地址总线的一次寻址范围是4字节倘若数据总线跟不上的话则会分开读取!
不过一般情况下数据总线的位宽是和地址总线的位宽成正比例的,
这也是为什么C语言和很多编程软件会有内存对齐机制!
控制总线:
控制总线告诉CPU对这块内存单元做怎样的操作,
读还是写,
同样控制总线也是接在电路接口处的,
控制总线的位宽决定了CPU能对电子元件有多少种控制方法,
一般情况下内存中只有一根控制总线,
因为一般情况下内存就是读与写!
上面介绍的是地址总线,数据总线,控制总线都属于前端总线,
前端总线是将CPU与北桥芯片和内存连接起来的通讯线路,
因为内存不属于CPU内部结构单元,
内存是在主板上的所以CPU是不能直接操作内存的,
需要通过前端总线与北桥交互,
北桥芯片通过外部总线将内存中的数据送到一级缓存中去,
CPU在通过内部总线将其取到寄存器中!
当然除此之外还有其他总线:
外部总线:
用来连接各种外设控制芯片,
如主板上的I/O控制器,(如硬盘接口控制器、软盘驱动控制器、 串行/并行接口控制器等),和键盘控制器,
包括外部地址线(XAB),外部数据线(XMB)和外部控制线(XCB)。
内部总线:
将处理器的所有结构单元内部相连,
它的宽度可以是8,16,32,或64位。
如在CPU内部,
寄存器之间和算术逻辑部件ALU与控制部件之间传输数据所用的总线称为内总线
即芯片内部的总线 ,
内部总线也分地址总线(AB),数据总线(MB),控制总线(CB)
系统总线:
前端总线,外部总线都属于系统总线,
系统总线就是连接CPU,存储器,和一切外部设备的通路,
内部总线不属于系统总线,
因为内部总线是CPU内部用于连接内部结构单元的通讯线路!
这里要说一下北桥与内存连接的前端总线是内存上的,
与CPU连接的前端总线是北桥与CPU连接的前端总线,
北桥与CPU连接的前端总线的位宽决定CPU内部的一级缓存的寻址范围,
北桥先通过数据总线取出值,然后通过与CPU连接的前端总线将数据送往一级缓存中,送入一级缓存时会顺序的写入!
倘若一级缓存爆满,则会等待CPU处理完毕在写入!
CPU要往内存中写数据的话也是如此,
通过与北桥连接的前端总线将要寻址的地址通过地址总线传输过去然后通过数据总线将数据发送过去,
在通过控制总线告诉北桥芯片往内存里写数据,
最后在由北桥通过与内存连接的前端总线将数据写到内存中的指定内存单元里!
注意这里要说一点的是,当CPU向内存中写数据时,
与CPU连接的前端总线的地址总线位宽是一级缓存的位宽,
那么怎么表示内存中的寻址范围呢?
答:
当CPU向内存中写数据时通过地址总线将要选中的地址码发给北桥芯片
(在这里位宽只表示一次能发送多少个bit位),
而北桥获取这个地址码后根据地址码通过与内存连接的地址总线选中内存中响应的内存单元,
与内存连接的地址总线位宽决定内存中的寻址范围大小,
当你的寻址范围大小超过地址总线的位宽时北桥则不会去寻找,
直接报硬件中断错误!
重点:
北桥是根据与内存连接的地址总线的位数来判断内存中有多少个内存单元的!
注意在购买CPU时要看好前端总线是否被CPU支持,
比如8086的CPU一次寻址时要求前端总线必须是16的倍数,
也就是说CPU一次寻址范围必须大于16个bit位(两个字节),
刚好一个前端总线即可表示!
总结:
CPU在读取内存中的数据时先通过前端总线与北桥交互,
北桥芯片将内存中的数据送到一级缓存中,
在由CPU通过内部总线将一级缓存中的数据取出放到指令寄存器里,
然后执行,这里怎么区分读或写?
首先内存中的指令是组合好的,
一条完整的指令是由操作码地址码操作数组合完成,
CPU根据操作码决定执行那些操作,
在CPU指令集里读和写的指令集是区分开的,
通过地址码选中对应的地址,将立即数写入,如果是读的话没有立即数!
这里讲一个读的过程:
从内存单元00读出放到内存单元01中:
CPU先与北桥交互取出00内存单元中的数据放到一级缓存中,
CPU在通过内部总线将其取出放到通用寄存器里,
最后在将其通过前端总线与北桥交互放到内存单元01处!
在挑选CPU时前端总线必须是CPU支持的,否则无法正常运行,
比如8086CPU支持的地址总线位宽必须是16的倍数,也就是说如果你的前端总线位宽不足以16的话将无法正常工作。
最后在给大家看一下内存单元究竟是怎样的:
上图的存储器属于较老版本的,现代的内存条都已经将存储单元封装起来了,不可见!
这里拿出来只是为了让大家知道内存单元长什么样子,现代的内存条内存单元非常小容量却没有任何变化!
https://blog.csdn.net/b***z_cxy/article/details/80081886
|