diff --git a/book/02:STM32的硬件电路/01.md b/book/02:STM32的硬件电路/01.md index 2016bc4..f72d770 100644 --- a/book/02:STM32的硬件电路/01.md +++ b/book/02:STM32的硬件电路/01.md @@ -132,8 +132,6 @@ VBUS是TYPE-C的5V,VSWD是调试接口SWD的5V,通过防倒灌电路使得 [视频:安装stm32CubeIDE](https://www.bilibili.com/video/BV1HM411b78E/?spm_id_from=333.788&vd_source=3c8e333d6657680a469ddf0238f01d6a) - - 书上介绍的开发环境是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 ARM:C/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== \ No newline at end of file +一般最常用的就是 Pinout & Configuartion 和 Clock Configuration \ No newline at end of file diff --git a/book/02:STM32的硬件电路/img/image-20240901080238419.png b/book/02:STM32的硬件电路/img/image-20240901080238419.png new file mode 100644 index 0000000..3a68757 Binary files /dev/null and b/book/02:STM32的硬件电路/img/image-20240901080238419.png differ diff --git a/book/02:STM32的硬件电路/img/image-20240901084133705.png b/book/02:STM32的硬件电路/img/image-20240901084133705.png new file mode 100644 index 0000000..a75c798 Binary files /dev/null and b/book/02:STM32的硬件电路/img/image-20240901084133705.png differ diff --git a/book/02:STM32的硬件电路/img/image-20240901084639078.png b/book/02:STM32的硬件电路/img/image-20240901084639078.png new file mode 100644 index 0000000..ee2ec62 Binary files /dev/null and b/book/02:STM32的硬件电路/img/image-20240901084639078.png differ diff --git a/book/02:STM32的硬件电路/img/image-20240901091010047.png b/book/02:STM32的硬件电路/img/image-20240901091010047.png new file mode 100644 index 0000000..8a16e4c Binary files /dev/null and b/book/02:STM32的硬件电路/img/image-20240901091010047.png differ diff --git a/book/02:STM32的硬件电路/img/image-20240901091716720.png b/book/02:STM32的硬件电路/img/image-20240901091716720.png new file mode 100644 index 0000000..ddac4a3 Binary files /dev/null and b/book/02:STM32的硬件电路/img/image-20240901091716720.png differ diff --git a/book/02:STM32的硬件电路/img/image-20240901113700464.png b/book/02:STM32的硬件电路/img/image-20240901113700464.png new file mode 100644 index 0000000..e42e990 Binary files /dev/null and b/book/02:STM32的硬件电路/img/image-20240901113700464.png differ diff --git a/book/02:STM32的硬件电路/img/image-20240901115734594.png b/book/02:STM32的硬件电路/img/image-20240901115734594.png new file mode 100644 index 0000000..b2d6169 Binary files /dev/null and b/book/02:STM32的硬件电路/img/image-20240901115734594.png differ diff --git a/book/02:STM32的硬件电路/img/image-20240901115845776.png b/book/02:STM32的硬件电路/img/image-20240901115845776.png new file mode 100644 index 0000000..7676968 Binary files /dev/null and b/book/02:STM32的硬件电路/img/image-20240901115845776.png differ diff --git a/book/02:STM32的硬件电路/img/image-20240901120232151.png b/book/02:STM32的硬件电路/img/image-20240901120232151.png new file mode 100644 index 0000000..0d8cefd Binary files /dev/null and b/book/02:STM32的硬件电路/img/image-20240901120232151.png differ diff --git a/book/02:STM32的硬件电路/img/image-20240901120618240.png b/book/02:STM32的硬件电路/img/image-20240901120618240.png new file mode 100644 index 0000000..e9539e4 Binary files /dev/null and b/book/02:STM32的硬件电路/img/image-20240901120618240.png differ diff --git a/book/02:STM32的硬件电路/img/image-20240901123125992.png b/book/02:STM32的硬件电路/img/image-20240901123125992.png new file mode 100644 index 0000000..6b2a526 Binary files /dev/null and b/book/02:STM32的硬件电路/img/image-20240901123125992.png differ diff --git a/book/02:STM32的硬件电路/img/下载与调试.drawio.png b/book/02:STM32的硬件电路/img/下载与调试.drawio.png new file mode 100644 index 0000000..e69de29 diff --git a/book/02:STM32的硬件电路/img/编译过程.drawio.png b/book/02:STM32的硬件电路/img/编译过程.drawio.png new file mode 100644 index 0000000..2483028 Binary files /dev/null and b/book/02:STM32的硬件电路/img/编译过程.drawio.png differ