gpio的编程
A. GPIO引脚初始化编程 STM32F103芯片串行口1的数据收、发引脚分别为PA10、PA9,
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
B. stm32f103VE的每个GPIO可以作为外部中断源,简要说出外部中断编程步骤
摘要 STM32F103的中断控制器支持19个外部中断/事件请求。每个中断设有状态位,每个中断/事件都有独立的触发和屏蔽设置。STM32F103的19个外部中断为:
C. STM8当中的GPIO各模式如何用
TM8的通用输入/输出口用于芯片和外部进行数据传输。一个IO端口可以包括多达8个引脚,每个引脚可以被独立编程作为数字输入或者数字输出口。另外部分口还可能会有如模拟输入,外部中断,片上外设的输入/输出等复用功能。但是在同一时刻仅有一个复用功能可以映射到引脚上。
复用功能的映射是通过选项字节控制的。请参考数据手册关于选项字节的描述。
每个端口都分配有一个输出数据寄存器,一个输入引脚寄存器,一个数据方向寄存器,一个选择寄存器,和一个配置寄存器。一个I/O口工作在输入还是输出是取决于该口的数据方向寄存器的状态。
GPIO主要功能
可选择的输入模式:浮动输入和带上拉输入
可选择的输出模式:推挽式输出和开漏输出
数据输入和输出采用独立的寄存器
外部中断可以单独使能和关闭
输出摆率控制用以减少EMC噪声
片上外设的I/O功能复用
当作为模拟输入时可以关闭输入施密特触发器来降低功耗
在数据输出锁存时支持读-修改-写
输入兼容5V电压
I/O口工作电压范围为1.6 V到VDDIOmax
I/O的配置和使用
每一个端口都有一个输出数据寄存器(ODR),一个引脚输入寄存器(IDR)和一个数据方向寄存器(DDR)总是同相关的。
控制寄存器1(CR1)和控制寄存器2(CR2)用于对输入/输出进行配置。任何一个I/O引脚可以通过对DDR,ODR,CR1和CR2寄存器的相应位进行编程来配置。
寄存器中的位n对应于口的引脚n。各种不同配置总结如表18。
(表18:IO口配置表)
注意:连接VDD的二极管在实际开漏极状态引脚是无效的,在引脚和VOL之间的局部保护设备重要性是有效的。
没有使用的I/O引脚必须连接到一个固定的电平值。或者是上拉或者是下拉。
输入模式
将DDRx位清零就选择了输入模式。在该模式下读IDR寄存器的位将返回对应I/O引脚上的电平值。
如表18所示,理论上STM8可以通过软件配置得到四种不同的输入模式:悬浮不带中断输入,悬浮带中断输入,上拉不带中断输入和上拉带中断输入。但是在实际情况下不是所有的口都具有外部中断能力和上拉,用户应参考数据手册中关于每个引脚的实际硬件性能描述来了解更多细节。
输出模式
将DDRx位置1就选择了输出模式。在该模式下向ODR寄存器的位写入数据将会通过锁存器输出对应数字值到I/O口。读IDR的位将会返回相应的I/O引脚电平值。通过软件配置CR1,CR2寄存器可以得到不同的输出模式:上拉输出,开漏输出。
低功耗模式
表19低功耗模式对STM8S的GPIO口的影响
模式 描述
等待(Wait) 对I/O口无影响。外部中断可以使MCU退出等待(Wait)模式
停机(Halt) 对I/O口无影响。外部中断可以使MCU从停机(Halt)模式唤醒
注意:如果PA1/PA2被用来连接外部谐振器,为了确保在HALT模式下有最低功耗必须配置PA1和PA2为带上拉输入。
D. -GPIO 输入输出-按键显示实验程序怎么写 stm32 LED
1、写个按键检测函数,符合条件了
2、就进入流水灯的编程呗
3、比如简单点的直接就IO口通断这样控制(这里以GPIOA0到3为4个灯,高电平亮)
GPIO_SetBits(GPIOA,GPIO_Pin_0);
GPIO_ResetBits(GPIOA,GPIO_Pin_0);
delay(1000);
GPIO_SetBits(GPIOA,GPIO_Pin_1);
GPIO_ResetBits(GPIOA,GPIO_Pin_1);
delay(1000);
GPIO_SetBits(GPIOA,GPIO_Pin_2);
GPIO_ResetBits(GPIOA,GPIO_Pin_2);
delay(1000);
GPIO_SetBits(GPIOA,GPIO_Pin_3);
GPIO_ResetBits(GPIOA,GPIO_Pin_3);
delay(1000);
E. 1.按要求完成GPIO的输出编程GPC0~GPC7用循环语句实现8个发光二级管GPC0到GPC7逐个点亮
只要把GPIO1和GPIO0的地址偏移量获得就可以了。
伪代码:
delta_addr = addr(GPIOC1) - addr(GPIOC0);
for(i = 0; i < 8; i++) {
点亮(GPIOC0 + i* delat_addr);
}
F. gpio编程如何将程序
嘿嘿,那是当然了,STM32是32位单片机,51是8位机,两者不是一个数量级的。
51单片机的I/O口就是I/O口,没那么多功能,
而STM32呢,它的GPIO口既可以做数字I/O,有些也可以做A/D,D/A,有些可以做SPI或者I2C对外通讯,还有些是做PWM脉宽输出,功能各有不同。这些功能都需要实现配置好才能让单片机知道你打算怎么用这些口。51简单死了,没有A/D,D/A,没有SPI通讯,也没有PWM,就是I/O,每个口也只有那么一个寄存器,直接读写就完了。
而到了32位机就不一样了,那么多功能,那么多寄存器,如果不用库的话,就要一位一位地把每个寄存器都设好,非常麻烦。ST专门给STM32编制了一个函数库,所有的函数库设置你只需要调用函数库的函数就好。如果你英语还说得过去的话,看着函数库就可以基本不用去每一位对寄存器了,牺牲了效率,但是非常非常的方便。
至于使用起来,也非常简单,比如你要用GPIO,你就把STM32F10X_GPIO.C加到你的工程文件中去,然后在你在程序里引用一下#include "stm32f10x.h",就可以了。当然,我觉得这么做还要一个一个文件地想,到底需要不需要,干脆把所有的C文件都加到工程里去,然后在编译器里打开Level-2优化,这样没有用到的函数都不会被编译到最终的hex文件中去了。想用到什么函数都可以,非常方便的。
G. 什么是GPIO
嵌入式系统中常常有数量众多,但是结构却比较简单的外部设备/电路,对这些设备/电路有的需要CPU为之提供控制手段,有的则需要被CPU用作输入信号。而且,许多这样的设备/电路只要求一位,即只要有开/关两种状态就够了,比如灯亮与灭。对这些设备/电路的控制,使用传统的串行口或并行口都不合适。所以在微控制器芯片上一般都会提供一个“通用可编程IO接口”,即GPIO。接口至少有两个寄存器,即“通用IO控制寄存器”与“通用IO数据寄存器”。数据寄存器的各位都直接引到芯片外部,而对这种寄存器中每一位的作用,即每一位的信号流通方向,则可以通过控制寄存器中对应位独立的加以设置。这样,有无GPIO接口也就成为微控制器区别于微处理器的一个特征。在实际的MCU中,GPIO是有多种形式的。比如,有的数据寄存器可以按照位寻址,有些却不能按照位寻址,这在编程时就要区分了。比如传统的8051系列,就区分成可位寻址和不可位寻址两种寄存器。另外,为了使用的方便,很多mcu把glue logic等集成到芯片内部,增强了系统的稳定性能,比如GPIO接口除去两个标准寄存器必须具备外,还提供上拉寄存器,可以设置IO的输出模式是高阻,还是带上拉的电平输出,或者不带上拉的电平输出。这在电路设计中,外围电路就可以简化不少。另外需要注意的是,对于不同的计算机体系结构,设备可能是端口映射,也可能是内存映射的。如果系统结构支持独立的IO地址空间,并且是端口映射,就必须使用汇编语言完成实际对设备的控制,因为C语言并没有提供真正的“端口”的概念。如果是内存映射,那就方便的多了。GPIO优点GPIO的优点(端口扩展器)低功耗:GPIO具有更低的功率损耗(大约1μA,μC的工作电流则为100μA)。集成IIC从机接口:GPIO内置IIC从机接口,即使在待机模式下也能够全速工作。小封装:GPIO器件提供最小的封装尺寸 ― 3mm x 3mm QFN!低成本:您不用为没有使用的功能买单!快速上市:不需要编写额外的代码、文档,不需要任何维护工作!灵活的灯光控制:内置多路高分辨率的PWM输出。可预先确定响应时间:缩短或确定外部事件与中断之间的响应时间。更好的灯光效果:匹配的电流输出确保均匀的显示亮度。布线简单:仅需使用2条就可以组成IIC总线或3条组成SPI总线。与ARM 的几组GPIO引脚,功能相似,GPxCON 控制引脚功能,GPxDAT用于读写引脚数据。另外,GPxUP用于确定是否使用上拉电阻。
H. 嵌入式STM32编程中,读GPIO口的数据的代码
1,我怀疑这样写的用意在哪里。两个define 对于GPIOA的IDR寄存器是没有任何意义的,32位的寄存器每一位该是0的是0,是1 的是1 没有什么变化,寄存器。如果是获取寄存器的值是可以的。但是两个的作用没有什么不同,他们寄存器的值都不会发生改变,如果实在要说区别的话,就是运算的时间和写法的不同。
2,#define key1 (GPOIA -> IDR | 0xFFFFFFFF) //这是每一位都置位为1
#define key1 (GPIOA -> IDR | ( 1<X ) ) // x位置位为1
3, #define key1 (GPIOA -> IDR & 0X0) //每一位都清0
#define key1 (PPIOA -> IDR & (1<X)) // x位清0