|
|
|
@ -2,12 +2,56 @@
|
|
|
|
|
>
|
|
|
|
|
> 我们用的开发板和书上的不一样,另外开发环境不太一样,因此这一章内容我们主要介绍开发板和开发环境。
|
|
|
|
|
|
|
|
|
|
# STM32微处理器概述
|
|
|
|
|
# 1. STM32微处理器概述
|
|
|
|
|
|
|
|
|
|
## 1.1. Cortex-M 家族
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
使用ARM Cortex-M 内核,由意法半导体生产的STM32F1系列。STM32被广泛应用于各种消费电子产品、工业控制、汽车领域,有完善的产品线和开发工具。
|
|
|
|
|
|
|
|
|
|
## 1.2. STM32F103C8T6
|
|
|
|
|
|
|
|
|
|
- Arm® 32-bit Cortex ®-M3 CPU core
|
|
|
|
|
- Memories
|
|
|
|
|
- 64 or 128 Kbytes of Flash memory
|
|
|
|
|
- 20 Kbytes of SRAM
|
|
|
|
|
- 2x 12-bit, 1 μs A/D converters (up to 16 channels)
|
|
|
|
|
- DMA
|
|
|
|
|
- 7-channel DMA controller
|
|
|
|
|
- Peripherals supported: timers, ADC, SPIs,
|
|
|
|
|
- I2Cs and USARTs
|
|
|
|
|
- Up to 80 fast I/O ports
|
|
|
|
|
- Debug mode – Serial wire debug (SWD) and JTAG
|
|
|
|
|
- Seven timers
|
|
|
|
|
- Three 16-bit timers, each with up to 4 IC/OC/PWM or pulse counter and quadrature (incremental) encoder input
|
|
|
|
|
- 16-bit, motor control PWM timer with dead-time generation and emergency stop
|
|
|
|
|
- Two watchdog timers (independent and window)
|
|
|
|
|
- SysTick timer 24-bit downcounter
|
|
|
|
|
- Up to nine communication interfaces
|
|
|
|
|
- Up to two I2C interfaces (SMBus/PMBus®)
|
|
|
|
|
- Up to three USARTs (ISO 7816 interface,
|
|
|
|
|
- LIN, IrDA capability, modem control)
|
|
|
|
|
- Up to two SPIs (18 Mbit/s)
|
|
|
|
|
- CAN interface (2.0B Active)
|
|
|
|
|
- USB 2.0 full-speed interface
|
|
|
|
|
|
|
|
|
|
### 1.2.1. 封装
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
### 1.2.2. 芯片引脚(p17)
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
- 电源:VDD、VSS;VDDA、VSSA
|
|
|
|
|
- 复位:NRST
|
|
|
|
|
- 时钟:OSC,高速和低速,高速8M;低速32.768K,主要用于时钟
|
|
|
|
|
- 调试:JATG(下面分析开发板时会标出)
|
|
|
|
|
- 通用:GPIO
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
参考资料:
|
|
|
|
|
|
|
|
|
|
- [如何在STM32中获得最佳ADC精度](<../../STM32官方手册/AN2834 - 如何在STM32中获得最佳ADC精度.pdf>)
|
|
|
|
@ -18,11 +62,167 @@
|
|
|
|
|
- [STM32F10xx硬件开发应用笔记](../../STM32%E5%AE%98%E6%96%B9%E6%89%8B%E5%86%8C/STM32F10xx%E7%A1%AC%E4%BB%B6%E5%BC%80%E5%8F%91%E5%BA%94%E7%94%A8%E7%AC%94%E8%AE%B0.pdf)
|
|
|
|
|
- [STM32F103中文参考手册](../../STM32%E5%AE%98%E6%96%B9%E6%89%8B%E5%86%8C/STM32F103%E4%B8%AD%E6%96%87%E5%8F%82%E8%80%83%E6%89%8B%E5%86%8C.pdf)
|
|
|
|
|
- [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)。
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
- 自己负责自己的硬件,损坏需要赔偿
|
|
|
|
|
- 每个盒子中有一张表格,请核对表格仔细检查附件
|
|
|
|
|
- 领用与归还都需要在表格签字
|
|
|
|
|
- 大多情况下不需要使用附件,如果要使用附件,请确保电源不要接错烧板子
|
|
|
|
|
- B站有视频,有兴趣的朋友可以看视频做更多的实验
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
[学习板原理图](../../%E5%BC%80%E5%8F%91%E6%9D%BF%E8%B5%84%E6%96%99/%E5%AD%A6%E4%B9%A0%E6%9D%BF%E5%8E%9F%E7%90%86%E5%9B%BE.pdf)
|
|
|
|
|
## 2.1. 开发板硬件简单解析
|
|
|
|
|
|
|
|
|
|
[学习板原理图](../../%E5%BC%80%E5%8F%91%E6%9D%BF%E8%B5%84%E6%96%99/%E5%AD%A6%E4%B9%A0%E6%9D%BF%E5%8E%9F%E7%90%86%E5%9B%BE.pdf)
|
|
|
|
|
|
|
|
|
|
如何看懂电路图?简单,标号一样的就是一样的,或者是相连接的。
|
|
|
|
|
|
|
|
|
|
### 2.1.1. 供电
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
AP2112是一个线性稳压器件,把5V降压成3.3V为MCU供电。因此开发板有两套电压,5V和3.3V,请注意区分。5V电压哪里来?
|
|
|
|
|
|
|
|
|
|
通过TYPE-C接口,接计算机的USB接口,其中的VBUS就是5V;
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
TYPE-C连接到 CH343P (USB转串口),为计算机提供了一个串口,该串口与MCU的PA2、PA3连接,为计算机和开发板的串口建立了通信。
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
另外,调试接口的SWD中的VSWD也是计算机USB的5V。
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
最后看一下电流防倒灌电路:
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
VBUS是TYPE-C的5V,VSWD是调试接口SWD的5V,通过防倒灌电路使得这两路电源都进入AP2112线性稳压的5V端口,为开发板提供3.3V电压。防倒灌电路等效为一个二极管,使得两个5V电源可以不干扰(同时供电)。
|
|
|
|
|
|
|
|
|
|
### 2.1.2. 时钟和复位
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
1的位置是两个时钟,低速(32.768k)和高速(8M)。其中32.768k 是为计时提供精确的脉冲;8M高速通过MCU内部倍频后,可以为MCU内部提供高达72M的核心时钟。
|
|
|
|
|
|
|
|
|
|
> 为什么需要32.768k的时钟?
|
|
|
|
|
|
|
|
|
|
2位置是复位电路(低有效),很简单,该端口有个电容,为MCU上电的瞬间提供一个低电位,使得MCU复位;如果按下按钮,该端口被拉低,MCU强制复位。
|
|
|
|
|
|
|
|
|
|
> 复位电容的工作原理是什么?
|
|
|
|
|
>
|
|
|
|
|
> 为什么复位会用低电位,而不用高电位复位?
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
上述是开发板的主要核心电路分析,后面的课程当中对用到的电路进行分析。要学会看电路的原理图。
|
|
|
|
|
|
|
|
|
|
# 3. 开发环境
|
|
|
|
|
|
|
|
|
|
[视频:安装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) 。
|
|
|
|
|
|
|
|
|
|
另外,后续的开发中会使用到串口,推荐开源的 xtools
|
|
|
|
|
|
|
|
|
|
下载 [xtools](https://gitee.com/x-tools-author/x-tools) 。
|
|
|
|
|
|
|
|
|
|
> 注意,虽然下载不需要用户,但是使用需要登录!否则无法下载相应的芯片资源,无法进行编译!在下图中 MyST 菜单中登录后才能进行相应的开发。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
STM32CubeIDE集成了:STM32CubeMX:芯片选型、配置、代码生产等,生成的框架可以供多种IDE使用基于Eclipse的集成开发环境。安装完成后,界面如下:
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
一般的开发流程如下:
|
|
|
|
|
|
|
|
|
|
1. 目标选择
|
|
|
|
|
2. 引脚分配
|
|
|
|
|
3. 外设配置
|
|
|
|
|
4. 时钟配置
|
|
|
|
|
5. 工程配置
|
|
|
|
|
6. 程序编写
|
|
|
|
|
|
|
|
|
|
## 3.1. 示例:LED闪烁
|
|
|
|
|
|
|
|
|
|
### 3.1.1. 新建项目
|
|
|
|
|
|
|
|
|
|
File->New->STM32 Project 出现以下界面:
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
在1位置输入 103C8T6 后,会在2位置出现芯片选择,选择第一个就好,然后点击3位置的Next。
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
在1位置输入项目名称,然后在2位置点击 Next。
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
选择开发固件(其实就是函数编程的接口版本,类似C开发中使用的三方库),一般不用更改,直接点击2位置的Finish完成。如果遇到下图对话框,选择Yes。
|
|
|
|
|
|
|
|
|
|
### 3.1.2. 硬件配置
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
上图是说IDE试图打开设备配置的配置方案,询问你是否需要打开。然后下面的界面对芯片进行配置。
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
查看RGB硬件的端口,暂时使用PA6作为需要闪烁的LED。鼠标点击PA6 选择“GPIO_Output”,让PA6作为输出端口;接下来,鼠标右键点击PA6,选择Enter User Label。注意,User Label 是给端口起一个更清晰的别名,这个别名在编程的时候被当成是常量,因此,名字需要符合C语言常量的规则。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
好了,目前我们的芯片看起来是这样:
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
PA6变绿,并且有个图钉,表示这个端口已经被配置和占用。使用ctl+s 保存更改,IDE会询问是否生成代码框架,当然选择Yes。
|
|
|
|
|
|
|
|
|
|
### 3.1.3. 加入代码
|
|
|
|
|
|
|
|
|
|
打开 main.c 大约在101 行左右,输入以下代码。注意,注释代码是IDE自动生成的,不要删除!
|
|
|
|
|
|
|
|
|
|
```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 */ 之间,因为IDE自动维护代码,否则下一次你重新配置硬件后重新生成代码,你自己的代码有可能丢失,因此请仔细阅读注释文件。
|
|
|
|
|
|
|
|
|
|
接下来点击运行按钮:
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
可能会出现运行配置的界面:
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
注意接口应该是SWD,一般不用修改,直接OK后观察开发板的效果。
|
|
|
|
|
|
|
|
|
|
### 3.1.4. 调试
|
|
|
|
|