- Date:2023-06-08

  • Time:20:49
  • Subject: none
  • Tags: #stm32 #GPIO
    [[2023-06]]

通用外设驱动模型(四步法)

  1. 初始化
    1. 时钟设置:选择时钟源,启动时钟
    2. 参数设置:gpio工作方式
    3. io设置:除了gpio,如串口usart,
    4. 中断设置:开启,设置NVIC
  2. 读函数(可选)
    1. 从外设读取数据
  3. 写函数(可选)
    1. 往外设写入数据
  4. 中断服务函数(可选)
    1. 根据中断标志,处理外设各种中断事务

GPIO配置步骤

#配置

使能时钟

__HAL_RCC_GPIOx_CLK_ENABLE()
主要寄存器:
F1:RCC_APB2ENR //APB2总线上的
F4:RCC_AHB1ENR
F7:RCC_AHB1ENR
H7:RCC_AHB4ENR
开启GPIO时钟

设置工作模式

HAL_GPIO_Init()
主要寄存器:
F1:CRL、CRH、ODR
F4/F7/H7:MODER、OTYPER、OSPEEDR、PUPDR
初始化GPIO

设置输出状态(可选)

HAL_GPIO_WritePin()
HAL_GPIO_TogglePin()
主要寄存器:
BSRR,控制IO输出高/低电平;BSRR,每次调用IO输出电平翻转一次

读取输入状态(可选)

HAL_GPIO_ReadPin()
主要寄存器:
IDR,读取IO电平

关键结构体简介

F1

1
2
3
4
5
6
7
typedef struct
{
  uint32_t Pin;        /* 引脚号 */
  uint32_t Mode;   /* 模式设置 */
  uint32_t Pull;       /* 上拉下拉设置 */
  uint32_t Speed;  /* 速度设置 */
} GPIO_InitTypeDef;

F4/F7/H7

1
2
3
4
5
6
7
8
typedef struct
{
  uint32_t Pin;              /* 引脚号 */
  uint32_t Mode;         /* 模式设置 */
  uint32_t Pull;            /* 上拉下拉设置 */
  uint32_t Speed;       /* 速度设置 */
  uint32_t Alternate; /* 复用功能 */
} GPIO_InitTypeDef;

- Date:2023-06-08

  • Time:19:32
  • Subject: none
  • Tags: #stm32 #GPIO
    [[2023-06]]

GPIO寄存器介绍

Pasted image 20230608193627|600
x:A B…
yyy:寄存器简写

端口配置 寄存器(CRL)- F1

Pasted image 20230608195953|600
需要上下表格同时看,3 2 1 0 控制一个io口,4bit控制一个io口,

端口配置 寄存器(CRH)- F1

Pasted image 20230608200615|600
上面两个加起来控制16个io口,都起配置作用;每组 GPIO 下有 16 个 IO 口,一个寄存器共 32 位,每 4 个位控制 1 个 IO,所以才需要两个寄存器完成。

工作模式配置补充 – F1

Pasted image 20230608201001|600
补充的原因:cnf1 cnf0位置配置上下拉输入,但是不确定,需要在odr寄存器中再设置

端口输出数据寄存器(ODR)– F1

Pasted image 20230608201200|600
用于设置IO引脚输出的电平
PA10对应ODR10,设置功能对应的值看上图

端口输入数据寄存器(IDR)– F1

Pasted image 20230608202245|600
用于判断IO引脚的电平,用于读取的外部输入的是高还是低的寄存器

端口位设置/清除寄存器(BSRR)– F1

Pasted image 20230608202716|600
比如再BS10设置为1,则ODR10位就输出高电平

F4/F7/H7系列的GPIO相关寄存器略(看ppt

ODR和BSRR寄存器控制输出有什么区别?

ST官方给的答案:使用ODR,在读和修改访问之间产生中断时,可能会发生风险;BSRR则无风险。
BSRR  VS  ODR:

1
2
3
4
GPIOB->ODR |= 1 << 3;           /* PB3 = 1 */
相当于ODR=ODR|(1<<3),先读取了原来的值,再进行操作

GPIOB->BSRR = 0x00000008;      /* PB3 = 1 */

ODR修改:读->改->写
BSRR修改:  写
可能在 读改 或者 改写 的过程中有中断,发生问题
建议大家使用BSRR寄存器控制输出

- Date:2023-06-08

  • Time:11:03
  • Subject:
  • Tags: #stm32 #GPIO
    [[2023-06]]

IO端口基本结构介绍

F1的IO结构图

Pasted image 20230608110438|600

F4/F7/H7的IO结构图

Pasted image 20230608110411|600

施密特触发器简介

施密特触发器就是一种整形电路,可以将非标准方波,整形成方波
特点:

  1. 当输入电压高于正向阈值电压,输出为高;
  2. 当输入电压低于负向阈值电压,输出为低;
  3. 当输入在正负向阈值电压之间,输出不改变。
    效果:整形!如正弦波转方波
    Pasted image 20230608111057|600

P-MOS & N-MOS管简介

MOS管是压控型元件,通过控制栅源电压( Vgs )来实现导通或关闭。
Pasted image 20230608112257|600
Vgs=Vg-Vs,用1,0的逻辑来看也可以的
P是G接入高电平不导通,相当于两个1不导通
N则是两个0不导通,G接入高电平导通

GPIO的八种模式分析

从stm32f103参考手册中的章节可以找出来
四个输入,四个输出
Pasted image 20230608112801|600

GPIO工作模式:输入浮空

Pasted image 20230608112900|600
外部高阻态的时候

GPIO工作模式:输入上拉

Pasted image 20230608113146|600

GPIO工作模式:输入下拉

Pasted image 20230608113208|600

GPIO工作模式:模拟功能

Pasted image 20230608113310|600

GPIO工作模式:开漏输出

Pasted image 20230608113316|600
P-MOS的G端一直高电平,一直不导通,N端受输出控制控制,ODR给0,则输出控制高(输出控制的地方相当于对信号进行了取反操作),mos导通(把VSS的低电平输出出去了),给1则输出低,mos不导通(形成高阻态,没有意义,但是看后面),这样让N-MOS开或者关,同时外面I/O引脚处有个上拉电阻(必须),那么则会输出上拉电阻处的高电平,高阻态则可忽略掉,让整个引脚的电压情况随着N-MOS的情况改变
相当于这样:Pasted image 20230608191400|600
f1是要自己搞外部上拉,其他的自带内部,可看前面的图
允许输入,ttl肖特基触发器接通了
ODR是输出数据寄存器,IDR就是上面输入的那个

GPIO工作模式:开漏式复用功能

Pasted image 20230608113411|600
片上外设控制,仍让需要外部上拉

GPIO工作模式:推挽输出

Pasted image 20230608113422|600
与开漏有区别,两个mos分别在ODR 的0/1的时候作用

GPIO工作模式:推挽式复用功能

Pasted image 20230608113433|600

- Date:2023-06-08

  • Time:10:50
  • Subject:
  • Tags: #stm32 #GPIO
    [[2023-06]]

什么是GPIO

General Purpose Input Output,即通用输入输出端口,简称GPIO
作用:负责采集外部器件的信息或者控制外部器件工作,即输入输出
例子:Pasted image 20230608105342|600

STM32 GPIO简介

GPIO特点

  1. 不同型号,IO口数量可能不一样,可通过选型手册快速查询
  2. 快速翻转,每次翻转最快只需要两个时钟周期(F1最高速度可以到50Mhz)
  3. 每个IO口都可以做中断
  4. 支持8种工作模式

GPIO电器特性

Pasted image 20230608105512|600
TTL端口:标识FT,5v-3.3v
为什么是-0.3和3.6,因为有保护二极管,钳位,有压降和压升

GPIO引脚分布

STM32引脚类型:

  1. 电源引脚(v开头)、晶振引脚(低速标32,高速不确定)、复位引脚(nrst)、下载引脚、BOOT引脚(boot0 boot1)、GPIO引脚(p开头)

不同芯片引脚分布情况

Pasted image 20230608105642|600