diff --git a/book/02:STM32的硬件电路/01.md b/book/02:STM32的硬件电路/01.md index 40d59e4..f7e74ef 100644 --- a/book/02:STM32的硬件电路/01.md +++ b/book/02:STM32的硬件电路/01.md @@ -1,6 +1,6 @@ ->我们用的开发板和书上的不一样,另外开发环境不太一样,因此这一章内容我们主要介绍开发板和开发环境。 +> 我们用的开发板和书上的不一样,另外开发环境不太一样,因此这一章内容我们主要介绍开发板和开发环境。 -[TOC] +[toc] # 1. STM32微处理器概述 @@ -8,13 +8,13 @@ ![image-20240831110223219](./img/image-20240831110223219.png) -使用ARM Cortex-M 内核,由意法半导体生产的STM32F1系列。STM32被广泛应用于各种消费电子产品、工业控制、汽车领域,有完善的产品线和开发工具。 +使用ARM Cortex-M 内核,由意法半导体生产的STM32F1系列。STM32被广泛应用于各种消费电子产品、工业控制、汽车领域,有完善的产品线和开发工具。 ## 1.2. STM32F103C8T6 - Arm® 32-bit Cortex ®-M3 CPU core - Memories - - 64 or 128 Kbytes of Flash memory + - 64 or 128 Kbytes of Flash memory - 20 Kbytes of SRAM - 2x 12-bit, 1 μs A/D converters (up to 16 channels) - DMA @@ -50,11 +50,9 @@ - 调试:JATG(下面分析开发板时会标出) - 通用:GPIO - - 参考资料: -- [如何在STM32中获得最佳ADC精度](<../../STM32官方手册/AN2834 - 如何在STM32中获得最佳ADC精度.pdf>) +- [如何在STM32中获得最佳ADC精度](../../STM32官方手册/AN2834 - 如何在STM32中获得最佳ADC精度.pdf) - [STM32中文参考手册](../../STM32%E5%AE%98%E6%96%B9%E6%89%8B%E5%86%8C/STM32%E4%B8%AD%E6%96%87%E5%8F%82%E8%80%83%E6%89%8B%E5%86%8C.pdf) - [STM32CubeIDE入门指南](../../STM32%E5%AE%98%E6%96%B9%E6%89%8B%E5%86%8C/STM32CubeIDE%E5%85%A5%E9%97%A8%E6%8C%87%E5%8D%97.pdf) - [STM32CubeMX用户手册](../../STM32%E5%AE%98%E6%96%B9%E6%89%8B%E5%86%8C/STM32CubeMX%E7%94%A8%E6%88%B7%E6%89%8B%E5%86%8C.pdf) @@ -64,8 +62,6 @@ - [STM32F103C8规格书](../../STM32%E5%AE%98%E6%96%B9%E6%89%8B%E5%86%8C/STM32F103C8%E8%A7%84%E6%A0%BC%E4%B9%A6.pdf) - [STM32国产替代者](https://www.eeworld.com.cn/mcu/eic676433.html) - - # 2. KeysKing开发板 两个刚毕业的大学生做的项目,非常适合教学使用,有丰富的扩展。[有视频教材](https://www.bilibili.com/video/BV12v4y1y7uV/?spm_id_from=333.999.0.0&vd_source=3c8e333d6657680a469ddf0238f01d6a)。 @@ -120,18 +116,27 @@ VBUS是TYPE-C的5V,VSWD是调试接口SWD的5V,通过防倒灌电路使得 ![image-20240831143931440](./img/image-20240831143931440.png) +时钟电路(P20): + +时钟电路与书上的开发板不一致,但是也分为4个时钟。请注意,频率和书上的不同! + +1. LSI:内部低速时钟,40k; +2. HSI:内部高速时钟 8M; +3. LSE:外部低速时钟 32.768k; +4. HSE:外部高速时钟 8M。 + 1的位置是两个时钟,低速(32.768k)和高速(8M)。其中32.768k 是为计时提供精确的脉冲;8M高速通过MCU内部倍频后,可以为MCU内部提供高达72M的核心时钟。 > 为什么需要32.768k的时钟? +复位电路: + 2位置是复位电路(低有效),很简单,该端口有个电容,为MCU上电的瞬间提供一个低电位,使得MCU复位;如果按下按钮,该端口被拉低,MCU强制复位。 > 复位电容的工作原理是什么? > > 为什么复位会用低电位,而不用高电位复位? - - 上述是开发板的主要核心电路分析,后面的课程当中对用到的电路进行分析。要学会看电路的原理图。 # 3. 开发环境 @@ -164,8 +169,6 @@ VBUS是TYPE-C的5V,VSWD是调试接口SWD的5V,通过防倒灌电路使得 > 注意,虽然下载不需要用户,但是使用需要登录!否则无法下载相应的芯片资源,无法进行编译!在下图中 MyST 菜单中登录后才能进行相应的开发。 - - STM32CubeIDE集成了:STM32CubeMX:芯片选型、配置、代码生产等,生成的框架可以供多种IDE使用基于Eclipse的集成开发环境。安装完成后,界面如下: ![image-20240831152413351](./img/image-20240831152413351.png) @@ -190,8 +193,6 @@ STLink 调试器版本需更新,否则可能无法下载程序和进行调试 3. Refresh Device List 的左边应该出现 ST-LINK/V2 的选项,然后点击1所示的位置,出现2位置的信息,最后点击3位置更新固件。 - - ## 3.4. 示例:LED闪烁 ### 3.4.1. 新建项目 @@ -220,8 +221,6 @@ File->New->STM32 Project 出现以下界面: 查看RGB硬件的端口,暂时使用PA6作为需要闪烁的LED。鼠标点击PA6 选择“GPIO_Output”,让PA6作为输出端口;接下来,鼠标右键点击PA6,选择Enter User Label。注意,User Label 是给端口起一个更清晰的别名,这个别名在编程的时候被当成是常量,因此,名字需要符合C语言常量的规则。 - - ![image-20240831160214958](./img/image-20240831160214958.png) 好了,目前我们的芯片看起来是这样: @@ -314,7 +313,7 @@ Stm32CubeIDE 其实是由多个工具所构成: 在IDE中,双击后缀为ioc的文件就会打开 Stm32CubeMX 的界面,如果进行了修改,保存的时候会询问是否重新生成代码框架。 -这个工具还有一个功能是维护 MCU Packages 就是不同系列MCU的底层框架代码和一些附加功能代码(网络、USB、操作系统等)。通过 Help 菜单中的 Manage Embedded Software Packages 功能可以打开。可以看到,支持的MCU系列的相关软件包。 +这个工具还有一个功能是维护 MCU Packages 就是不同系列MCU的底层框架代码和一些附加功能代码(网络、USB、操作系统等)。通过 Help 菜单中的 Manage Embedded Software Packages 功能可以打开。可以看到,支持的MCU系列的相关软件包。(P48) ![image-20240901084639078](./img/image-20240901084639078.png) @@ -370,8 +369,6 @@ main.h 中重点看看 60 行左右: 生成的代码对PA5端口进行了初始化。以上的代码都是自动生成的,一般不用去关心,框架简化了我们的开发工作。 - - 用户逻辑代码,在main.c 大约100行左右: ```c @@ -396,10 +393,12 @@ HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); 两个参数,第一个代表端口 > 其实框架还生成了很多工作,包括MCU的时钟初始化、总线初始化、内存初始化等工作。这些工作都使用 Stm32CubeMX 的配置进行,代码是自动生成的,一般不用关心。在后续的工作当中,我们还会用到很多Stm32CubeMX的配置功能。 -## 4.4. Stm32CubeMX 基本功能 +## 4.4. Stm32CubeMX 的使用(P59) ![image-20240901123125992](./img/image-20240901123125992.png) +![image-20240902154317946](./img/image-20240902154317946.png) + 该工具四大功能: 1. Pinout & Configuartion:端口,外设和中间件(操作系统、网络协议栈、USB驱动等)配置; @@ -409,7 +408,96 @@ HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); 两个参数,第一个代表端口 一般最常用的就是 Pinout Configuartion 和 Clock Configuration -# 5. 实践任务 +# 5. 串口通信演示(p83) + +> 注意:书上使用的开发环境是Keil,而我们使用的是 STM32CubeIDE,另外,开发板也不一样,下面会说明。 + +上一个LED的演示很简单,很多地方其实没有进行配置,在串口通信中,我们会更详细的学习如何进行开发。 + +## 5.1. 硬件连接 + +![image-20240902160946444](./img/image-20240902160946444.png) + +这次使用1和2两个接口: + +1. 通过一条type-c连接线接入开发机的USB,用于在开发机上虚拟一个串口。可能需要安装[驱动](../../%E9%A9%B1%E5%8A%A8/CH343SER%E4%B8%B2%E5%8F%A3%E9%A9%B1%E5%8A%A8.EXE)。 +2. 和ST-Link连接后,接入开发机的另外一个USB,用于程序下载和调试。 + +查看1对应的端口说明: + +![image-20240902162048016](./img/image-20240902162048016.png) + +知道串口的两个引脚是 PA2和PA3,这个等一下使用。 + +## 5.2. 项目设置 + +请参考[示例:LED闪烁](#3.4. 示例:LED闪烁)建立一个项目,命名为uart。 + +### 5.2.1. 时钟设置(p66) + +如果我们打开时钟配置界面会发现: + +![image-20240902165325358](./img/image-20240902165325358.png) + +LSE和HSE全部都是灰色,而LSI和HSI都是蓝色,这表示目前芯片的配置使用芯片内部的时钟;如果我们要使用外部时钟,需要在 Pinout & Congiguration 中使能相应的配置。 + +![image-20240902162558093](./img/image-20240902162558093.png) + +首选选择 Pinout & Congiguration 功能,在左边的列表(2位置)中选择 RCC,然后右边出现的选单(3位置)下拉列表中把HSE和LSE全部选择成外部晶体,如上图所示。这时右边的芯片图相应的引脚成绿色,表示被占用。 + +![image-20240902162840075](./img/image-20240902162840075.png) + +回到 Clock Configuration ,进行一下设置: + +![image-20240902165643477](./img/image-20240902165643477.png) + +这样就可以使用外部时钟了,外部时钟的好处是更精确。这里的图叫做时钟树,我们先不关心时钟树的具体内容,先就这么设置,后面用到的时候会详细讲解。 + +### 5.2.2. 设置调试模式 + +在 Pinout & Congiguration 的左边,选择 System Core 中的 SYS,修改以下配置: + +![image-20240902170021422](./img/image-20240902170021422.png) + +调试方式选择 Serial Wire。其实不用设置也可以,缺省的调试方式就是 Serial Wire,这个就是我们 ST-Link 使用的调试方式。 + +### 5.2.3. USART2 配置 + +通过开发板提供的资料,我们知道串口使用PA2和PA3,但是这两个引脚对应哪个串口? + +在芯片视图中点击PA2: + +![image-20240902170331065](./img/image-20240902170331065.png) + +看到了吗?使用的是USART2这个串口,接下来对串口进行配置。 + +![image-20240902170531628](./img/image-20240902170531628.png) + +在 Pinout & Congiguration 的左边,选择Connectivity 的 USART2,并在右边的 Mode 选项中选择 Asynchronous (异步),看看下面的串口参数(4的位置),我们知道: + +- 波特率:115200 +- 数据位长度:8位 +- 校验:无 +- 停止位:1 + +记住这些参数,在开发机中的串口监视也需要采用同样的参数才能收到数据。当设置完成后,使用 ctl+s 保存,会提示是否需要生成代码,当然要生成。 + +## 5.3. 软件编写 + +在 main.c 函数的大约 100 行左右修改代码如下: + +```c + while (1) { + /* USER CODE END WHILE */ + + /* USER CODE BEGIN 3 */ + HAL_Delay(1000); + HAL_UART_Transmit(&huart2, msg, strlen(msg), 100); + + } +``` + +# 6. 实践任务 1. 按照本章的介绍,独自完成 Blink 点亮小灯的程序; -2. Eclipse 对 C语言的代码解析和语法分析没有 clion 好,有能力的同学可以尝试使用 clion 和 stm32cube 来进行开发和调试。 \ No newline at end of file +2. Eclipse 对 C语言的代码解析和语法分析没有 clion 好,有能力的同学可以尝试使用 clion 和 stm32cube 来进行开发和调试。 diff --git a/book/02:STM32的硬件电路/img/image-20240902154317946.png b/book/02:STM32的硬件电路/img/image-20240902154317946.png new file mode 100644 index 0000000..96a56a2 Binary files /dev/null and b/book/02:STM32的硬件电路/img/image-20240902154317946.png differ diff --git a/book/02:STM32的硬件电路/img/image-20240902160946444.png b/book/02:STM32的硬件电路/img/image-20240902160946444.png new file mode 100644 index 0000000..849e604 Binary files /dev/null and b/book/02:STM32的硬件电路/img/image-20240902160946444.png differ diff --git a/book/02:STM32的硬件电路/img/image-20240902162048016.png b/book/02:STM32的硬件电路/img/image-20240902162048016.png new file mode 100644 index 0000000..a928086 Binary files /dev/null and b/book/02:STM32的硬件电路/img/image-20240902162048016.png differ diff --git a/book/02:STM32的硬件电路/img/image-20240902162334279.png b/book/02:STM32的硬件电路/img/image-20240902162334279.png new file mode 100644 index 0000000..78d51db Binary files /dev/null and b/book/02:STM32的硬件电路/img/image-20240902162334279.png differ diff --git a/book/02:STM32的硬件电路/img/image-20240902162558093.png b/book/02:STM32的硬件电路/img/image-20240902162558093.png new file mode 100644 index 0000000..b2fc395 Binary files /dev/null and b/book/02:STM32的硬件电路/img/image-20240902162558093.png differ diff --git a/book/02:STM32的硬件电路/img/image-20240902162840075.png b/book/02:STM32的硬件电路/img/image-20240902162840075.png new file mode 100644 index 0000000..4591dc8 Binary files /dev/null and b/book/02:STM32的硬件电路/img/image-20240902162840075.png differ diff --git a/book/02:STM32的硬件电路/img/image-20240902162855698.png b/book/02:STM32的硬件电路/img/image-20240902162855698.png new file mode 100644 index 0000000..4591dc8 Binary files /dev/null and b/book/02:STM32的硬件电路/img/image-20240902162855698.png differ diff --git a/book/02:STM32的硬件电路/img/image-20240902165325358.png b/book/02:STM32的硬件电路/img/image-20240902165325358.png new file mode 100644 index 0000000..6587368 Binary files /dev/null and b/book/02:STM32的硬件电路/img/image-20240902165325358.png differ diff --git a/book/02:STM32的硬件电路/img/image-20240902165643477.png b/book/02:STM32的硬件电路/img/image-20240902165643477.png new file mode 100644 index 0000000..ca990e5 Binary files /dev/null and b/book/02:STM32的硬件电路/img/image-20240902165643477.png differ diff --git a/book/02:STM32的硬件电路/img/image-20240902170021422.png b/book/02:STM32的硬件电路/img/image-20240902170021422.png new file mode 100644 index 0000000..453b226 Binary files /dev/null and b/book/02:STM32的硬件电路/img/image-20240902170021422.png differ diff --git a/book/02:STM32的硬件电路/img/image-20240902170331065.png b/book/02:STM32的硬件电路/img/image-20240902170331065.png new file mode 100644 index 0000000..c349b07 Binary files /dev/null and b/book/02:STM32的硬件电路/img/image-20240902170331065.png differ diff --git a/book/02:STM32的硬件电路/img/image-20240902170531628.png b/book/02:STM32的硬件电路/img/image-20240902170531628.png new file mode 100644 index 0000000..78b3313 Binary files /dev/null and b/book/02:STM32的硬件电路/img/image-20240902170531628.png differ diff --git a/book/02:STM32的硬件电路/img/image-20240902170537916.png b/book/02:STM32的硬件电路/img/image-20240902170537916.png new file mode 100644 index 0000000..78b3313 Binary files /dev/null and b/book/02:STM32的硬件电路/img/image-20240902170537916.png differ