STM32(持续更新)

1.环境配置

  1. MDK5安装Keil MDK (arm.com)需要繁琐的注册(还要美国号码进行登录,我是整破防了),不如用别人破解的(破解教程keil5下载(含安装注册)-CSDN博客)我用夸克网盘分享了「keil5.rar」,点击链接即可保存。打开「夸克APP」,无需下载在线播放视频,畅享原画5倍速,支持电视投屏。
    链接:https://pan.quark.cn/s/6aa84865bf96
  2. STM32CubeMX安装STM32CubeMX:图形化工具 – 意法半导体STMicroelectronics
  3. CH340驱动安装看情况安装
  4. 核心板一块(我这里的使用的STM32F103C8T6)

2.单片机认知

1.概述

电脑体积随技术进步进化到现在的大小,通常包含以下部件

  1. CPU
  2. 主板
  3. 硬盘
  4. 显示器
  5. 内存
  6. 键鼠

单片机就是对应的电脑整机,因为在一颗芯片上包含CPU,硬盘,内存等外设成为单片机

2.结构图

根据官方文档https://datasheet.octopart.com/STM32F103VET6-STMicroelectronics-datasheet-140570544.pdf

STM32F103VET的框图

c2565b3aaced9e00e33389be0d470726_720

这里分别是

  1. 内核Cortex-M3
  2. Flash,包含512k(类似硬盘)
  3. SRAM,包含64k(类似内存)

但是这样写并不准确,部分单片机不一定拥有FLAH或者RAM

3.最小系统

单片机能工作的最小外围电路就叫做最小系统

包括:

  1. 时钟(晶振)
  2. 工作电源(5V系统,3.3V系统,1.8V系统)
  3. 外部设置(例如:启动模式选择)

1.原理框架

未命名文档_0

1.电源

框1:主电源

一个3.3V电源和一些电容

框4:模拟电源

主电源通过磁珠等手段隔离而得模拟电源

框8:备份电源

使用一个二极管并联,有外电时使用外电3.3V,没有外电时才使用纽扣电池电源,用于低功耗下维持CPU的RTC和备份区功能,

2.时钟

框5:主时钟

通常都是由一个晶体和2个电容组成,晶体的频率就是主频,电容容值根据芯片设计匹配,否则晶体不起振,如图主时钟8M晶振电路负责驱动整个系统的运行

框2:实时时钟(RTC时钟)

提供精确的时间和日期信息。它在系统断电时可以继续保持时间计数

负责时间保持和时间戳功能

3.复位电路

框3:复位电路

用于复位CPU,通常是低电平复位

4.框6:选择电路

启动选择电路用于在系统启动时选择不同的启动源(如Flash、RAM或外部设备),以决定程序从哪里开始执行

5.框7:调试口

用于连接调试器和单片机,实现代码下载、调试和监控功能。

2.硬件实物

image-20240806174747844
  1. 框1:复位电路,按复位按键复位系统
  2. 框2;电源电路,将外部的5V转换为3.3V
  3. 框3:启动选择电
  4. 框4:纽扣电池电路
  5. 框5:主芯片和电源电路,4个电容要靠近芯片电源管脚
  6. 框6:实时时钟
  7. 框7:主时钟,8M频率
  8. 框8:模拟电源

3.工程创建

需要先配置好环境

1.安装芯片支持包

image-20240807012045915

选择对应的版本下载

image-20240807012344239

也可以直接导入

image-20240807012554607

这里我已经安装成功了,可以选择升级

2.配置IDE环境

image-20240807012747932

选择 Automatic reload of externally..选项,OK保存即可

image-20240807012823802

3.配置模板库(方便以后使用)

我用夸克网盘分享了「固件库.zip」,点击链接即可保存。打开「夸克APP」,无需下载在线播放视频,畅享原画5倍速,支持电视投屏。
链接:https://pan.quark.cn/s/279fd063e9bd

创建一个模板文件夹

image-20240807173257411

配置CMSIS文件夹

导入CMSIS文件到对应的模板中

(CMSIS指arm公司规定的存放核心代码的文件夹)

image-20240807165554875

以及导入ST公司的器件支持文件

image-20240807170402028

配置Library文件夹

存放外设驱动文件

将这个文件夹下的两个文件夹放到Libray中

image-20240807170826556

配置Start文件夹

将arm的stratup文件拷贝

image-20240807172345970

配置User文件夹

将如下文件拷贝到user中

image-20240807172805552

4.创建新工程

1.命名

随便取一个名字test,打开即可

image-20240807013012238

2.选择对应版本

image-20240807013346839

3.OK跳过

image-20240807013411424

project窗口丢失可以在view中找到

image-20240807014301571
image-20240807014321097

5.导入配置模版

将前面的mode文件夹中的四个文件夹直接拷贝到我们生成的工程目录中

image-20240807173537317

然后点击框中的按钮,在keil中导入配置模板

image-20240807173724013

配置如下

image-20240807173940768

在每个文件夹后面选择add file,然后添加

image-20240807174011175

Libray只需要导入src中文件即可

user如下添加

image-20240807174400087

start选择这个中等文件即可

image-20240807174231499

然后打开user中的main.c文件即可

image-20240807174527188

可将无用配置的删除,简化为

image-20240807175003330

6.Target魔术棒设置

image-20240807175400858

output配置

打开create hex file

image-20240807175444232

C/C++配置

设施宏定义

USE_STDPERIPH_DRIVER,STM32F10x_MD

在include path中填入模板的文件的地址(如图)

注意:library中文件要分开加入

image-20240807183822982

Debug配置

将debug选项配置为st-link,然后setting中选择支持reset and run

image-20240807184043037

Target配置

image-20240807184232408

选中后C/C++界面会显示支持C99

7.中文显示

image-20240807184359029

选中中文支持

image-20240807184432312

8.运行测试

我们选中这里的build(F7)即可

image-20240807184732274

4.IO&点亮LED

这里用于测试和分析的STM32C8XX共有100个引脚

IO

IO是指Input&Output即输入和输出

1.引脚分配

根据官方文档分析

image-20240807214326360

100个引脚,在这里有80个I/O口(P前缀的引脚集市I/O口)

共分为PA,PB,PC,PD,PE五组I/O口

其他功能引脚:(如下图)

  1. 普通电源有5组
  2. 模拟电源有1组
  3. 备份电源1组
  4. 参考电压1组(VREF)
  5. 复位脚1组
  6. 启动配置1组(BOOT0)
  7. 晶振2组(RTC晶振可作为普通I/O)
  8. 空引脚1组(73号NC)
image-20240807215037333

部分引脚存在服用的情况具体参考官方说明

image-20240807215714565
image-20240807215729909
image-20240807215753685
image-20240807215812558
image-20240807215823261

2.GPIO

除了DA转换和AD转换, 其他的IO口都是数字逻辑功能

概述

GPIO(通用输入输出)是单片机和微控制器中非常重要的外设模块

芯片用的是TTL电平(数字电平的一种),高电平和低电平(高电平是逻辑1,低电平是逻辑0)

高电平是芯片的IO电压(STM32没有独立IO电压,所以IO电压就是是芯片工作电压),低电平是就低电平

1.基本作用:
  • 输入模式:GPIO 引脚配置为输入时,可以读取外部设备或电路的电平状态
  • 输出模式:GPIO 引脚配置为输出时,可以驱动外部设备或电路,比如点亮 LED
  • 上拉/下拉电阻:GPIO 引脚可以配置内部的上拉或下拉电阻,以确保引脚在未连接时处于已知状态
  • 中断功能:GPIO 引脚可以配置为中断源,当引脚状态发生变化时触发中断
2.工作模式:

输入模式:

  • 浮空输入:引脚没有内部上拉或下拉电阻
  • 上拉输入:引脚内部连接到上拉电阻,默认状态为高电平
  • 下拉输入:引脚内部连接到下拉电阻,默认状态为低电平

输出模式:

  • 推挽输出:引脚可以输出高电平或低电平
  • 开漏输出:引脚可以下拉到低电平或处于高阻状态,常用于与其他设备共享总线

复用功能:

  • GPIO 引脚可以配置为其他外设的功能,比如 UART、SPI、I2C等

1.驱动功能

驱动能力即是一个IO口输出电流或输入电流的能力

官方文档规范
image-20240807231322928
灌电流和拉电流

灌电流(Sink Current)

  • 定义:当GPIO引脚处于低电平(逻辑0)时,允许流入引脚的最大电流。
  • 示例:如果一个LED的阳极(正极)连接到电源,阴极(负极)通过限流电阻连接到GPIO引脚,当GPIO引脚输出低电平时,电流将从电源流经LED和限流电阻进入引脚,这个电流就是灌电流。
  • 25mA的含义:表示每个GPIO引脚在低电平状态下,最多可以承受25毫安的电流流入。

拉电流(Source Current)

  • 定义:当GPIO引脚处于高电平(逻辑1)时,允许流出引脚的最大电流。
  • 示例:如果一个LED的阳极(正极)连接到GPIO引脚,阴极(负极)通过限流电阻连接到地,当GPIO引脚输出高电平时,电流将从引脚流出,经过LED和限流电阻到地,这个电流就是拉电流。
  • 25mA的含义:表示每个GPIO引脚在高电平状态下,最多可以提供25毫安的电流流出。

示例:

假设你有一个STM32微控制器,LED的正极连接到Vcc(比如5V),负极通过一个限流电阻连接到GPIO引脚

  • 当GPIO引脚输出低电平时,LED点亮,这时流入引脚的电流不能超过25mA,这就是灌电流的限制
  • 当LED的正极连接到GPIO引脚,负极通过限流电阻接地时,当GPIO引脚输出高电平时,流出引脚的电流不能超过25mA,这就是拉电流的限制

注意:

  • 大电流的LCD背光,就需要在外部添加三极管驱动电路
  • 有些芯片,灌电流和拉电流的最大值不一样,灌电流可能只有5ma

2.STM32 IO特性

在 STM32 单片机中,GPIO(通用输入输出)引脚可以配置为多种模式,用于不同的应用场景

GPIO 模式分类
  1. 输入模式
    • 浮空输入(Floating Input):引脚没有内部上拉或下拉电阻,输入状态不确定
    • 上拉输入(Pull-up Input):引脚内部连接到上拉电阻,默认状态为高电平
    • 下拉输入(Pull-down Input):引脚内部连接到下拉电阻,默认状态为低电平
  2. 输出模式
    • 推挽输出(Push-Pull Output):引脚可以输出高电平或低电平,驱动能力强
    • 开漏输出(Open-Drain Output):引脚只能输出低电平或高阻态,输出高电平需要外部上拉电阻
功能推挽开漏
高电平驱动能力外部上拉电阻提供
低电平驱动能力
电平转换速度外部上拉电阻决定,电阻越小,反应越快,功耗越大
线与功能不支持支持
电平转换不支持支持

推挽输出(Push-Pull Output)

  • 高电平驱动能力:强,输出电压等于 Vcc(通常为 3.3V 或 5V)
  • 低电平驱动能力:强,输出电压接近 0V
  • 电平转换:快,适用于驱动速度要求高的负载
  • 适用场景:直接驱动 LED、驱动数字电路、输出稳定的逻辑电平信号

开漏输出(Open-Drain Output)

  • 高电平驱动:依赖外部上拉电阻,输出电压由上拉电阻连接的电源电压决定
  • 低电平驱动能力:强,输出电压接近 0V
  • 电平转换:由外部上拉电阻决定,电阻越小,转换速度越快但功耗越大
  • 适用场景:多设备总线(如 I2C)、需要电平转换的场合(如从 3.3V 转换到 5V)

示例:

使用推挽模式驱动 LED 的简单示例代码:

#include "stm32f10x.h"  

void GPIO_Config(void) {
   // 启用 GPIO 端口时钟
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

   GPIO_InitTypeDef GPIO_InitStructure;
   
   // 配置 PC13 为推挽输出
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
   GPIO_Init(GPIOC, &GPIO_InitStructure);
}

int main(void) {
   // 初始化 GPIO
   GPIO_Config();
   
   while (1) {
       // 设置高电平,点亮 LED
       GPIO_SetBits(GPIOC, GPIO_Pin_13);
       // 延时
       for (int i = 0; i < 1000000; i++);
       
       // 设置低电平,熄灭 LED
       GPIO_ResetBits(GPIOC, GPIO_Pin_13);
       // 延时
       for (int i = 0; i < 1000000; i++);
  }
}
STM32 IO 速度配置

STM32 的 GPIO 引脚速度可以配置,以适应不同的应用需求

配置不当可能增加功耗和电磁干扰(EMC)

  • 2MHz:适用于低速信号和普通 IO 功能
  • 10MHz:适用于中速信号,如 I2C 通信
  • 50MHz:适用于高速信号,如 SPI 通信

配置示例:

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;  // 2MHz
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; // 10MHz
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 50MHz

3. ST库

STM32标准外设库由STMicroelectronics提供的一套用于STM32系列微控制器的软件库(简化对STM32外设的访问和控制,提供了一组易于使用的API函数)

GPIO库函数
初始化和复位
函数说明
void GPIO_DeInit(GPIO_TypeDef* GPIOx)复位指定GPIO端口的配置
void GPIO_AFIODeInit(void)复位所有复用功能相关的配置
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)初始化指定GPIO端口的配置
void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct)将GPIO_InitTypeDef结构体初始化为默认值
数据读写
函数说明
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)读取指定引脚的输入数据位
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx)读取整个端口的输入数据
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)读取指定引脚的输出数据位
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx)读取整个端口的输出数据
输出控制
函数说明
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)将指定引脚设置为高电平
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)将指定引脚设置为低电平
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal)设置指定引脚的电平状态
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal)设置整个端口的电平状态
其他配置
函数说明
void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)锁定指定引脚的配置
void GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource)配置事件输出引脚
void GPIO_EventOutputCmd(FunctionalState NewState)启用或禁用事件输出功能
void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState)配置引脚重映射功能
void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource)配置外部中断线
void GPIO_ETH_MediaInterfaceConfig(uint32_t GPIO_ETH_MediaInterface)配置以太网媒体接口
GPIO 结构体(初始化)

GPIO_InitTypeDef结构体初始化GPIO引脚

typedef struct
{
 uint16_t GPIO_Pin;             /*!< 指定要配置的GPIO引脚。可以是@ref GPIO_pins_define 中的任意值 */
 GPIOSpeed_TypeDef GPIO_Speed;  /*!< 指定引脚的速度。可以是@ref GPIOSpeed_TypeDef 中的任意值 */
 GPIOMode_TypeDef GPIO_Mode;    /*!< 指定引脚的模式。可以是@ref GPIOMode_TypeDef 中的任意值 */
} GPIO_InitTypeDef;

引脚速度枚举类型

typedef enum
{
 GPIO_Speed_10MHz = 1,
 GPIO_Speed_2MHz,
 GPIO_Speed_50MHz
} GPIOSpeed_TypeDef;

引脚模式枚举类型

typedef enum
{
 GPIO_Mode_AIN = 0x0,          /*!< 模拟输入模式 */
 GPIO_Mode_IN_FLOATING = 0x04, /*!< 浮空输入模式 */
 GPIO_Mode_IPD = 0x28,         /*!< 下拉输入模式 */
 GPIO_Mode_IPU = 0x48,         /*!< 上拉输入模式 */
 GPIO_Mode_Out_OD = 0x14,      /*!< 开漏输出模式 */
 GPIO_Mode_Out_PP = 0x10,      /*!< 推挽输出模式 */
 GPIO_Mode_AF_OD = 0x1C,       /*!< 复用开漏模式 */
 GPIO_Mode_AF_PP = 0x18        /*!< 复用推挽模式 */
} GPIOMode_TypeDef;

示例:

以下是一个使用库函数初始化GPIO引脚,并配置为推挽输出模式以驱动LED的示例代码:

#include "stm32f10x.h"

void GPIO_Config(void) {
   // 启用GPIOD端口时钟
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);

   GPIO_InitTypeDef GPIO_InitStructure;

   // 配置PD0和PD2为推挽输出模式
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_2;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
   GPIO_Init(GPIOD, &GPIO_InitStructure);
}

int main(void) {
   // 初始化GPIO
   GPIO_Config();
   
   while (1) {
       // 设置高电平,点亮LED
       GPIO_SetBits(GPIOD, GPIO_Pin_0 | GPIO_Pin_2);
       // 延时
       for (int i = 0; i < 1000000; i++);
       
       // 设置低电平,熄灭LED
       GPIO_ResetBits(GPIOD, GPIO_Pin_0 | GPIO_Pin_2);
       // 延时
       for (int i = 0; i < 1000000; i++);
  }
}

LED

有机发光二极管(OLED)和无机发光二极管(LED)

LED的本质是一个二极管,当在正极和负极之间施加电压时,电流通过LED,使其发光(LED的亮度与通过它的电流成正比)

LED规格

image-20240808113249388

顺向电流,就是LED的工作电流,不能超过20mA

驱动方式

两种驱动方式:低电平驱动(灌电流)和高电平驱动(拉电流)

低电平驱动(灌电流)

LED正极通过一个限流电阻接到电源,负极接到微控制器的IO口

当IO口输出低电平时,电流从电阻流过,流过LED,进入IO口,LED发光

image-20240808113936301

高电平驱动(拉电流)

LED负极接地,正极通过一个限流电阻接到微控制器的IO口

当IO口输出高电平时,电流从IO口流过,流过电阻,再通过LED接地,LED发光

image-20240808113946694

示例

灌电流模式,4位LED电路原理图

image-20240808114334528
  • LED正极通过一个限流电阻接到VCC3V3,也就是高电平,负极接到IO口
  • 当IO口输出低电平,电流从电阻流过,流过LED,流入IO口,LED就会发光

限流电阻是防止流过LED的电流大于LED的顺向电流最大值

5.数码管

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇