您的位置 首页 资料

STM32开发板例程解说之二:GPIO的描绘和装备

上一讲创建了一个stm32工程,从本讲开始将深入stm32内核与外设讲解。首先介绍stm32的GPIO,这是入门的起点,也是最容易上手的部分。一、GPI

上一讲创建了一个stm32工程,从本讲开端将深化stm32内核与外设解说。

首要介绍stm32的GPIO,这是入门的起点,也是最简单上手的部分。

一、GPIO的归纳描绘

stm32每一个GPIO端口具有2个32bits的configuration寄存器(GPIOx_CRL,GPIOx_CRH),2个32bits的数据寄存器(GPIOx_IDR,GPIOx_ODR),1个32bits的set/reset寄存器(GPIOx_BSRR),1个16bits的reset寄存器(GPIOx_BRR)和1个32bits的Lock寄存器(GPIOx_LCKR)。

(一)每一个IO引脚都能够运用软件装备为以下几种形式:

1.浮空输入
2.带上拉输入
3.带下拉输入
4.模仿输入
5.开漏输出——(此形式可完结hotpower说的真双向IO)
6.推挽输出
7.复用功用的推挽输出
8.复用功用的开漏输出
形式7和形式8需依据具体的复用功用决议。

每一个IO引脚都能够独自编程,可是每一个IO寄存器只能32bits拜访(半字或许字节拜访都被制止)。

(二)专门的寄存器(GPIOx_BSRR和GPIOx_BRR)完结对GPIO口的原子操作,即回避了设置或铲除I/O端口时的“读-修正-写”操作,使得设置或铲除I/O端口的操作不会被中止处理打断而形成误动作。

(三)每个GPIO口都能够作为外部中止的输入,便于体系灵敏规划。

(四)I/O口的输出形式下,有3种输出速度可选(2MHz、10MHz和50MHz),这有利于噪声控制。

(五)一切I/O口兼容CMOS和TTL,大都I/O口兼容5V电平。

(六)大电流驱动才干:GPIO口在凹凸电平别离为0.4V和VDD-0.4V时,能够供给或吸收8mA电流;假设把输入输出电平别离放宽到1.3V和VDD-1.3V时,能够供给或吸收20mA电流。

(七)具有独立的唤醒I/O口。

(八)许多I/O口的复用功用能够从头映射。

(九)GPIO口的装备具有上锁功用,当装备好GPIO口后,能够经过程序锁住装备组合,直到下次芯片复位才干解锁。此功用十分有利于在程序跑飞的状况下维护体系中其他的设备,不会因为某些I/O口的装备被改动而损坏——如一个输进口变成输出口并输出电流。

二、GPIO的结构


三、GPIO的装备

(一)GPIO形式挑选和速度匹配

(1) 浮空输入_IN_FLOATING ——浮空输入,能够做KEY辨认,RX1。

(2)带上拉输入_IPU——IO内部上拉电阻输入。

(3)带下拉输入_IPD—— IO内部下拉电阻输入。

(4) 模仿输入_AIN ——运用ADC模仿输入,或许低功耗下省电。

(5)开漏输出_OUT_OD ——IO输出0接GND,IO输出1,悬空,需求外接上拉电阻,才干完结输出高电平。当输出为1时,IO口的状况由上拉电阻拉高电平,但因为是开漏输出形式,这样IO口也就能够由外部电路改动为低电平或不变。能够读IO输入电平改变,完结C51的IO双向功用。

(6)推挽输出_OUT_PP ——IO输出0-接GND, IO输出1 -接VCC,读输入值是不知道的。

(7)复用功用的推挽输出_AF_PP ——片表里设功用(I 2C的SCL,SDA)

(8)复用功用的开漏输出_AF_OD——片表里设功用(TX1,MOSI,MISO.SCK)

GPIO输出的速度匹配:

GPIO_Speed_10MHz 最高输出速率10MHz

GPIO_Speed_2MHz 最高输出速率2MHz

GPIO_Speed_50MHz 最高输出速率50MHz

I/O口的输出形式下,有3种输出速度可选(2MHz、10MHz和50MHz),这个速度是指I/O口驱动电路的响应速度而不是输出信号的速度,输出信号的速度与程序有关(芯片内部在I/O口的输出部分组织了多个不同响应速度的输出驱动电路,用户能够依据自己的需求挑选适宜的驱动电路)。经过挑选速度来挑选不同的输出驱动模块,到达最佳的噪声控制和下降功耗的意图。高频的驱动电路,噪声也高,当不需求高的输出频率时,请选用低频驱动电路,这样十分有利于进步体系的EMI功用。当然假设要输出较高频率的信号,但却选用了较低频率的驱动模块,很可能会得到失真的输出信号。

有一点是要害,即GPIO的引脚速度跟运用匹配(引荐10倍以上)。比方:
1)关于串口,假设最大波特率只需115.2k,那么用2M的GPIO的引脚速度就够了,既省电也噪声小。
2)关于I2C接口,假设运用400k波特率,若想把余量留大些,那么用2M的GPIO的引脚速度或许不行,这时能够选用10M的GPIO引脚速度。
3)关于SPI接口,假设运用18M或9M波特率,用10M的GPIO的引脚速度明显不行了,需求选用50M的GPIO的引脚速度。

(二)在STM32中怎么装备片表里设运用的IO端口

①装备输入的时钟;②初始化后即被激活(敞开);③假设运用该外设的输入输出管脚,则需求装备相应的GPIO端口(不然该外设对应的输入输出管脚能够做一般GPIO管脚运用);④再对外设进行具体装备。

对应到外设的输入输出功用有下述三种状况:
①外设对应的管脚为输出:需求依据外围电路的装备挑选对应的管脚为复用功用的推挽输出或复用功用的开漏输出。
②外设对应的管脚为输入:则依据外围电路的装备能够挑选浮空输入、带上拉输入或带下拉输入。
③ADC对应的管脚:装备管脚为模仿输入。

假设把端口装备成复用输出功用,则引脚和输出寄存器断开,并和片上外设的输出信号衔接。将管脚装备成复用输出功用后,假设外设没有被激活,那么它的输出将不确认。

(三)通用IO端口(GPIO)初始化:

1、RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|B|C,ENABLE):使能APB2总线外设时钟;
2、RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA|B|C,DISABLE):开释GPIO复位;

3、装备各个PIN端口(模仿输入_AIN、输入浮空_IN_FLOATING、输入上拉_IPU、输入下拉_IPD、开漏输出_OUT_OD、推挽式输出_OUT_PP、推挽式复用输出_AF_PP、开漏复用输出_AF_OD)和匹配速度。
4、GPIO初始化完结

四、GPIO实例

#include “stm32f10x.h”

#include “stm32_eval.h”

GPIO_InitTypeDef GPIO_InitStructure;

void RCC_Configuration(void);

void Delay(__IO uint32_t nCount);

int main(void)

{

RCC_Configuration();

#if 0

// 装备一切未运用GPIO引脚为输入形式(浮空输入),这样能够下降功耗,而且进步器材的抗EMI/EMC 的功用

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |

RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD |

RCC_APB2Periph_GPIOE, ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;

GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIO_Init(GPIOB, &GPIO_InitStructure);

GPIO_Init(GPIOC, &GPIO_InitStructure);

//armfly :注释掉的原因是当代码在外部存储器运行时,GPIOD,E,F,G部分IO用于FSMC,因而对这些IO不能重置,不然导致取指反常

// GPIO_Init(GPIOD, &GPIO_InitStructure);

// GPIO_Init(GPIOE, &GPIO_InitStructure);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |

RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD |

RCC_APB2Periph_GPIOE, DISABLE);

#ifdef USE_STM3210E_EVAL

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF | RCC_APB2Periph_GPIOG, ENABLE);

// armfly :因为代码在外部SRAM运行时,GPIOD,E,F,G部分IO用于FSMC,

因而对这些IO不能重置,不然导致取指反常

//GPIO_Init(GPIOF, &GPIO_InitStructure);

//GPIO_Init(GPIOG, &GPIO_InitStructure);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF | RCC_APB2Periph_GPIOG, DISABLE);

#endif

#endif

// 初始化STM3210X-EVAL板上的4个LED,即初始化LED对应的IO引脚

STM_EVAL_LEDInit(LED1);

STM_EVAL_LEDInit(LED2);

STM_EVAL_LEDInit(LED3);

STM_EVAL_LEDInit(LED4);

while (1)

{

STM_EVAL_LEDOn(LED1);

// 原始值 = 0xAFFFF,可是当代码在外部RAM运行时,功率很低,会推迟10秒以上,而到代码在内部RAM或内部Flash执行时,速度很快,小于100ms

Delay(0xAFFFF);

// Turn on LD2 and LD3

STM_EVAL_LEDOn(LED2);

STM_EVAL_LEDOn(LED3);

// Turn off LD1

STM_EVAL_LEDOff(LED1);

// Insert delay

Delay(0xAFFFF);

// Turn on LD4

STM_EVAL_LEDOn(LED4);

//Turn off LD2 and LD3

STM_EVAL_LEDOff(LED2);

STM_EVAL_LEDOff(LED3);

//Insert delay

Delay(0xAFFFF);

//Turn off LD4

STM_EVAL_LEDOff(LED4);

}

}

void RCC_Configuration(void)

{

// 树立MCU体系,初始化嵌入式FLASH接口,初始化锁相环(附注1)和体系频率参数

SystemInit();

}

void Delay(__IO uint32_t nCount)

{

for(; nCount != 0; nCount–);

}

#ifdefUSE_FULL_ASSERT

// @briefReports the name of the source file and the source line number

//where the assert_param error has occurred.

//@paramfile: pointer to the source file name

// @paramline: assert_param error line source number

// @retval None

void assert_failed(uint8_t* file, uint32_t line)

{

// User can add his own implementation to report the file name and line number,

ex: printf(“Wrong parameters value: file %s on line %d”, file, line)

//Infinite loop

while (1)

{

}

}

#endif

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

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

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

微信扫一扫关注我们

返回顶部