流水灯实验:
一、GPIO口概述
在CortexM4中一大部分都是GPIO口-》General Purose Input/Output 通用输入输出引脚,每一个引脚都可以引出一根功能复用线:配置不同功能;
GPIO口四大功能:
(1)输入input 从外部向芯片输入电平信号,芯片用来感知
(2)输入output 引脚向外部输出电平信号
(3)复用功能 例如:通用定时器/串口
(4)特殊功能
就用GPIO来总管外设
呐~实验就是以GPIO为基础嘛
STM32F4xx共有144个GPIO引脚,分为9组:GPIOA~GPIOI 每个GPIO分组都包含16个引脚
例如这里列出来GPIOA分组的16个引脚
算一下一共有多少引脚呢:16*9=144
那么芯片是如何管理这些端口的性质呢:
每组GPIO口都配置:
(1)4个32位寄存器用于基本配置(OTPYER、OSPEEDR、MODER、PUPDR)
(2)2个32位寄存器用于数据配置(IDR、ODR)
(3)1GPIO用于复位、置位(BSSR)
(4)1个锁存器(LCKR)
(5)2个复用功能寄存器(AFRH、AFRL)
哇有没有感觉一个GPIO口给他服务的寄存器好多啊~哈哈哈各个GPIO都是小皇帝,寄存器是小佣人
GPIOA:0x4002 0000~0x4002 03ff
二、GPIO功能描述(主要是前三个)
首先说清楚什么是上拉、下拉电阻
(a)上拉电阻,在电阻那边接一个正电压
(b)下拉电阻,电阻那边解一个GND
(1)输入模式
输入数据每个一个AHB1时钟周期获取一次值
(a)输入悬空:GPIO口没有什么电阻在外
CPU通过读取GPIO口就知道外部是什么电平
(b)带上拉输入
在内部接入上拉电阻:那可以知道,外部信号下拉时,CPU读到的电平是低电平
(c)下拉输入-》和上拉相反
(d)模拟输入
获取到接口的模拟信号,并通过ADC转化为数字量
(2)输出模式
a)输出推挽
可以输出高/低电平:两个mos管够可以工作
b)输出开漏
其中一个MOS管不工作,假设是p-mos不工作,要想输出高电平得接入函数能够接入上拉电阻,要不然只能输出0
(3)复用功能
每一个GPIO口都可以复用很多其他功能:I2C、UART串口
每一个GPIO口都有一个复位器,其中复位器将16路复用接入,AFRL->GPIO(0~7) AFRH-》GPIO(8~15)
三、配置GPIO口
(1)基本配置
·GPIOx_MODER(32位)
一共有4中模式所以2位代表一组,共16组
其中2y+1:2y
00输入
01输出
10复用
11模拟
所以比如配置PA3为输出模式:
GPIOA_MODER[]&=(1<<6)
volatile unsigned long *p = (volatile unsigned long *)0x40020000->PA
unsigned long value = *p
value &=(1<<6)
·输出模式
GPIOx_OTYPER共32位
其中只有两种模式所以1位就可以
y
0-》推挽输出
1-》开漏输出
·推拉寄存器
GPIOx_PUPDR
其中和MODER一样
其中2y+1:2y
00无上下啦
01上拉
10下拉
11保留
·速度寄存器
(2)数据寄存器
·输入数据寄存器
只读~偏移地址0x10
只有低16位可用
·ODR输出数据寄存器
那就是rw的
写博客可太累了。。。
·BSRR数据复位/置位
一定要注意奥~BSx和BRx都操作BSx优先~
reset-》1-》置0
set-》1-》置1
(3)上锁寄存器
就是封锁某个GPIO口
(4)复用
每个GPIO口16中功能,一个GPIO占4位;一组占4*16=64位即需要两个32位寄存器来搞~
GPIOx_AFLR(0~7) GPIOx_AFHR(8~15)
我要吐了~好了好了现在附上我的代码
众所周知让灯亮的得看原理图~
看到了吗?LED右边的端口为低电平时,灯会亮
那就找对应的GPIO端口~
那就结束了吖要配置的就是
LED0-LED0-PF9
LED1-LED1-PF10
LED2-FSMC D10-PE13
LED3-FSMC D11-PE14
(1)声明需要的寄存器
(2)首先端口使能
GPIOE GPIOF
这,keil要是复制粘贴下来注释就乱码了~就截图了奥