分享

说好的读源码变成了学习教程(无刷银剑固件)

 云深无际 2021-12-15
本来是想写个源码分析的,结果分析了半道发现和我想的不一样,就当一个STM32的学习指南了。

银🗡是这个芯片,我没有安装

这是固件的代码组织形式,源码+驱动+芯片标准库

这些是编译时候加的目录,我觉得看源码这个是很重要的

外设

驱动

源码

我们可以去我提供的网站下载对应的pack包

http://www.armfly.com/armbbs/bbs/96992/Keil.STM32F0xx_DFP.2.1.0.pack

下载的位置

https://cloud.tencent.com/developer/article/1605195

这里提供MDK的下载版本

多线程快

一开始没有

安装

再这里安装

然后就有了

CMSIS是什么?

ARM Cortex 微控制器软件接口标准(CMSIS:Cortex Microcontroller Software Interface Standard) 是 Cortex-M 处理器系列的与供应商无关的硬件抽象层(英文原文为:a vendor-independent hardware abstraction layer for the Cortex-M processor series and defines generic tool interfaces--来自ARM官方定义)。使用CMSIS,可以为处理器和外设实现一致且简单的软件接口,从而简化软件的重用、缩短微控制器新开发人员的学习过程,并缩短新设备的上市时间。软件的创建被嵌入式行业公认为主要成本系数。通过在所有Cortex-M 芯片供应商产品中标准化软件接口,这一成本会明显降低,尤其是在创建新项目或将现有软件迁移到新设备时。

这个东西就好像是我们一听见说一个芯片是ARM内核的,其实这个ARM内核就是对应的CMSIS,就好像是一个底层的构件。

https://arm-software.github.io/CMSIS_5/General/html/index.html

CMSIS 的创建是为了帮助行业实现标准化。它支持跨各种开发工具和微控制器的一致软件层和设备支持。CMSIS 并不是一个巨大的软件层,它引入了开销并且没有定义标准外设。因此,硅行业可以使用此通用标准支持各种基于 Arm Cortex 处理器的设备。

标准化其实是一种强制手段,一家多大叫标准化,不过标准化了好啊,学一个就行,你居然不高兴?

这是驱动芯片的所有文件

HAL 库

  HAL是 Hardware Abstraction Layer 的缩写,中文名:硬件抽象层。HAL 库是 ST 为 STM32 最新推出的抽象层嵌入式软件,可以更好的确保跨 STM32 产品的最大可移植性。该库提供了一整套一致的中间件组件,如 RTOS,USB,TCP/IP 和 图形 等。

  HAL 库是基于一个非限制性的 BSD 许可协议(Berkeley Software Distribution)而发布的开源代码。ST 制作的中间件堆栈(USB 主机和设备库,STemWin)带有允许轻松重用的许可模式, 只要是在 ST 公司的 MCU 芯片上使用,库中的中间件(USB 主机/设备库,STemWin)协议栈即被允许随便修改,并可以反复使用。至于基于其它著名的开源解决方案商的中间件(FreeRTOS,FatFs,LwIP和PolarSSL)也都具有友好的用户许可条款。作为目前 ST 主推的外设库,HAL库相关的文档还是非常详细的。

好几天忙别的,源码都没有读,今天就读会儿,累了就到了文章尾部了~

读法粗糙,因为这个是STM32的代码,而且是裸机的,就直接从main文件开始读了。

一开始是固件的初始化

先看main文件里面的函数调用,基本上就是初始化+循环

值得注意的是debug的结构体就是这么简单。注意看里面的变量名的意思

时钟+IMU+Flash初始化

时钟的初始化

IMU的初始化

加载参数

还在读

各种常量

这个飞控里面没有什么GUI的参数设置软件,只能改代码,通过该这个config里面的宏。

就是这样

在main文件里面引入

你看宏定义

这个是超频

在config的配置是这样的

就可以超频了

延时函数

这些是时间的函数

GPIO就两个函数,但是内容丰富

下面是FPV引脚,没有搞懂是什么

PWM设置

初始化后继续设置初值

四个电机的定义

通道数?

陀螺仪初始化

bayang的协议

接收

CMSIS库

重要的CM头

各种编译器的宏定义

这里某种情况

C:\Keil_v5\ARM

这是ARMCC的库文件

里面的类型定义,但是是keil的头,使用的

如果直接查是微软的

从keil复制一个出来

这些是真正使用的定义

__IO定义

注释

这个头有趣极了,我给你讲

把这个文件称之为对芯片的封装也不为过,这个文件是ST公司给的,遵守CMSIS守则。可以简化ARM_CM3的移植难度。

主要的内容是定义寄存器的地址以及使用的结构体封装。

接下来看的就是这些文件

不过我要多嘴一句,这个文件是设备外设的访问层,主要配置时钟频率

人家也写了

看这里会使用extern,在外面使用

然后跳到这里

这个文件在这里被定义

里面的注释

这个是所有函数的定义

这些是实现

上面的函数体又在这里被定义了一下

看它写的意思是,这些文件是启动文件,都是汇编的,根据芯片选一个

VSCode觉得我需要看汇编了

啧,这个颜色,变得

系统得初始化从汇编代码开始

这是汇编写的东西

分配栈空间,stack就是栈

堆空间也安排点,雨露均沾

从这里开始就进入我们C的 世界了

我以前也没有用过STM32,然后正经的课也没有上过,就看过火哥的书,看了一点点,正好借着这个飞控就验证一下是不是像书中说的那样,体验一下封装的快乐。

file:///C:/Users/yunswj/Downloads/Silverware-master/Silverware-master/Libraries/CMSIS/Device/ST/STM32F0xx/Include/stm32f0xx.h

这些就是寄存器的地址定义了,我就截图了一些

外设树,请允许我这样叫它

时钟相关的东西,定时器,RTC,看门狗什么的

SPI,串口,I2C,CAN

DMA

GPIO组

限于篇幅(其实不是篇幅,是我没有耐心,只能走马观花的看一遍了)

没有MPU的功能

这里是中断的定义区

可以看到是enumerate

对应的意思

GPIO,必不可少

I2C的结构体定义

上面文件接着下面,上面这些就是所谓的位定义

接着跳转

这些是我们用的实现

对于GPIO来说,就似乎这些函数了

这里就看一个配置端口功能,但是不全面

这个功能是GPIO的初始化

这里是GPIO

内存的映射的开始

这个初始化的函数传入两个参数

一开始我就说这个结构体了,对GPIO做了封装

另外一个GPIO的初始的结构体封装

IO的输出速率

这是上面的翻译

这种东西其实看懂了,也不过如此,芯片再高端又怎么样?不就是多点宏定义,多点结构体,索然无味了~

在这里就是我们打交最多的地方了,各种外设功能都在这里实现

CMSIS就是芯片+地址映射的活,STD才是我们接触的东西

名字叫“标准外设驱动程序”

以后叫对名字。

如果你的程序要写啥中断的话,这个头文件一定要加

看这个conf,就是头文件的管理器

用到的都有

这是配置要不要使用断言,调试的时候使用

这里参数的意思

这个文件夹里面,加了一些废话

common是屏幕的接线定义,LCD屏幕。

具体看这里

至于这个Nucleo看上去是个开发板。

确实是

等小张有钱,买一个玩,看来这个nucleo就是个系列

一般来说开发,就是main,conf,it.h,it.c,就是主文件,头的配置文件,中断程序,这么多了~

注意我们得有一个参考手册,本崽的是中文的

STM32是真搞控制的

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多