stm32f4xx固件库,之了会计课堂官网
墨初 知识笔记 68阅读
当IO口用作输入时,IO口的输出部分已经关闭。根据是否使用上拉,输入分为以下三种情况:GPIO口配置为输出模式时,即I/O无上拉或下拉的电平状态不确定,完全由外部输入决定。如果在没有信号输入的情况下读取端口的电平,则不确定。注意:的I/O引脚悬空时,连接电阻防止输入端悬空,提高系统抗干扰能力。减少外部电流对芯片的干扰。上拉使用上拉电阻器。在没有信号输入的情况下,输入端的电平可以保持在高电平,在这种模式下可以检测到外部低电平。下拉
>下拉输入模式即采用下拉电阻。在无信号输入的情况下输入端的电平可以保持在低电平此模式下可以检测到外部高电平。
三、GPIO口相关寄存器分析
一 内存映射将芯片内存空间分配的过程。

FLASH:0X080000000~0X080FFFFFF 1M
SRAM:CCM112SRMA16SRAM 192KB
注意CCM专门给内核使用的高速SRAM。
112SRMA16SRAM 128KB组成如下
FLASH数据空间组成
寄存器映射将一段具体的内存空间分配给某一个外设使用的的过程。
1.寄存器寄存器就是一个变量只不过这个变量的地址固定变量名固定,也是一个全局变量。
寄存器可以同时被内部电路和外部电路或软件访问CPU中的寄存器就是其中一种作为软硬件的接口广泛的应用在单片机电路中。
2寄存器的特点
(1)寄存器地址是在芯片中固定好的即和相关硬件绑定在一起的当向该寄存器写入不同的数据时硬件的状态会跟随寄存器的数据改变而改变。{重点}
(2)通过寄存器的名字访问每个寄存器。
3寄存器的操作
寄存器赋值寄存器名 值
读寄存器的值变量名 寄存器名。
4每个通用 I/O 组包括10个寄存器如下描述
4 个 32 位配置寄存器 GPIOx_MODER、 GPIOx_OTYPER、GPIOx_OSPEEDR 和 GPIOx_PUPDR、
2 个 32 位数据寄存器GPIOx_IDR 和GPIOx_ODR、
1 个 32 位置位/复位寄存器 (GPIOx_BSRR)、
1 个 32 位锁定寄存器(GPIOx_LCKR)
2 个 32 位复用功能选择寄存器 GPIOx_AFRH 和 GPIOx_AFRL。
寄存器的访问方式
GPIOA
#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)
#define GPIOA_BASE (AHB1PERIPH_BASE 0x0000)
#define AHB1PERIPH_BASE (PERIPH_BASE 0x00020000)
#define PERIPH_BASE ((uint32_t)0x40000000)
typedef struct
{
__IO uint32_t MODER;
__IO uint32_t OTYPER;
__IO uint32_t OSPEEDR;
__IO uint32_t PUPDR;
__IO uint32_t IDR;
__IO uint32_t ODR;
__IO uint16_t BSRRL;
__IO uint16_t BSRRH;
__IO uint32_t LCKR;
__IO uint32_t AFR[2];
} GPIO_TypeDef;
GPIOA 0x400000000x00020000 0x0000 (GPIO_TypeDef *) 0x40020000
可以看出ST将寄存器封装在结构体中并强行转为结构体指针
所以可以使用结构体指针访问结构体成员也就是寄存器适用于所有的外设GPIO UART….
GPIOA->ODR
GPIOA->IDR
STM32F407VGT6的GPIO相关的寄存器有以下几个
GPIO 端口模式寄存器 (GPIOx_MODER) (x A..I)(GPIOA_MODER地址0x4002 0000)
MODERy[1:0]端口 x 配置位 (Port x configuration bits) (y 0..15)
这些位通过软件写入用于配置 I/O 方向模式。
00输入复位状态
01通用输出模式
10复用功能模式
11模拟模式
举例PC4:配置为输出模式如何配置
GPIOC->MODER &~(3 << (4*2));
GPIOC->MODER |0X1 << (4*2);
GPIO 端口输出类型寄存器 (GPIOx_OTYPER) (x A..I)
位 31:16 保留必须保持复位值。
位 15:0 OTy[1:0]端口 x 配置位 (Port x configuration bits) (y 0..15)
这些位通过软件写入用于配置 I/O 端口的输出类型。
0输出推挽复位状态
1输出开漏
举例PC4:配置为推挽类型 如何配置
GPIOC->OTYPER &~(0X1 << 4);//推挽输出
GPIO 端口输出速度寄存器 (GPIOx_OSPEEDR) (x A..I/)
OSPEEDRy[1:0]端口 x 配置位 (Port x configuration bits) (y 0..15)
这些位通过软件写入用于配置 I/O 输出速度。
002 MHz低速
0125 MHz中速
1050 MHz快速
1130 pF 时为 100 MHz高速15 pF 时为 80 MHz 输出最大速度
配置多少的速度与功能相关。
注意这里的速度指的是IO口的高低电平的切换速度而且速度越大功耗也越大。
举例PC4:配置为2mhz如何配置
GPIOC->OSPEEDR &~(0X3 << (4*2));
GPIO 端口上拉/下拉寄存器 (GPIOx_PUPDR) (x A..I/)
PUPDRy[1:0]端口 x 配置位 (Port x configuration bits) (y 0..15)
这些位通过软件写入用于配置 I/O 上拉或下拉。
00无上拉或下拉(浮空)
01上拉
10下拉
11保留
举例PC4:配置为无上下拉 如何配置
GPIOC->PUPDR &~(0X3 << (4*2));//无上下拉
GPIO 端口输入数据寄存器 (GPIOx_IDR) (x A..I)
位 31:16 保留必须保持复位值。
位 15:0 IDRy[15:0]端口输入数据 (Port input data) (y 0..15)
这些位为只读形式只能在只读模式下访问。它们包含相应 I/O 端口的输入值。
当前IO口的状态结果。
GPIO 端口输出数据寄存器 (GPIOx_ODR) (x A..I)
位 31:16 保留必须保持复位值。
位 15:0 ODRy[15:0]端口输出数据 (Port output data) (y 0..15)
这些位可通过软件读取和写入。
想要IO口输出高电平还是低电平通过该寄存器写1/0操作即可。
GPIO 端口置位/复位寄存器 (GPIOx_BSRR) (x A..I)
位 31:16 BRy端口 x 复位位 y (Port x reset bit y) (y 0..15)(让IO口输出低电平)
这些位为只写形式只能在字、半字或字节模式下访问。读取这些位可返回值 0x0000。
0不会对相应的 ODRx 位执行任何操作
1对相应的 ODRx 位进行复位
注意 如果同时对 BSx 和 BRx 置位则 BSx 的优先级更高。
位 15:0 BSy端口 x 置位位 y (Port x set bit y) (y 0..15)(让IO口输出高电平)
这些位为只写形式只能在字、半字或字节模式下访问。读取这些位可返回值 0x0000。
0不会对相应的 ODRx 位执行任何操作
1对相应的 ODRx 位进行置位
RCC AHB1 外设时钟使能寄存器 (RCC_AHB1ENR)
时钟关系由于STM32是一款低功耗的芯片每个功能都进行时钟控制不开启相应的时候不能正常工作。使用到GPIO口就必须开启GPIO口相关的时钟。
有芯片框图得知GPIO口挂载在AHB1总线上它的时钟线就是AHB1时钟线。
时钟相关的配置在RCC单元中。RCC是专门的时钟控制单元。
四、GPIO口实验设计
设计思路
硬件初始化
Void led_init(void)
{
IO配置
1开时钟
2模式输出模式
3类型推挽
4速度2MHZ(默认)
5上下拉无上下拉(默认)内部的上下拉很微弱
注意初始时刻灯默认不亮
}
点灯算法实现
按键识别验证基本输入功能
实验设计让MCU检测IO口的输入电平从而判断按键是否按下。
KEY1-->PA0 高电平按下
KEY2-->PE2 低电平按下
KEY3-->PE3 低电平按下
KEY4-->PE4 低电平按下
软件设计
硬件初始化
Void key_init(void)
{
//IO配置
1开时钟
2模式输入模式
3上下拉无上下拉(浮空输入)
}
如何判断按键按下算法实现。
需要判断GPIO口的电平状态去确定按键是否按下如下图理想状态
如上图所示按下之后是低电平松开是高电平但是按键按下过程中有按键不稳定的情况出现所以实现按键操作必须要进行消斗功能为什么要消斗
原因如下
因为按键都是机械式的两个金属片在接触的瞬间从微秒级的时间段来看会存在接触-断开-再接触这样的轻微的抖动。直到两个金属片牢牢的接触到一起之后抖动才会消失。
消斗原理
所谓按键去抖动就是通过各种处理(延时)来消除掉接触再断开这种异常状态的。
一般选择延时来去除抖动。