历史上的今天
今天是:2025年08月12日(星期二)
2019年08月12日 | STM32-(05):GPIO原理与操作
2019-08-12 来源:eefocus

简单分析:红色框主要是输出电路(O),蓝色框主要是输入电路(I);关于输出电路,可以通过写位设置/清除寄存器来改变输出数据寄存器,或者直接读写输出数据寄存器,有这两种方式,继而通过I/O端口输出。如果打开了复用功能,就走复用的通道,输出控制就是一个锁存器。若寄存器写入1,输出控制的上方输出1,则CMOS管P-MOS导通,CMOS管N-MOS不导通,输出高电平,若寄存器写入0,输出低电平。关于输入电路,I/O进来有两个保护二极管,防止电压过高,再进入,有两个电阻,上拉和下拉,当不拉时为浮空输入,一般用于模拟输入,经过施密特触发器,如果用作GPIO口,将值写入寄存器,如果用作复用,走复用通道。
GPIO功能描述 端口配置表+输出模式位

开漏输出就是P-MOS上方不接
推挽输出就是两个CMOS都正常

如图所示,涉及到四个位来决定输入输出
端口配置低寄存器 CRL 端口配置高寄存器 CRH


0-7一个八组,控制8个GPIO, 8-15另外八组,控制另外8个GPIO,GPIOX的 x的取值范围为(A-E)
端口输入数据低寄存器 IDR 端口输出数据高寄存器 ODR


输入、输出数据寄存器都只用到1位(一个端口16个引脚),只需要16位,所以高16位保留
端口位设置/复位寄存器 BSRR 端口位复位寄存器 BRR 端口配置锁定寄存器 LCKR
![]() | ![]() | ![]() |
设置I/O口的引脚,输出电平。
int main(void)
{
// GPIOA->CRL = 0x00; //CRL 代表低八个引脚(0-7)
// GPIOA->CRH = 0xffffffff; //CRH 代表高八个引脚(8-15)
/*1.设置GPIOA组的引脚的工作模式;应该是输出模式,输出模式应该是通用GPIO(非复用),假设使用的是GPIOA.0、GPIOA.1
这两个引脚应该设置为推挽输出(查看端口位配置表<表11>:CNF1设为0、CNF0设为0)、速度50Mhz(查看端口位配置表<表11>:
MODE1、MODE0设为1),继续查看 端口配置低寄存器(GPIOx_CRL),一共32位(0-31),0-3控制GPIOA的第一个引脚,
4-7控制GPIOB的第二个引脚,0-3内是MODE0、MODE1、CNF0、CNF1,需要设置对应位已达到推挽输出与速度的要求。
*/
GPIOA->CRL = 0x33; //CRL是端口配置寄存器
//2.在相应的引脚输出一个电平
GPIOA->ODR = 0x0; //00 设置这两个引脚输出两个低电平
GPIOA->ODR = 0x3; //11 设置这两个引脚输出两个高电平
return(1);
}
通过改变GPIOA的第8位,使第0位状态跟着改变
int main(void)
{
// 1、PA.0输出、50Mhz PA.8输入(PA.0用到CRL, PA.8用到CRH)
GPIOA->CRL = 0x03; //PA.0输出、50Mhz
GPIOA->CRH = 0x04; //PA.8输入(选择浮空输入,因为模拟输入与复用输入不经过输入数据寄存器)
// 2、PA.0 == PA.8
while(1)
{
//第8位输入影响第0位输出
if((GPIOA->IDR & 0x0100) == 0x0100) //若成立,则第八位为1 (IDR 输入数据寄存器)
GPIOA->ODR = 0x01; //则相应第0位也置为1 (ODR 输入数据寄存器)
else
GPIOA->ODR = 0x00;
}
return(1);
}
GPIOA.8 ~ GPIOA.15 引脚输入状态影响GPIOA.0 ~ GPIOA.7 引脚输出状态
方案一
int main(void)
{
// 1、PA.0 ~ PA.7 输出、50Mhz PA.8 ~ PA.15 输入(PA.0用到CRL, PA.8用到CRH)
GPIOA->CRL = 0x33333333; //PA.0 ~ PA.7 输出、50Mhz
GPIOA->CRL = 0x44444444; //PA.8 ~ PA.15 输入(选择浮空输入,因为模拟输入与复用输入不经过输入数据寄存器)
// 2、PA.8 ~ PA.15 引脚输入状态影响PA.0 ~ PA.7 引脚输出状态
while(1)
{
//则第八位为1 (IDR 输入数据寄存器),则相应第0位也置为1 (BSRR为 端口位设置寄存器,BRR位复位寄存器)
if((GPIOA->IDR & 0x0100) == 0x0100) GPIOA->ODR = GPIOA->ODR | 0x01;
else GPIOA->ODR = GPIOA->ODR & (~0x01);
if((GPIOA->IDR & 0x0200) == 0x0200) GPIOA->ODR = GPIOA->ODR | 0x02;
else GPIOA->ODR = GPIOA->ODR & (~0x02);
if((GPIOA->IDR & 0x0400) == 0x0400) GPIOA->ODR = GPIOA->ODR | 0x04;
else GPIOA->ODR = GPIOA->ODR & (~0x04);
if((GPIOA->IDR & 0x0800) == 0x0800) GPIOA->ODR = GPIOA->ODR | 0x08;
else GPIOA->ODR = GPIOA->ODR & (~0x08);
if((GPIOA->IDR & 0x1000) == 0x1000) GPIOA->ODR = GPIOA->ODR | 0x10;
else GPIOA->ODR = GPIOA->ODR & (~0x10);
//………………以此类推
}
return(1);
}
方案二
int main(void)
{
// 1、PA.0 ~ PA.7 输出、50Mhz PA.8 ~ PA.15 输入(PA.0用到CRL, PA.8用到CRH)
GPIOA->CRL = 0x33333333; //PA.0 ~ PA.7 输出、50Mhz
GPIOA->CRL = 0x44444444; //PA.8 ~ PA.15 输入(选择浮空输入,因为模拟输入与复用输入不经过输入数据寄存器)
// 2、PA.8 ~ PA.15 引脚输入状态影响PA.0 ~ PA.7 引脚输出状态
while(1)
{
//则第八位为1 (IDR 输入数据寄存器),则相应第0位也置为1 (BSRR为 端口位设置寄存器,BRR位复位寄存器)
if((GPIOA->IDR & 0x0100) == 0x0100) GPIOA->BSRR = 0x01; //第0位置1;
else GPIOA->BRR = 0x01; //第0位清零
if((GPIOA->IDR & 0x0200) == 0x0200) GPIOA->BSRR = 0x02;
else GPIOA->BRR = 0x02;
if((GPIOA->IDR & 0x0400) == 0x0400) GPIOA->BSRR = 0x04;
else GPIOA->BRR = 0x04;
if((GPIOA->IDR & 0x0800) == 0x0800) GPIOA->BSRR = 0x08;
else GPIOA->BRR = 0x08;
//………………以此类推
}
return(1);
}
//若使程序简便,可使用#define GPIOA1 GPIOA->BSRR #define GPIOA0 GPIOA->BRR
史海拾趣
|
当用3.6V的锂电为AVR供电时,很多LCD就无法显示了.但LCD的耗电很小,完全可以用AVR的I/O脚驱动 如图,VDD可以输出5.63V的电压为LCD供电。负压也可以用类似的办法产生。 … 查看全部问答> |
|
IPerf在WinCE ARMV4I下运行提示缺少component或相关libraries 想要测Wi-Fi模块的带宽, 在网上Down了一个IPerf源代码,板子上用的是ARMV4I, 编译器选ARMV4I, Build后,把iperf.exe copy到板子上运行, 错误提示:\"Cannot find \'IPERF\' (or one of its components). Makesure the path and filename are corr ...… 查看全部问答> |
|
MSP430F5xxx 在高速公路不停车收费系统(ETC)中的应用 摘要 本文探讨了使用MSP430F5xxx实现ETC系统中实时HDLC编解码的方法。MSP430F5xxx是TI公司MSP430家族最新产品序列,采用先进的0.18工艺,1MIPS消耗的电流低到了惊人的160uA。同时,F5xx产品都配备了高效灵活的DMA模块,对16bit数据进行搬移只需 ...… 查看全部问答> |
|
以前确实抽不出时间搞这个。现在按照计划开始试用了。 由于测试条件不理想,图片嘛,这里就不贴了。 今天只测试了LMZ10501的部分特性,且是在输出1.8V下的。以后还要继续作其它测试。 一、空载电流 测试条件:输入5V, &n ...… 查看全部问答> |
|
RT.求各位大神一个5529的数字时钟程序,有急用啊!在此感激不尽啊!有好心的朋友请发到463355239@qq.com。感激不尽啊… 查看全部问答> |
|
型号如下: 3针双排PHOENIX母端 MCD 1,5/3-G1F-3,81 3针 PHOENIX公端 FMC 1,5/3-STF-3,81 2针 PHOENIX母端 MC 1,5/2-GF-3,81 !! 有购买链接的发下,或 ...… 查看全部问答> |







