您的位置 首页 被动

STM32f10xxx 之 GPIO口装备

配置stm32f103使其完成PWM输出的过程中,在配置GPIO口的时候,按照习惯配置GPIO口的speed为50MHZ,突然就意识到,为什么大部分例程习惯配置为50MHZ,而

布景

装备stm32f103使其完结PWM输出的过程中,在装备GPIO口的时分,依照习气装备GPIO口的speed为50MHZ,忽然就意识到,为什么大部分例程习气装备为50MHZ,而不是其它值,即有了此文章。

正文

先说说GPIO口speed的问题,这个一般是用来界说GPIO口上升沿或许下降沿的时刻,频率越高,上升沿下降沿时刻越短,可是其噪音也就越大,因而,假如没有特别的需求,该值应该不要装备太高。在技能手册里,其给了3个速度挑选,库函数的相应表现方法如下:

/**

* @brief Output Maximum frequency selection

*/typedef enum{

GPIO_Speed_10MHz = 1,

GPIO_Speed_2MHz,

GPIO_Speed_50MHz

}GPIOSpeed_TypeDef;

50MHZ,意味着GPIO口理论上1s能够翻转50兆次,即1奇妙翻转50次,PWM应该不需求如此高的频率,所以,本次PWM的GPIO口速度装备为10MHZ。

再来说说GPIO口其他装备,库函数GPIO口装备的函数为:

/**

* @brief Initializes the GPIOx peripheral according to the specified

* parameters in the GPIO_InitStruct.

* @param GPIOx: where x can be (A..G) to select the GPIO peripheral.

* @param GPIO_InitStruct: pointer to a GPIO_InitTypeDef structure that

* contains the configuration information for the specified GPIO peripheral.

* @retval None

*/void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct){ // … 详细内容省掉}

首要传入的第一个参数,勿用多说,便是装备哪一组GPIO口。

详细说说第二个参数,其主要方法表现为:

typedef struct{ uint16_t GPIO_Pin;

GPIOSpeed_TypeDef GPIO_Speed;

GPIOMode_TypeDef GPIO_Mode;

}GPIO_InitTypeDef;

GPIO_Pin很好了解,装备该组IO口的详细哪一个GPIO,该值可用或的方法,例如:

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;

该装备代表装备该GPIO口的pin0/1/2/3脚。

GPIO_Speed前文已述。

GPIO_Mode则是代表该GPIO口作业在哪种作业形式下,装备的值如下:

/**

* @brief Configuration Mode enumeration

*/typedef enum{ 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 // 第二功用推挽输出}GPIOMode_TypeDef;

首要说说数字输入,其有三种状况:输入浮空/输入下拉/输入上拉,IO口装备为输入时,port口作业原理图如下:

如上图所示,当GPIO口装备为数字输入时,输出功用被禁能了。

“输入上拉”:GPIO口透过内部的上拉电阻连接到VDD,此刻,GPIO口的状况为高电平,当GPIO口连接到button时,button另一端接地。button闭合时,GPIO口被拉至低电平,CPU即可判别button按下。在实际运用的状况来看,内部弱上拉,信号总是没有外部上拉来的安稳,特别在上电即需求检测IO状况的状况,而且基本上内部弱上拉只合适检测button这种不严厉的电平状况,所以假如有条件外接上拉电阻的话,仍是不要装备为弱上拉。

“输入下拉”:很好解说了,GPIO口透过下拉电阻直接接地,此刻GPIO口状况为低电平,若用来检测button,button的另一端不再接地,而是接到VCC,此处得十分注意灌电流,避免烧坏MCU。

“输入浮空”:则是即不装备为输入上拉,也不装备为输入下拉。即IO口处于电平不安稳状况,若是GPIO口搁置未运用,引荐将其装备为输入上拉或许输入下拉,避免搅扰正常程序的进行。输入浮空状况一般合作外接上拉或许外接下拉运用。

接着说数字输出,其也有两种状况:开漏输出/推挽输出,IO口装备为输出时,port口作业原理图如下:

“开漏输出”:P-MOS管是被制止的,当向OUTPut寄存器写入“0”的时分,N-MOS管直接导通,将IO口接地,当写入“1”的时分,IO口处于高阻态状况。这种状况一般用于外部自带驱动的状况。

“推挽输出”:当向OUTPut寄存器写入“0”时,N-MOS管直接导通,将IO口接地,当写入“1”时,P-MOS管,导通,GPIO口直接接入VDD,此刻向外输出高电平,但驱动才能一般都很弱,还得考虑灌电流的巨细,若是需求驱动大功率器材,外部一般还会添加外放驱动电路。

第二功用输出状况:什么是第二功用,即有些IO口存在复用的状况,复用的功用即被称作第二功用,输出装备如上所示,当IO口被装备为输出时,其输入被默许装备为输入浮空状况,以I2C为例,I2C从机,不仅仅要检测SDA的状况收取数据,还要能够输出状况发送数据,所以第二功用基本上装备为输出,使其即可输入检测,也可输出,输出方法怎么装备视详细状况而言,勿用多言。

最终,模仿输入,其port口作业原理图如下:

被装备为模仿输入后,输入检测的施密特触发器和输出部分悉数封闭了。输入的值直接接入对应的模仿检测外设,比如ADC。

说了这么多,接下来以装备TIM2输出PWM的GPIO口装备为例:

TIM2_CH1在“PA0”口,首要使能GPIO A的时钟,

RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE );

接着装备IO为复用推挽输出,输出速率挑选10MHZ,

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 ; // PA0:A口的第0个引脚GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; // 翻转频率10MHzGPIO_Init(GPIOA, GPIO_InitStructure);

GPIO如此装备,然后装备定时器(不再胪陈),最终在PA0即可输出PWM波形了。

至此,记载结束。

参阅链接

Electrical ENGINEERING 论坛的一篇文章 STM32 Understanding GPIO Settings。

  • STM32单片机中文官网
  • STM32单片机官方开发工具
  • STM32单片机参阅规划

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

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

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

微信扫一扫关注我们

返回顶部