一.STM32开发方式
1.基于STM32开发方式
1.基于寄存器的方式、基于标准库也就是库函数的方式和基于HAL库的方式。
2.基于寄存器的开发方式和我们的51单片机开发方式一样,是用程序直接配置寄存器,来达到我们想要的功能。这种方式最底层,最直接,效率更高一些。由于STM32结构复杂,寄存器太多,所以基于寄存器就不方便。
3.基于库函数的方式是使用ST官方提供的封装好的函数,通过调用这些函数来间接的配置寄存器。由于ST对寄存器封装的比较好所以这种方式既能满足对寄存器的配置,提高开发效率。最后一个基于HAL库的方式可以用图形化界面快速配置STM32。这个对底层了解过浅,不建议使用。
1.2记得解压CH340,以及ST-LINK驱动安装
1.3 ST-KINK接线以及使用
1.4为什么使用CH340
1.5下载Cube固件包(STM官网)
1.6项目工程文件夹
1.7Drivers文件夹
文件夹 | 作用 |
BSP | 存放开发板扳级支持包驱动代码,如各种外设驱动 |
CMSIS | 存放CMSIS底层代码,如:启动文件(.s文件)等 |
SYSTEM | 存放系统级核心驱动代码,如:sys.c \delay.c和usart.c等。 |
STM32F1XX_HAL_Drivers | 存放ST提供的F1系列和HAL库驱动源码 |
1.8 BSP文件夹
我们平时所写的LED驱动、蜂鸣器驱动、ESP8266驱动等。都是放在这个目录下面。
但由于咱这是工程模板,就先不考虑这些驱动了,所以这个目录就暂时为空就好,等后面用到什么外设在具体添加对应的文件即可。
复制到我们的工程下面
只留下这两个
进入Score把下面两个删掉
再拷贝一个include到CMSIS(用STM32CubeMX生成这个include)
注意:点击GENERATE CODE
注意:只需要下面的一些
1.9 STM32CubeMX软件安装
记得该路径,因为它会自动把核心文件下载到这个系统盘里面
放到我们安装包路径下面,记得复制Repository/
2.0 SYSYEM文件夹
2.1 STM32F1XX_HAL_Driver文件夹
2.2 MIddlewares、Output、Projects
放空
2.3 Users
官方固件包->project->STM3210E_EVAL-Templates->inc
官方固件包->project->STM3210E_EVAL-Templates->src
2. 开始新建工程
2.1建立文件
2.2打开KEIL
3.找对路径在下面建立一个文件夹
4.常用编译按钮
3.添加工程必要文件
3.1建立启动文件
3.1.1添加文件
3.1.2为什么选择不同型号的启动文件
启动文件 | 对应的FLASH容量 | 说明 |
startup_stm32f103x6.s | Flash<=32KB | 用于小容量F103系列芯片的启动文件 |
startup_stm32f103xb.s | 64KB<=Flash<=128KB | 用于中容量F103系列芯片的启动文件 |
startup_stm32f103xe.s | 256KB<=Flash<=512KB | 用于大容量F103系列芯片的启动文件 |
startup_stm32f103xg.s | 768KB<=Flash<=1024KB | 用于超大容量F103系列芯片的启动文件 |
3.1.3 user头文件
3.1.4 Drivers/SYSTEM
3.1.5 官方的Drivers/STM32FXX_HAL_Driver
有小钥匙怎么办?
4.配置魔法棒和扳手
4.1 Target
4.2 output
4.3 Listing
4.4 C\C++
两个宏定义
USE_HAL_DRIVER
STM32F103xB
4.4.1添加头文件路径
4.5 DEBUG选择STLink
点击setitngs
全部勾上
4.6 Utilities 选项卡
改文件内容
4.7魔法棒配置和扳手的配置
扳手
配成中文的环境
语法检测
魔法棒
4.8下载
4.9 什么是CMSIS
CMSIS(Cortex Microcontroller Software Interface Standard)是一种用于Cortex-M处理器的软件接口标准。它提供了一组通用的接口定义,用于访问处理器内核和外设功能,以简化嵌入式软件开发。CMSIS包括核心(Core)、DSP(Digital Signal Processing)和RTOS(Real-Time Operating System)组件,帮助开发人员编写可移植的、高效的嵌入式软件。
4.10 标准库和HAL库的区别、优点和缺点如下:
### 区别:
- **标准库**:
- 通用性强,适用于各种平台和应用。
- 提供了通用的功能,如输入输出、内存管理等。
- **HAL库**:
- 针对特定硬件平台,提供了对硬件的抽象接口。
- 简化了对硬件的操作,提供了更直接的硬件访问接口。
### 优点:
- **标准库**:
- 通用性强,适用于各种平台和应用。
- 提供了丰富的功能,方便开发人员快速开发应用。
- **HAL库**:
- 提供了对硬件的抽象接口,简化了硬件操作。
- 可以更直接地访问硬件,提高了对特定硬件的开发效率。
### 缺点:
- **标准库**:
- 可能缺乏对特定硬件的直接支持。
- 在对硬件进行底层操作时,可能需要额外的编程工作。
- **HAL库**:
- 针对特定硬件平台,不具备通用性。
- 可能会增加代码的复杂性,特别是在需要跨平台开发时。
5.MDK5的使用技巧
5.1找括号的范围
Ctrl+e
5.2缩进
1.选中代码行,按下Tab键
2.选中代码行
3.想返回
SHift+Enter
5.3快速编辑一列
按着Alt选择一列编辑
5.4快速打开头文件
右击,选择Open document
5.5快速拆分窗口
右击标准页,选择New horizeontal/vertical tab group
5.6查找替换的功能
CtrL+F
6.MDK调试配置
6.1优化等级,有时候写代码时候,比如for循环,啥也不做,占用CPU时间。不希望优化掉,所以设置为0
6.2下载Debug,配置
6.3 STLINK之前配置过了,不用再配置了。看我之前博文
6.4Utilities
6.5 进入仿真调试里面
6.6开始仿真
6.7打断点、失能断点、全部是能断点。
6.8遍历整个程序,到断点停止
6.9断点就是程序运行到这里便停止,红色是当前程序运行的位置,绿色是光标的位置
6.10 步进按钮,按一下进一下,碰见函数就进封装的函数体内。
6.11 跳出步进按钮
6. 12 运行到光标的位置
6.13 复位按键
回到汇编文件的位置
6.14 停掉按钮
7.C语言的回顾
7.1数据类型
类型 | 字节 | 位 | Stdint |
Char | 1 | 8 | int8_t |
unsigned char | 1 | 8 | uint8_t |
short | 2 | 16 | int16_t |
unsigned short | 2 | 16 | uint16_t |
int | 4 | 32 | int32_t |
unsigned int | 4 | 32 | uint32_t |
long | 4 | 32 | |
unsigned long | 4 | 32 | |
long long | 8 | 64 | int64_t |
unsigned long long | 8 | 64 | uint64_t |
float | 4 | 32 | |
double | 8 | 64 |
7.2宏定义
(1)宏定义是预处理用的,提高代码可读性
#define high 1 #define low 0 int main(){ printf("high=%d",high); printf("low=%d,low"); return 0; }
7.3typedf给复杂的数据类型起名
typedef unsigned int Size; int main(){ size a=10; printf("a=%d\r\n",a); return 0; }
7.4#if、#elif、#else、#endif、#ifdef,是为避免重复编译
#include <stdio.h> #define chd int main(void){ printf("hello word\r\n"); #ifdef chd printf("888\r\n"); #endif return 0; }
他们其实和if判断一样,如果为真,则继续进行;如果不为真;则继续,继续判断下边。
#if 1 printf("111\n"); #elif 1 printf("222\n"); #else printf("333\n"); #endif
8.结构体
#include <stdio.h> struct student{char gender;int age;float score}; typedf struct student{char gender;int age;float score} stu; int main(void){ stu a; struct student b; b.gender='c'; b.age=18; b.score=100; printf("age=%d,gender=%c,score=%.2f\r\n",b.age,b.gender,b.score); }