STM32-(05):GPIO原理与操作

发布者:Quail最新更新时间:2019-08-12 来源: eefocus关键字:STM3  GPIO  输出电路 手机看文章 扫描二维码
随时随地手机看文章

在这里插入图片描述

简单分析:红色框主要是输出电路(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


关键字:STM3  GPIO  输出电路 引用地址:STM32-(05):GPIO原理与操作

上一篇:STM32-(04):STM32F103VCT6芯片内部资源分析
下一篇:STM32-(06):位绑定的基础应用

推荐阅读最新更新时间:2024-11-13 11:20

ARM7单片机(学习ing)—(一)、输入/输出端口GPIO编程—01
一、输入/输出端口GPIO编程 一—(01)、一位数码管静态显示(通过74HC595实现) 1、管脚连接模块 首先介绍一下LPC2106的相关的管脚~~ 特性:可以实现独立的管脚配置 应用:管脚连接模块的用途是将管脚配置为需要的功能(这一章节主要就是介绍GPIO功能~~别的会在接下来的章节中分别予以介绍~~) 描述:管脚连接模块可以使所选管脚具有一个以上的功能。配置寄存器控制多路开关来连接管脚与片内外设。外设在激活和任何相关只读使能之前必须连接到适当的管脚。任何使能的外设功能如果没有映射到相应的管脚,则被认为是无效的。 寄存器的描述: 管脚连接模块包括两个寄存器: 管脚功能寄存器0:(PINSEL0) PINSEL0寄存器按
[单片机]
ARM7单片机(学习ing)—(一)、输入/<font color='red'>输出</font>端口<font color='red'>GPIO</font>编程—01
(一)s3c2440——GPIO(流水灯实验)
一、GPIO流水灯实验 1、实验目的   a:掌握GPIO的使用方法   b:熟悉Linux下编程的方法 2、实验内容   通过控制GPIO引脚来使LED显示 3、主要程序:   a:start.S文件是启动文件。第一个开始的程序。它实现的功能是关闭看门狗(不关闭会一直重启),并且设置堆栈(调用c函数之前必须设置堆栈)。   b:Makefile文件。它是进行编译链接生成可执行文件。   c:blink.c文件。实现主要功能,使led灯实现流水的效果 4、GPIO主要操作两个寄存器GPXCON和GPXDAT。前者设置引脚的模式(输出、输入、中断等),后者设置引脚的电平。   但是在操作过程中,出现了
[单片机]
(一)s3c2440——<font color='red'>GPIO</font>(流水灯实验)
图解大功率甲乙类输出工作方式的功放电源电路
在电路中NE5534的供电电源是通过两只集成稳压器78 18和79 18提供正负电源的o从电路中可知,正电源是通过7818提供正18v的电源,负 电源 是通过7918提供的。但在这里不是18V;而是18.7V,即在7918的接地端接人一只二极管1N4001。利用二极管导通压降为0.7V使负 电源 成为一18.7Vo这种采用不对称供电的方法其目的是使集成运放内部的输出级处于甲类工作状态,让输出管始终有电流流过,从而改善了运放的瞬态特性及准互补输出所具有的先天不足,如开关失真,交越失真等。由于NE5534的内电路的输出级是采用准互补形式的,因此采用不对称 电源 供电方法是必要的。此级的电压增益为40dB,最大输出电压为12V.v,k、
[电源管理]
图解大功率甲乙类<font color='red'>输出</font>工作方式的功放电源<font color='red'>电路</font>
第11章 GPIO输出-使用固件库点亮LED—零死角玩转STM32-F429系列
本章参考资料:《STM32F4xx参考手册》、库帮助文档《stm32f4xx_dsp_stdperiph_lib_um.chm》。 利用库建立好的工程模板,就可以方便地使用STM32标准库编写应用程序了,可以说从这一章我们才开始迈入STM32开发的大门。 LED灯的控制使用到GPIO外设的基本输出功能,本章中不再赘述GPIO外设的概念,如您忘记了,可重读前面 GPIO框图剖析 小节,STM32标准库中GPIO初始化结构体GPIO_TypeDef的定义与 定义引脚模式的枚举类型 小节中讲解的相同。 11.1 硬件设计 本实验板连接了一个RGB彩灯及一个普通LED灯,RGB彩灯实际上由三盏分别为红色、绿色、蓝色的LED灯组
[单片机]
第11章 <font color='red'>GPIO</font><font color='red'>输出</font>-使用固件库点亮LED—零死角玩转STM32-F429系列
Linux下s3c6410的GPIO操作(1)
1、arch/arm/plat-s3c64xx/gpiolib.c文件中有如下: arch_initcall(s3c64xx_gpiolib_init);这个应该实在系统初始化时调用。 static __init int s3c64xx_gpiolib_init(void) { s3c64xx_gpiolib_add(gpio_4bit, ARRAY_SIZE(gpio_4bit), s3c64xx_gpiolib_add_4bit); s3c64xx_gpiolib_add(gpio_4bit2, ARRAY_SIZE(gpio_4bit2), s3c64xx_gpiolib_add_4bit2);
[单片机]
Linux下s3c6410的<font color='red'>GPIO</font>操作(1)
KST-STM32 学习之GPIO_Speed
一、 GPIO模式配置 1、输入/输出模式(参考stm32手册) 2、GPIO输出模式下,几种速度的区别: (1). GPIO 引脚速度: GPIO_Speed_2MHz (10MHz, 50MHz) ; 又称输出驱动电路的响应速度:(芯片内部在I/O口的输出部分安排了多个响应速度不同的输出驱动电路,用户可以根据自己的需要选择合适的驱动电路,通过选择速度来选择不同的输出驱动模块,达到最佳的噪声控制和降低功耗的目的。 可理解为:输出驱动电路的带宽,即一个驱动电路可以不失真地通过信号的最大频率。 (如果一个信号的频率超过了驱动电路的响应速度,就有可能信号失真。) eg:如果信号频率为10MHz,而你配置了2M
[单片机]
STM8 通用输入输出口--GPIO
简介 通用输入/ 输出口用于芯片和外部进行数据传输。一个IO端口可以包括多达8 个引脚,每个引脚可以被独立编程作为数字输入或者数字输出口。另外部分口还可能会有如模拟输入,外部中断,片上外设的输入/ 输出等复用功能。但是在同一时刻仅有一个复用功能可以映射到引脚上。复用功能的映射是通过选项字节控制的。请参考数据手册关于选项字节的描述。 每个端口都分配有一个输出数据寄存器,一个输入引脚寄存器,一个数据方向寄存器,一个选择寄存器,和一个配置寄存器。一个I/O 口工作在输入还是输出是取决于该口的数据方向寄存器的状态。 GPIO主要功能 ● 端口的各个位可以被单独配置 ● 可选择的输入模式:浮动输入和带上拉输入 ● 可选择的输出模式
[单片机]
STM8 通用输入<font color='red'>输出</font>口--<font color='red'>GPIO</font>
ARM7 lpc2148之GPIO按键输入试验
简介:此实验中摁下某个按键后,把相关的信号并行传递到74HC165上,然后再通过串行方式传到处理器中,处理器在通过控制P0.22口(MAT0.0)来控制蜂鸣器。 此实验中摁下某个按键后,把相关的信号并行传递到74HC165上,然后再通过串行方式传到处理器中,处理器在通过控制P0.22口(MAT0.0)来控制蜂鸣器 #include NXP/iolpc2148.h //宏定义 #define SCLK 0x01 24 #define SCK0 0x01 4 #define MISO 0x01 5 #define MOSI 0x01 6 #define RCK 0x01 7 void HC595_Init(void);
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
更多往期活动

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved