源码下载链接:https://taileliekaishi.lanzoui.com/iYuCjgc6guf
注意:点击图片可放大查看
一、GPIO口的工作模式:
推挽输出与开漏输出都是通过寄存器来控制
推挽输出:上管和下管都导通,既可以输出高电平也可以输出低电平(能输出20mA电流也能输出20mA电流),如下图所示
应用:控制LED灯的亮灭,如下图所示
开漏输出:上管静止不导通,不能输出高电平,想输出高电平需要外接一个上拉电阻,如下图所示
应用:WIFI,内部有了上拉电阻,控制WIFI的使能和复位引脚我们只需要有一个信号(高低电平)来控制就行,如下图所示
总结:开漏输出和推挽输出的区别
开漏输出:作为信号输出,例如控制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);
}