基于HAL库的GPIO配置
背景
在STM32中,最常用到的功能莫过于GPIO(General Purpose Input Output 、通用输入/输出)了,在STM32中,除了除去ADC以外的复用功能,剩下的几乎就是GPIO了。
初始化
初始化步骤
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| typedef struct { uint32_t Pin; /*指定的引脚号,右值表达式可以是GPIO_PIN_0到~GPIO_PIN_15任意相或 */ uint32_t Mode; /* 模式 GPIO_MODE_INPUT 输入模式 GPIO_MODE_OUTPUT_PP 推挽输出模式(输出较大电流) GPIO_MODE_OUTPUT_OD 开漏输出模式(一般外接上拉电阻) GPIO_MODE_AF_PP 复用推挽输出模式 GPIO_MODE_OUTPUT_OD 复用开漏输出模式 GPIO_MODE_ANALOG 复用模拟输入输出模式(ADC/DAC专用) */ uint32_t Pull; /* 上/下拉模式 上拉电阻是指当pin接到VCC(高电平)时所接的电阻即为Pull up 电阻, 反之亦然,pin接地时所接的电阻即pull down电阻 GPIO_NOPULL 无 GPIO_PULLUP 上拉 GPIO_PULLDOWN 下拉 */ uint32_t Speed; /* IO口速率(I/O口驱动电路的速度) 当STM32的GPIO端口设置为输出模式时,有三种速度可以选择:2MHz、10MHz和50MHz,用来选择不同的输出驱动模块,达到最佳的噪声控制和降低功耗的目的。 高频的驱动电路,噪声也高,当不需要高的输出频率时,请选用低频驱动电路,这样非常有利于提高系统的EMI性能。 STM32F429的端口输出速率为括号内容
GPIO_SPEED_LOW; (2) 2MHz注意: GPIO_SPEED_MEDIUM; (25) 12.5MHz ~ 50MHz GPIO_SPEED_FAST; (50) 25MHz ~ 100 MHz GPIO_SPEED_HIGH; (100) 50MHz ~ 200MHz
*/
uint32_t Alternate; /* 复用功能,本节省略不讲 */ }GPIO_InitTypeDef;
|
- 使能GPIOx对应的时钟(如果没有使能将会导致配置无效)
1
| __HAL_RCC_GPIOB_CLK_ENABLE(void); //开启GPIOB时钟
|
- 调用void HAL_GPIO_Init(GPIO_TypeDef GPIOx, GPIO_InitTypeDef GPIO_Init) 函数
例程
1 2 3 4 5 6 7 8 9 10 11 12 13
| void LED_Init(void) { // 初始化函数 GPIO_InitTypeDef GPIO_Initure; __HAL_RCC_GPIOB_CLK_ENABLE(); //开启GPIOB时钟 GPIO_Initure.Pin=GPIO_PIN_0|GPIO_PIN_1; //PB1,0 GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //推挽输出 GPIO_Initure.Pull=GPIO_PULLUP; //上拉 GPIO_Initure.Speed=GPIO_SPEED_HIGH; //高速
HAL_GPIO_Init(GPIOB,&GPIO_Initure); }
|
I/O读写
读
1 2
| GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); Pxin(GPIO_Pin); // x 可以是ABCD等端口
|
写
1 2 3
| void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState); Pxout(GPIO_Pin); // x 可以是ABCD等端口 void HAL_GPIO_TogglePin (GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin);
|
例程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| #include "stm32f4xx.h" #define LED0 PAout(0) int main(void) { HAL_Init(); //初始化 Stm32_Clock_Init(360,8,2,8); //设置时钟,180Mhz delay_init(180); //初始化延时函数 LED_Init(); //初始化LED while(1) { LED0=0; //LED0亮 delay_ms(500); LED0=1; //LED0灭 delay_ms(500); } }
|
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 yxhlfx@163.com