嵌入式开发-stm32
在完成对C语言复习了之后,也开始进入正题——stm32的开发和学习。
stm32介绍
本人使用的是普中的开发板,开发平台是Keil 5,核心是Cortex 4 的内核,当然这个板子也自带了F1的芯片,如下:
在开发之前首先要对这块开发板进行一定的了解,在学习资料中最重要的就是数据手册、中文参考手册、开发板原理图。
数据手册主要能对存储器的映射进行查看,而中文参考手册则是对各个外设的具体控制的数据位的操作和功能,开发版原理图则是对应外设和F4芯片的引脚的连接情况。在熟悉了这三个手册之后,我们就对硬件层面有了初步的了解,接下来才能对相应的功能进行裸机开发。
在初步学习之后,我们了解到开发板最底层其实就是使用寄存器进行输入和输出,由芯片完成对应的程序执行。
寄存器和存储器
其实这两个光看名字其实都是存储数据的容器,但是在实际应用当中还是有所区分:
存储器:存放指令和数据的地方,由CPU直接进行存取。
寄存器:进行对存储的数据进行算术和逻辑运算;存储于其中的地址则是指向内存的某个位置读写进周边设备。
其中还需要了解的就是存储器映射和寄存器映射。
存储器映射:给存储器分配地址的过程。
寄存器映射:给特定功能的内存单元取一个别名,别名就是寄存器,这个过程就是寄存器映射。
重映射:本质上就是在引脚固定的情况下,若是被占用了固有引脚,可以使用重映射的功能将引脚映射到其他引脚完成对应的功能。
地址重映射也是类似,就是将一块内存的地址映射到别的地址上。
启动模式:
stm32一般有3种启动模式:主flash、系统存储器、内置SRAM,主要是通过BOOT0 和 BOOT1 两个引脚来进行选择,一般来说程序都是存储在主flash之中,当我们需要使用到串口模式下载时会使用系统存储器的启动模式,那么SRAM的模式主要是拿来进行程序的调试,flash主要会有擦写的寿命而SRAM完全不用担心,且SRAM没有程序存储的能力(掉电程序消失,要重新下载)。
详细见:
在SRAM、FLASH中调试代码的配置方法(附详细步骤) - 知乎 (zhihu.com)
对于寄存器的封装我们一般来说是查阅数据手册对于我们需要用到的外设的地址进行封装,这也是单片机中对底层进行操作的步骤。
这就是对外设及相应的基地址进行封装的过程,只需要定义第一个地址后面都是进行偏移即可。
寄存器在Keil5中使用
正常按照教程进行创建并导入文件即可,在Keil 5 中创建新项目需要注意不能使用中文,会报错。
在上面头文件中封装好所需要的外设,下面就可以进行对应的操作。
实例:
1 |
|
在这个程序中,SystemInit()函数是系统启动函数,若是没有则会报错。delay()函数是延时功能,在主函数中,我们值得注意的是需要先对GPIOF的时钟进行使能,也是主函数的第一个操作,在单片机的置位操作中,最常使用的就是位或和位与的操作,这样既不用麻烦的去算所需赋的值,剩下的就是模式选择和相应的置位复位寄存器的操作了,剩下的输出类型、输出速度、上拉/下拉寄存器都使用默认复位的即可,这些配置在库函数中使用的比较多。
GPIO口
通过软件来控制输入输出,stm32的GPIO和外设进行连接、通讯和数据采集等功能。
引脚分类:
电源管脚、晶振管脚、复位管脚、下载管脚、BOOT管脚、GPIO管脚。
每一个GPIOX都有16个管脚,例:PA0-PA15;每个管脚的功能及其复用功能都可以在数据手册中查到。
GPIO的功能实现:
在输入驱动电路中有上拉、下拉、浮空、模拟四种模式,上拉就是使得管脚默认状态是1,而下拉则是0,浮空就是不确定的未知状态。
在输出驱动电路中是采用一组推挽电路来进行控制,有推挽、开漏两种模式,除开以上这些,输入输出都还有复用的功能。
具体细节可以参考:
深刻理解GPIO(上拉输入、下拉输入、模拟输入、浮空输入,开漏输出,推挽输出的区别,以STM32为例)_下拉输出-CSDN博客
开漏有一个比较重要的特性,可以进行线与,而推挽不行,若是推挽进行线与可能就会导致IO口短路损坏芯片,线与的功能一般使用在I2C和SMBUS总线之中。
GPIO初始化:
1.确定GPIO为输入、输出、复用还是模拟(MODER)
2.输出是推挽还是开漏,输入是上拉、下拉还是浮空(OTYPER)
3.配置输出的速度(OSPEEDR)
4.输出时内部上拉下拉电阻是否打开(PUPDR)
5.具体内容:置位复位(BSRR)、数据输出(ODR)
简单的寄存器操作就是这些内容,stm32还可以使用固件库、HAL库和CubeMX的搭配进行开发,寄存器只是为了解开发板的底层运行逻辑,一般正常开发是使用库函数进行。