STM32f10xxx之GPIO口配置

发布时间:2023-01-04  

背景

配置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波形了。


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>