赞
踩
一、GPIO的八种模式分析(熟悉)
GPIO_Mode_IN_FLOATING 浮空输入
GPIO_Mode_IPU 上拉输入
GPIO_Mode_IPD 下拉输入
GPIO_Mode_AIN 模拟输入
GPIO_Mode_Out_OD 开漏输出
GPIO_Mode_Out_PP 推挽输出
GPIO_Mode_AF_OD 复用开漏输出
GPIO_Mode_AF_PP 复用推挽输出
应用总结
1、上拉输入、下拉输入可以用来检测外部信号;例如,按键等;
2、浮空输入模式,由于输入阻抗较大,一般把这种模式用于标准通信协议的 I2C、
USART 的接收端;
3、普通推挽输出模式一般应用在输出电平为 0 和 3.3V 的场合。而普通开漏输出模
式一般应用在电平不匹配的场合,如需要输出 5V 的高电平,就需要在外部一个上拉电
阻,电源为 5V,把 GPIO 设置为开漏模式,当输出高阻态时,由上拉电阻和电源向外输
出 5V 电平。
4、对于相应的复用模式(复用输出来源片上外设),则是根据 GPIO 的复用功能来
选择,如 GPIO 的引脚用作串口的输出(USART/SPI/CAN),则使用复用推挽输出模式。
如果用在 I2C、SMBUS 这些需要线与功能的复用场合,就使用复用开漏模式。
5、在使用任何一种开漏模式时,都需要接上拉电阻。
二、通用外设驱动模型(四步法)(掌握)
三、GPIO配置步骤(掌握)
__HAL_RCC_GPIOx_CLK_ENABLE() \\开启GPIO时钟
HAL_GPIO_Init() \\初始化GPIO
HAL_GPIO_WritePin() \\控制IO输出高/低电平
HAL_GPIO_TogglePin() \\每次调用IO输出电平翻转一次
HAL_GPIO_ReadPin() \\读取IO电平
四、demo程序——点亮一颗LED灯
led.c
#include "./BSP/LED/led.h" /** * @brief 初始化LED相关IO口, 并使能时钟 * @param 无 * @retval 无 */ void led_init(void) { GPIO_InitTypeDef gpio_init_struct; LED0_GPIO_CLK_ENABLE(); /* LED0时钟使能 */ gpio_init_struct.Pin = LED0_GPIO_PIN; /* LED0引脚 */ gpio_init_struct.Mode = GPIO_MODE_OUTPUT_PP; /* 推挽输出 */ gpio_init_struct.Pull = GPIO_PULLUP; /* 上拉 */ gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* 高速 */ HAL_GPIO_Init(LED0_GPIO_PORT, &gpio_init_struct); /* 初始化LED0引脚 */ LED0(1); /* 关闭 LED0 */ }
led.h
#ifndef _LED_H #define _LED_H #include "./SYSTEM/sys/sys.h" /******************************************************************************************/ /* 引脚 定义 */ #define LED0_GPIO_PORT GPIOB #define LED0_GPIO_PIN GPIO_PIN_5 #define LED0_GPIO_CLK_ENABLE() do{ __HAL_RCC_GPIOB_CLK_ENABLE(); }while(0) /* PB口时钟使能 */ /******************************************************************************************/ /* LED端口定义 */ #define LED0(x) do{ x ? \ HAL_GPIO_WritePin(LED0_GPIO_PORT, LED0_GPIO_PIN, GPIO_PIN_SET) : \ HAL_GPIO_WritePin(LED0_GPIO_PORT, LED0_GPIO_PIN, GPIO_PIN_RESET); \ }while(0) /* LED0翻转 */ /* LED取反定义 */ #define LED0_TOGGLE() do{ HAL_GPIO_TogglePin(LED0_GPIO_PORT, LED0_GPIO_PIN); }while(0) /* 翻转LED0 */ /******************************************************************************************/ /* 外部接口函数*/ void led_init(void); /* 初始化 */ #endif
main.c
#include "./SYSTEM/sys/sys.h" #include "./SYSTEM/delay/delay.h" #include "./BSP/LED/led.h" int main(void) { HAL_Init(); /* 初始化HAL库 */ sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟,72M */ delay_init(72); /* 初始化延时函数 */ led_init(); /* 初始化LED */ while (1) { LED0(1); } }
实验现象
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。