STM32标准库——简介、工程建立

发布时间:2024年01月17日

1.硬件设备

  • STM32面包板入门套件
  • Windows电脑
  • 万用表、示波器、镊子、剪刀等

2.套件介绍

3.STM32简介

  • STM32是ST公司基于ARM Cortex-M内核开发的32位微控制器
  • STM32常应用在嵌入式领域,如智能车、无人机、机器人、无线通信、物联网、工业控制、娱乐电子产品等
  • STM32功能强大、性能优异、片上资源丰富、功耗低,是一款经典的嵌入式微控制器

3.1 STM32应用领域

STM32的应用领域包括但不限于:

  1. 嵌入式领域:如智能车、无人机、机器人、无线通信、物联网、工业控制、娱乐电子产品、医疗设备、智能家居等。
  2. 高速数据采集系统:使用STM32连接高速ADC和FPGA芯片,实现对高速信号的采集和处理,例如高速摄像头、高速激光测距仪等。
  3. 自动驾驶控制系统:使用STM32连接多个传感器和执行器,例如摄像头、雷达、电机、电子罗盘等,并通过算法设计和优化,实现自动驾驶控制功能。
  4. 机器人视觉系统:使用STM32连接多个摄像头和处理模块,例如OpenCV、CUDA等,并通过算法设计和优化,实现机器人的视觉导航、物体识别等功能。
  5. 网络安全嵌入式设备:使用STM32连接加密模块和网络模块,实现网络安全通信和数据加密等功能,例如VPN、防火墙、数据加密存储等。
  6. 人工智能嵌入式设备:使用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. 1号引脚起到备用电池供电的作用 在此引脚可以接一个3V的电池 当系统电源断电时 备用电池可以给内部的RTC时钟和备份寄存器提供电源
  2. 2号引脚是IO口或者侵入检测或者RTC IO口可以根据程序输出或读取高低电平 侵入检测可以用来做安全保障的功能 RTC可以用来输出RTC校准时钟、RTC闹钟脉冲或者秒脉冲
  3. 3、4号引脚是是IO口或者32.768KHz的RTC晶振
  4. 5、6号引脚接系统的主晶振 一般是8MHz的 芯片内部有锁相环电路 可以对8MHz的频率进行倍频 最终产生72MHz的频率 作为系统的主时钟
  5. 7号引脚是系统复位引脚 N代表它是低电平复位
  6. 8、9号引脚是内部模拟的电源 比如ADC、RC震荡器等 VSS是负极 VDD是正极 接3.3V
  7. 10-19号引脚都是IO口 其中PA0还兼具了WKUP的功能 可以用于唤醒处于待机模式的STM32
  8. 20号引脚是IO口或者BOOT1引脚 BOOT引脚是用来配置启动模式的(该引脚是没有加粗的 一般推荐使用加粗IO口 没有加粗的IO口可能需要进行配置 或者兼具其他功能 使用时需要留意一下
  9. 21、22号引脚都是IO口
  10. 23、24号引脚的VSS_1和VDD_1是系统的主电源口 同样的VSS是负极 VDD是正极 下面相同前缀不同编号的引脚都是系统的主电源口 因为STM32内部采用了分区供电的方式 供电口较多 使用时把VSS接GND VDD接3.3V即可
  11. 25-33号引脚都是IO口
  12. 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口的
  13. 41-43、45-46号引脚都是IO口
  14. 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)
	{
		
	}
}

实现点灯现象如下:

文章来源:https://blog.csdn.net/2301_78772787/article/details/135636438
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。