您的位置 首页 培训

STM32的GPIO设置

最近刚开始学习STM32,所以从最基本的GPIO开始学起;首先看看STM32的datasheet上对GPIO口的简单介绍:每个GPI/O端口有两个32位配置寄存…

最近刚开端学习STM32,所以从最根本的GPIO开端学起;首要看看STM32的datasheet上对GPIO口的简略介绍:

每个GPI/O 端口有两个32 位装备寄存器(GPIOx_CRL,GPIOx_CRH),两个32位数据寄存器(GPIOx_IDR,GPIOx_ODR),一个32 方位位/复位寄存器(GPIOx_BSRR),一个16 位复位寄存器(GPIOx_BRR)和一个32 位确定寄存器(GPIOx_LCKR)。

GPIO 端口的每个位能够由软件别离装备成多种形式。每个I/O 端口位能够自在编程,但是I/0 端口寄存器有必要按32 位字被拜访(不答应半字或字节拜访)。GPIOx_BSRR 和GPIOx_BRR 寄存器答应对任何GPIO 寄存器的读/更改的独立拜访;这样,在读和更改拜访之间发生IRQ 时不会发生风险。

端口位装备 CNFx[1:0]=xxb,MODEx[1:0]=xxb

再看GPIO功用很强壮:

1.通用I/O(GPIO):最最根本的功用,能够驱动LED、能够发生PWM、能够驱动蜂鸣器等等;

2.独自的位设置或位铲除:便利软体作业,程序简略。端口装备好今后只需GPIO_SetBits(GPIOx, GPIO_Pin_x)就能够完结对GPIOx的pinx位为高电平;

3.外部中止/唤醒线:端口有必要装备成输入形式时,一切端口都有外部中止才能;

4.复用功用(AF):复用功用的端口兼有IO功用等。复位期间和刚复位后,复用功用未敞开,I/O 端口被装备成浮空输入形式:(CNFx[1:0]=01b,MODEx[1:0]=00b)。

5.软件从头映射I/O复用功用:为了使不同器材封装的外设I/O 功用的数量到达最优,能够把一些复用功用从头映射到其他一些脚上。这能够经过软件装备相应的寄存器来完结。这时,复用功用就不再映射到它们的原始引脚上了;

6.GPIO确定机制:首要针对复位设定的,当某端口位lock后,复位后将不改动的此端口的位装备。

GPIO根本设置

GPIOMode_TypeDef GPIO mode界说及偏移地址

GPIO_Mode_AIN = 0x0, //模仿输入

GPIO_Mode_IN_FLOATING = 0x04, //悬空输入

GPIO_Mode_IPD = 0x28, //下拉输入

GPIO_Mode_IPU = 0x48, //上拉输入

GPIO_Mode_Out_OD = 0x14, //开漏输出

GPIO_Mode_Out_PP = 0x10, //推挽输出

GPIO_Mode_AF_OD = 0x1C, //开漏复用

GPIO_Mode_AF_PP = 0x18 //推挽复用

GPIO输入输出速度挑选:

typedef enum

{

GPIO_Speed_10MHz = 1,

GPIO_Speed_2MHz,

GPIO_Speed_50MHz

}

GPIOSpeed_TypeDef;

#define IS_GPIO_SPEED(SPEED) ((SPEED == GPIO_Speed_10MHz) || (SPEED == GPIO_Speed_2MHz) || (SPEED == GPIO_Speed_50MHz))

做一个GPIO输出的实验

当I/O 端口被装备为推挽形式输出时:输出寄存器上的0 激活N-MOS,而输出寄存器上的1 将激活P-MOS。

用这段程序完结:GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

int main(void)

{

#ifdef DEBUG

debug();

#endif

/* 设置体系时钟 */

RCC_Configuration();

/* 嵌套中止设置*/

NVIC_Configuration();

/* 激活GPIOC clock */

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

/* Configure PC.04, PC.05, PC.06 and PC.07 as Output push-pull */

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_Init(GPIOC, &GPIO_InitStructure);

while (1)

{

/*本实验仅能完结LED1亮、熄功用*/

GPIO_SetBits(GPIOC, GPIO_Pin_4); //设置PC.04 pin为高电平,点亮LED1

Delay();

GPIO_ResetBits(GPIOC, GPIO_Pin_4); //设置PC.04 pin为低电平,平息LED1

Delay();

}

}

做一个GPIO输入的实验:以EK-STM32F中LCDdemo做比如

这个实验中把GPIO的PD.04做为按键输入,当下降沿来暂时触发。

LCDdemo中的例程如下:首要装备按键PD.03, PD.04为按键输入接口。

void Button_Config(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

/* Enable GPIOD clock */

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);

/* Configure PD.03, PD.04 as output push-pull */

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 ;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOD, &GPIO_InitStructure);

}

下面为按键作用是发动外部中止

GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource3);

EXTI_InitStructure.EXTI_Line = EXTI_Line3; //设定外部中止3

EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //设定中止形式

EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //设定下降沿触发形式

EXTI_InitStructure.EXTI_LineCmd = ENABLE;

EXTI_Init(&EXTI_InitStructure);

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/peixun/252500.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部