Board logo

标题: STM32f10xxx 之 GPIO口配置 [打印本页]

作者: yuchengze    时间: 2017-6-20 22:07     标题: STM32f10xxx 之 GPIO口配置

背景配置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口配置为数字输入时,输出功能被禁能了。

接着说数字输出,其也有两种状态:开漏输出/推挽输出,IO口配置为输出时,port口工作原理图如下:

第二功能输出状态:什么是第二功能,即有些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"。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0