1.硬件设备
- STM32面包板入门套件
- Windows电脑
- 万用表、示波器、镊子、剪刀等
2.套件介绍
3.STM32简介
- STM32是ST公司基于ARM Cortex-M内核开发的32位微控制器
- STM32常应用在嵌入式领域,如智能车、无人机、机器人、无线通信、物联网、工业控制、娱乐电子产品等
- STM32功能强大、性能优异、片上资源丰富、功耗低,是一款经典的嵌入式微控制器
3.1 STM32应用领域
STM32的应用领域包括但不限于:
- 嵌入式领域:如智能车、无人机、机器人、无线通信、物联网、工业控制、娱乐电子产品、医疗设备、智能家居等。
- 高速数据采集系统:使用STM32连接高速ADC和FPGA芯片,实现对高速信号的采集和处理,例如高速摄像头、高速激光测距仪等。
- 自动驾驶控制系统:使用STM32连接多个传感器和执行器,例如摄像头、雷达、电机、电子罗盘等,并通过算法设计和优化,实现自动驾驶控制功能。
- 机器人视觉系统:使用STM32连接多个摄像头和处理模块,例如OpenCV、CUDA等,并通过算法设计和优化,实现机器人的视觉导航、物体识别等功能。
- 网络安全嵌入式设备:使用STM32连接加密模块和网络模块,实现网络安全通信和数据加密等功能,例如VPN、防火墙、数据加密存储等。
- 人工智能嵌入式设备:使用STM32连接AI模块,例如人脸识别、语音识别、自然语言处理等,并通过编程和训练,实现智能化的应用,例如智能门禁、智能家居等。
总的来说,STM32在各个领域都有广泛的应用。
3.2 STM32命名规则
我们本次学习所用的开发板型号为STM32F103C8T6,根据上图命名规则可知
3.3 STM32选型
目前STM32主要有4个系列,从上到下分别是高性能系列、主流系列、超低功耗系列和无线系列。
CoreMark是内核跑分,跑分越高,性能越好。Cortex-M系列是ARM的内核芯片。(红框就是本次学习选用的STM32F1系列)
4.ARM简介
- ARM既指ARM公司,也指ARM处理器内核
- ARM公司是全球领先的半导体知识产权(IP)提供商,全世界超过95%的智能手机和平板电脑都采用ARM架构
- ARM公司设计ARM内核,半导体厂商完善内核周边电路并生产芯片
4.1 ARM的概念
- ARM既可以认为是一个公司的名字?,也可以认为是对一类处理器的统称?,还可以认为是一种技术的名字?。
- ARM公司是专门从事基于RISC技术芯片设计开发?的公司,作为知识产权供应商,本身不直接从事芯片生产,而是转让设计许可?,由合作公司生产各具特色的芯片。
- ARM处理器的内核是统一的?,由ARM公司提供,而片内部件则是多样的?,由各大半导体公司设计,这使得ARM设计嵌入式系统的时候,可以基于同样的核心,使用不同的片内外设?,从而具有很大的优势。
4.2 ARM系列
5.STM32开发板
5.1 MCU简介
本次学习用的是STM32F103C8T6,简介如下:
- 系列:主流系列STM32F1
- 内核:ARM Cortex-M3
- 主频:72MHz
- RAM:20K(SRAM)(运行内存 实际存储介质是SRAM)
- ROM:64K(Flash)(程序存储器 实际存储介质是Flash闪存)
- 供电:2.0~3.6V(标准3.3V)
- 封装:LQFP48
5.2 硬件简介
5.3 硬件资源
名称解读:
NVIC | 内核里面用于管理中断的设备 比如配置中断优先级等 |
SysTick | 内核里的一个定时器 主要用来给操作系统提供定时服务 可以用该定时器完成Delay函数的功能 |
RCC | 对系统的时钟进行配置 还有就是使能各模块的时钟 在STM32中 其他的这些外设在上电的情况下默认是没有时钟的 不给时钟的情况下 操作外设是无效的 外设也不会工作 这样的目的是降低功耗 所以在操作外设之前 必须要先使能它的时钟 这就需要我们用RCC来完成时钟的使能 |
GPIO | 可以用GPIO来点等 读取按键等 |
AFIO | 可以完成复用功能端口的重定义 还有中断端口的配置 |
EXTI | 配置好外部中断后 当引脚有电平变化时 就可以触发中断 让CPU来处理任务 |
TIM | 整个STM32最常用、功能最多的外设 TIM分为高级定时器、通用定时器和基本定时器三种类型 其中高级定时器最复杂 常用的是通用定时器 这个定时器不仅可以完成定时中断的任务 ?还可以完成测频率、生成PWM波形、配置成专用的编码器接口等功能 像PWM波形 就是电机驱动、舵机驱动最基本的要求 |
ADC | 内置了12位的AD转换器 可以直接读取IO口的模拟电压值 无需外部连接AD芯片 使用非常方便 |
DMA | 可以帮助CPU完成搬运大量数据这样的繁忙任务 |
USART | 我们常用的UART是异步串口的意思 实际还是使用异步串口较多 |
I2C/SPI | 非常常用的两种通信协议 STM32内置了他们的控制器 可以用硬件来输出时许波形 使用起来更高效 用通用IO口模拟时序波形也是没有问题的 |
CAN/USB | CAN通信一般用于汽车领域 利用STM32的USB外设 可以做一个模拟鼠标、模拟U盘等设备 |
RTC | 在STM32内部完成年月日、时分秒的计时功能 而且可以接外部备用电池 即使掉电也能正常运行 |
CRC | 是一种数据的校验方式 用于判断数据的正确性 |
PWR | 可以让芯片进入睡眠模式等状态 来达到省电的目的 |
BKP | 是一段存储器 当系统掉电时 仍可由备用电池保持数据 根据需要可以完成一些特殊功能 |
IWDG/WWDG | 当单片机因为电磁干扰死机或者程序设计不合理出现死循环时 看门狗可以及时复位芯片 保证系统的稳定? |
DAC | 可以在IO口直接输出模拟电压 是ADC模数转换的逆过程 |
SDIO | 可以用来读取SD卡 |
FSMC | 可以用于扩展内存 或者配置成其他总线协议 用于某些硬件的操作 |
USB OTG | 用OTG功能 可以让STM32作为USB主机去读取其他USB设备 |
本次学习的是C8T6芯片,其中没有最后后面的4个外设。
5.4 外设资源表
5.5?系统结构
部分参数解读:
- ICode指令总线 DCode数据总线 System系统总线:ICode总线和DCode总线主要用于连接Flash闪存 Flash里面存储的就是编写的程序 ICode指令总线就是用来加载程序指令 DCode数据总线是用来加载数据的 比如常量和调试数据这些 Sysetm总线连接到其他东西上面 比如SRAM 用于存储程序运行时的变量数据
- AHB系统总线主要用于挂载主要外设 AHB的意思时先进高性能总线 挂载的一般是最基本的或者性能比较高的外设 比如复位和时钟控制这些最基本的电路 APB意思是先进外设总线 用于连接一般的外设 由于AHB和APB的总线协议、总线速度、还有数据传送格式的差异 中间需要加上两个桥接 来完成数据的转换和缓存 AHB的整体性能比APB高一些 其中APB2的性能又比APB1高一些 APB2一般是和AHB同频率 都是72MHz APB1一般是36MHz 所以APB2连接的都是一般外设中稍微重要的部分 比如GPIO端口 还有一些外设的1号选手等 比如UASRT1、SPI1、TIM1、TIM8(TIM1和TIM8一样都是高级定时器)、ADC、EXTI、AFIO等 其他的像2、3、4、5号外设 还有DAC、PWR、BKP等这些次要一点的外设 都会分配到APB1上去
- DMA可以把它当作内核CPU的小秘书 比如有一些大量的数据搬运的活 让CPU执行的话太浪费时间 此时就需要DMA 主要就是干像数据搬运这样简单且反复要干的事情 DMA通过DMA总线连接到总线矩阵上 可以拥有和CPU一样的总线控制权 用于访问这些外设 当需要DMA搬运数据时 外设会通过请求线发送DMA请求 然后DMA就会获得总线控制权 访问并转运数据 整个过程不需要CPU的参与 省下了CPU的时间用来干其他事情
5.6 引脚定义
解析:
- 红色的是电源相关的引脚 蓝色的是最小系统相关的引脚 绿色的是IO口、功能口这些引脚 ? FT代表它能容忍5V的电压 没有FT的就只能容忍3.3V的电压
- 主功能是上电后默认的功能 一般和引脚名称相同 不同的话 引脚的实际功能是主功能而不是引脚名称的功能 默认复用功能是IO口上同时连接的外设功能引脚
- 1号引脚起到备用电池供电的作用 在此引脚可以接一个3V的电池 当系统电源断电时 备用电池可以给内部的RTC时钟和备份寄存器提供电源
- 2号引脚是IO口或者侵入检测或者RTC IO口可以根据程序输出或读取高低电平 侵入检测可以用来做安全保障的功能 RTC可以用来输出RTC校准时钟、RTC闹钟脉冲或者秒脉冲
- 3、4号引脚是是IO口或者32.768KHz的RTC晶振
- 5、6号引脚接系统的主晶振 一般是8MHz的 芯片内部有锁相环电路 可以对8MHz的频率进行倍频 最终产生72MHz的频率 作为系统的主时钟
- 7号引脚是系统复位引脚 N代表它是低电平复位
- 8、9号引脚是内部模拟的电源 比如ADC、RC震荡器等 VSS是负极 VDD是正极 接3.3V
- 10-19号引脚都是IO口 其中PA0还兼具了WKUP的功能 可以用于唤醒处于待机模式的STM32
- 20号引脚是IO口或者BOOT1引脚 BOOT引脚是用来配置启动模式的(该引脚是没有加粗的 一般推荐使用加粗IO口 没有加粗的IO口可能需要进行配置 或者兼具其他功能 使用时需要留意一下)
- 21、22号引脚都是IO口
- 23、24号引脚的VSS_1和VDD_1是系统的主电源口 同样的VSS是负极 VDD是正极 下面相同前缀不同编号的引脚都是系统的主电源口 因为STM32内部采用了分区供电的方式 供电口较多 使用时把VSS接GND VDD接3.3V即可
- 25-33号引脚都是IO口
- 34号、37-40号引脚都是IO口或者调试端口 默认的主功能是调试端口 调试端口是用来调试程序和下载程序的 STM32支持SWD和JTAG两种调试方式 SWD需要两根线 分别是SWDIO和SWCLK JTAG需要5根线 分别是JTMS、JTCK、JTDI、JTDO、NJTRST 我们使用的是STLINK来下载调试程序的 而STLINK采用的是SWD的方式 所以只需占用PA13和PA14这两个IO口 在使用SWD的调试方式时 剩下的PA15、PB3、PB4可以切换为普通IO口来使用 但要在程序中进行配置 不配置的话默认是不会用作IO口的
- 41-43、45-46号引脚都是IO口
- 44号引脚是BOOT0 与BOOT1一样 是用来做启动配置的
5.7 启动配置
启动配置的作用是指定程序开始运行的位置 一般情况下 程序都是在Flash程序存储器开始执行 在某些情况下 也可以让程序在别的地方开始执行
启动模式解读:
- 主闪存存储器:正常的执行Flash闪存里面的程序 该模式是最常用的模式 一般情况下都是这个配置
- 系统存储器:该模式是用来做串口下载用的 这个系统存储器存的是STM32中的一段BootLoader程序 该程序的作用是接收串口的数据 然后刷新到主闪存中 这样就可以使用串口下载程序了 一般需要串口下载程序的时候就会配置到这个模式上
- 内置SRAM:该模式主要是用来进行程序调试
5.8 最小系统电路
- BOOT引脚的值是在上电复位后的一瞬间有效而已 由引脚图中第20号引脚可以看到 BOOT1和PB2是在同一个引脚上的 也就是在上电瞬间是BOOT1的功能 当第4个时钟过之后 就是PB2的功能
- 在3.3V和GND之间一般会连接一个滤波电容 作用:保证供电电压的稳定
电路解读:
- 晶振:左边连5 右边连6 另外接两个20pF的电容 作为启震电容 电容的另一端接地即可 如果需要RTC功能 还需要接一个32.768KHz的晶振 接在3、4号引脚 OSC32就是32.768KHz晶振 (32.768是2的15次方 内部RTC经过2的15次分频 就可以生成1s的时间信号)
- 复位:复位电路在上电瞬间电容是没有电的 电源通过电阻开始向电容充电 并且此时电容呈现的是短路状态 那NRST引脚就会产生低电平 当电容逐渐充满电时 电容相当于断路 此时NRST就会被R1上拉为高电平 上电瞬间的波形就是先低电平然后逐渐高电平 电容左边的按键也是如此 当按下按键时 电容被放电 此时NRST引脚通过按键被直接接地 相当于手动产生低电平复位信号 按键松手后 NRST回归高电平 单片机从复位状态转为工作状态
5.9 型号分类及缩写
6、工程建立
6.1 工程结构
6.2 创建工程
【STM32】STM32F103C8T6 创建工程模版详解(固件库)_stm32f103c8t6新建工程-CSDN博客
6.3 编译和下载
选择下载器位ST-Link?Debugger
勾选上电自动复位
编译下载
6.4 点亮LED测试
6.4.1 寄存器实现点灯(PC13)
RCC寄存器来使能GPIOC的时钟 GPIO都是APB2的外设 所以在APB2外设时钟使能寄存器RCC_APB2ENR里面配置?
代码如下:
#include "stm32f10x.h" // Device header
int main(void)
{
RCC->APB2ENR = 0x00000010;//4位为一组 采用16进制方式
GPIOC->CRH = 0x00300000;//C是第13位 我们这里配置的是第13个IO口
GPIOC->ODR = 0X00000000;//第五位给0 全为低电平 则灯亮
// GPIOC->ODR = 0X00000000;//第五位给1 为高电平 则灯灭
while(1)
{
}
}
6.4.2 库函数实现点灯(PC13)
#include "stm32f10x.h" // Device header
int main(void)
{
/*开启时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //开启GPIOC的时钟
//使用各个外设前必须开启时钟,否则对外设的操作无效
/*GPIO初始化*/
GPIO_InitTypeDef GPIO_InitStructure; //定义结构体变量
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //GPIO模式,赋值为推挽输出模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; //GPIO引脚,赋值为第13号引脚
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //GPIO速度,赋值为50MHz
GPIO_Init(GPIOC, &GPIO_InitStructure); //将赋值后的构体变量传递给 GPIO_Init函数
//函数内部会自动根据结构体的参数配置相应寄存器
//实现GPIOC的初始化
/*设置GPIO引脚的高低电平*/
/*若不设置GPIO引脚的电平,则在GPIO初始化为推挽输出后,指定引脚默认输出低电平*/
// GPIO_SetBits(GPIOC, GPIO_Pin_13); //将PC13引脚设置为高电平
GPIO_ResetBits(GPIOC, GPIO_Pin_13); //将PC13引脚设置为低电平
while (1)
{
}
}
实现点灯现象如下: