基本完成第二章

master
高宏宇 12 months ago
parent 70577b406f
commit 1d4864f90c

@ -132,8 +132,6 @@ VBUS是TYPE-C的5VVSWD是调试接口SWD的5V通过防倒灌电路使得
[视频:安装stm32CubeIDE](https://www.bilibili.com/video/BV1HM411b78E/?spm_id_from=333.788&vd_source=3c8e333d6657680a469ddf0238f01d6a)
<iframe height='265' scrolling='no' title='Fancy Animated SVG Menu' src='https://www.bilibili.com/video/BV1HM411b78E/?spm_id_from=333.788&vd_source=3c8e333d6657680a469ddf0238f01d6a' frameborder='no' allowtransparency='true' allowfullscreen='true' style='width: 100%;'></iframe>
书上介绍的开发环境是Keil开发环境这个在51中也使用过但是该软件是属于商业软件需要购买。因此我们使用意法半导体提供的免费开发环境stm32cubeide其开发过程与书上讲的几乎完全一致且集成度更好更便于使用。
下载 [stm32cubeide](https://www.st.com.cn/zh/development-tools/stm32cubeide.html) 。
@ -159,9 +157,22 @@ STM32CubeIDE集成了STM32CubeMX芯片选型、配置、代码生产等
5. 工程配置
6. 程序编写
## 3.1. 示例LED闪烁
## 3.1. 升级STLink固件
STLink 调试器版本需更新,否则可能无法下载程序和进行调试。
1. 把调试器插入计算机任何一个USB口
2. 在Help菜单中找到 ST-Link 更新,出现以下界面:
![image-20240901080238419](./img/image-20240901080238419.png)
3. Refresh Device List 的左边应该出现 ST-LINK/V2 的选项然后点击1所示的位置出现2位置的信息最后点击3位置更新固件。
### 3.1.1. 新建项目
## 3.2. 示例LED闪烁
### 3.2.1. 新建项目
File->New->STM32 Project 出现以下界面:
@ -177,7 +188,7 @@ File->New->STM32 Project 出现以下界面:
选择开发固件其实就是函数编程的接口版本类似C开发中使用的三方库一般不用更改直接点击2位置的Finish完成。如果遇到下图对话框选择Yes。
### 3.1.2. 硬件配置
### 3.2.2. 硬件配置
![image-20240831155740992](./img/image-20240831155740992.png)
@ -197,7 +208,7 @@ File->New->STM32 Project 出现以下界面:
PA6变绿并且有个图钉表示这个端口已经被配置和占用。使用ctl+s 保存更改IDE会询问是否生成代码框架当然选择Yes。
### 3.1.3. 加入代码
### 3.2.3. 加入代码
打开 main.c 大约在101 行左右输入以下代码。注意注释代码是IDE自动生成的不要删除
@ -227,6 +238,151 @@ PA6变绿并且有个图钉表示这个端口已经被配置和占用。
注意接口应该是SWD一般不用修改直接OK后观察开发板的效果。
### 3.1.4. 调试
### 3.2.4. 调试
如下图选择编译模式为Debug
![image-20240901113700464](./img/image-20240901113700464.png)
在main.c 中,加入的代码前面双击,会出现一个蓝点,这就是程序运行后中断等待的地方。
![image-20240901115734594](./img/image-20240901115734594.png)
下图中,点击一个小虫子的图标进行调试:
![image-20240901115845776](./img/image-20240901115845776.png)
程序开始会在 HAL_Init(); 处中断,下图是调试工具:
![image-20240901120232151](./img/image-20240901120232151.png)
依次是:
1. 重新开始调试;
2. 继续F8
3. 暂停
4. 停止(ctl+F2)
5. 端口连接
6. 进入到函数(F5)
7. 跳过函数(F6)
8. 跳出函数(F7)
使用 F8 继续,在刚刚的断点处中断:
![image-20240901120618240](./img/image-20240901120618240.png)
继续按F8间隔1秒以上观察蓝色LED的变化。
# 4. 开发环境详解
Stm32CubeIDE 其实是由多个工具所构成:
- Stm32Cube该工具是一个独立的工具可以嵌入到 Stm32CubeIDE 中进行工作。就是在本章 3.2.1 中新建项目用到的这个工具。这个工具包含了芯片选择、芯片配置、芯片相关开发资源下在与更新、代码框架生成和更新等功能。可以这么说这是STM32开发工具的核心IDE只是更容易编程和调试而已。
- hEclipse CDT IDE这是基于Eclipse的C/C++开发环境,用于便捷的代码开发和调试。
- GCC for ARMC/C++交叉编译环境,用于生成目标代码。
- ST-Link 工具下载和调试工具用于把目标代码下载到开发板或者与Eclipse协同对代码进行调试。
## 4.1. Stm32Cube
该工具是整个STM32开发的核心在IDE中有个后缀为ioc的文件
![image-20240901084133705](./img/image-20240901084133705.png)
这就是Stm32Cube所维护的文件该文件中有当前MCU的所有配置信息、项目所依赖的软件功能配置、代码生成控制等信息。通过该工具最终目的是生成一个代码框架我们只需要在代码框架下加入我们的业务逻辑就好了。这样就避免了繁琐的芯片初始化、配置等过程这些工具都给你做好了。
在IDE中双击后缀为ioc的文件就会打开 Stm32Cube 的界面,如果进行了修改,保存的时候会询问是否重新生成代码框架。
这个工具还有一个功能是维护 MCU Packages 就是不同系列MCU的底层框架代码和一些附加功能代码网络、USB、操作系统等。通过 Help 菜单中的 Manage Embedded Software Packages 功能可以打开。可以看到支持的MCU系列的相关软件包。
![image-20240901084639078](./img/image-20240901084639078.png)
## 4.2. 编译下载过程
![Alt text](img/%E7%BC%96%E8%AF%91%E8%BF%87%E7%A8%8B.drawio.png)
上面就是整个的开发的流程STM32Cube在配置方面减少了开发者大量复杂且容易出错的芯片配置和初始化工作使得开发者可以专注自己的业务逻辑实现。
接下来我们来看看STM32Cube帮助我们做了些什么我们的代码结构如下
![image-20240901091010047](./img/image-20240901091010047.png)
- Binaries 是编译后的目标文件;
- Includes 是引用的 Embedded Software Packages 中的头文件,主要实现芯片初始化、外设配置、操作系统、网络协议栈等功能。这些功能都准备好了,只需要配置和使用就可以了;
- Core 用户的核心代码在这里;
- Drivers 硬件抽象层的代码在这里,包括各种外围硬件驱动,操作系统配置等;
- Debug/Release 和传统C/C++一样,编译的中间代码;
- Blink.ioc 工程文件,被 Stm32Cube 所维护;
- 其他文件。。。
其实,大部分时间,开发者只需要维护 Core 中的部分代码即可。
## 4.3. 代码分析
![image-20240901091716720](./img/image-20240901091716720.png)
这里重点看 main.h 和 main.c 这两个文件。
main.h 中重点看看 60 行左右:
```c
/* Private defines -----------------------------------------------------------*/
#define LED_Pin GPIO_PIN_6
#define LED_GPIO_Port GPIOA
```
这两行宏定义是因为刚刚把 PA6 定义了一个Label叫做LED。框架在生成代码的时候会自动生成相应的常量注意常量的生成规则以后在使用的时候就可以使用这些常量了。
在main.c的 **static** **void** **MX_GPIO_Init**(**void**) 函数中,大约 150 行
```c
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);
/*Configure GPIO pin : LED_Pin */
GPIO_InitStruct.Pin = LED_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(LED_GPIO_Port, &GPIO_InitStruct);
```
生成的代码对PA5端口进行了初始化。以上的代码都是自动生成的一般不用去关心框架简化了我们的开发工作。
用户逻辑代码在main.c 大约100行左右
```c
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_Delay(1000);
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
}
/* USER CODE END 3 */
}
```
注意用户代码必须在 /* USER CODE BEGIN 3 */ 和 /* USER CODE END 3 */ 之间!否则重新生成代码的时候会被删除。
HAL_Delay(1000); 表示使用延时1000毫秒
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); 两个参数第一个代表端口就是上面的常量定义的LED端口第二个代表具体的引脚就是LED的端口。
> 其实框架还生成了很多工作包括MCU的时钟初始化、总线初始化、内存初始化等工作。这些工作都使用 Stm32Cube 的配置进行代码是自动生成的一般不用关心。在后续的工作当中我们还会用到很多Stm32Cube的配置功能。
## Stm32Cube 基本功能
![image-20240901123125992](./img/image-20240901123125992.png)
该工具四大功能:
1. Pinout & Configuartion端口外设和中间件操作系统、网络协议栈、USB驱动等配置
2. Clock Configuration时钟配置
3. Project Manager项目配置主要用于代码生成的一些偏好设置一般不用关心
4. Tools工具主要是能耗分析等。
==highlight==
一般最常用的就是 Pinout & Configuartion 和 Clock Configuration

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Loading…
Cancel
Save