源码下载链接:https://taileliekaishi.lanzoui.com/iYuCjgc6guf
注意:点击图片可放大查看
一、GPIO口的工作模式:
推挽输出与开漏输出都是通过寄存器来控制
推挽输出:上管和下管都可以导通,既可以输出高电平也可以输出低电平(能输出20mA电流也能输出0mA电流),如下图所示
应用:控制LED灯的亮灭,如下图所示
开漏输出:上管静止不导通,不能输出高电平,想输出高电平需要外接一个上拉电阻,如下图所示
应用:WI-FI,内部有了上拉电阻,控制WI-FI的使能和复位引脚我们只需要有一个信号(高低电平)来控制就行,故输出方式为开漏输出即可,如下图所示
总结:开漏输出和推挽输出的区别
开漏输出:作为信号输出,例如控制WIFI的使能和复位引脚,我们不需要驱动它,只需要给一个高低电平的信号即可。
推挽输出:作为驱动输出,驱动外设,例如:驱动灯和数码管等,需要注意的是最大只能输出20mA电流,当需要驱动电流需求大的外设的时候(例如:蜂鸣器、MOS管等),需要接一个三极管来提高驱动能力。
复用功能:通过片上外设来控制,例如:CAN,串口、SPI 等,通过这些口来控制推挽和开漏
输入:作为输入的时候下面的输出部分是断开的
浮空输入、上拉输入、下拉输入:可作为GPIO口的一个中断或者是按键、具体选择哪种方式需要看外围电路需不需要启用内部的上下拉,不需要启用内部的上下拉就选用浮空输入,如果需要内部上拉就选上拉,需要内部下拉选下拉。
模拟输入:AD采集。
二、流水灯编程
// 主函数 int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); /* USER CODE BEGIN 2 */ MyInit.Peripheral_Set(); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ System.Run(); /* USER CODE END 3 */ } } // 流水灯实现函数 static void Run() { HAL_Delay(400); // 亮 HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin); HAL_GPIO_TogglePin(LED2_GPIO_Port,LED2_Pin); HAL_Delay(400); // 让LED1亮,LED2灭 HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_RESET); HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin,GPIO_PIN_SET); // 让LED2亮,LED1灭 HAL_Delay(400); HAL_GPIO_WritePin(LED2_GPIO_Port,LED1_Pin,GPIO_PIN_SET); HAL_GPIO_WritePin(LED1_GPIO_Port,LED2_Pin,GPIO_PIN_RESET); }