STM32F103的GPIO输出

本文详细介绍了通用输入输出口的8种模式,GPIO的寄存器功能、驱动放大、保护电路设计,以及不同输入和输出状态(如浮空、弱上拉、肖特基触发器、ADC采集、模拟输入、推挽/开漏/关闭输出)。同时,讲解了输出寄存器和位设置/清除寄存器在开发中的便利性。
摘要由CSDN通过智能技术生成

一、通用输入输出口

可配置为8种输入输出模式。
引脚电平:0V~3.3V,部分引脚可容忍5V输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器模拟通信协议输出时序等。
输入模式下可读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入、ADC电压采集、模拟通信协议接收数据。

二、GPIO的结构

①寄存器的作用是将单片机内部的数据从APB2中读出或是将内部的数据保存到寄存器中在发送出去。

②当要进行点灯这类的操作时,需要通过驱动器将电流放大,从而增大驱动能力。

③这里的寄存器均为32位,但是为什么GPIOA只有16个IO口,这是因为寄存器中一般只有低16位有效。

④这里红框起的部分作用是起到保护电路,VDD为3.3v,vss为负电压或0v,当有高电压进入时电流会流入①号通路,当有负电压进入时,电流会从②号通路流出,从而达到保护电路的作用。

⑤正常情况下的输入一般有三种:浮空,弱上拉和弱下拉。通常①、②号的开关都未闭合此时为浮空输入的状态,①号闭合、②号断开为弱上拉,反之则为弱下拉的状态。

⑥肖特基触发器的作用是相当于滤波,当电压高于特定阈值时,使其输出为高电平,电压低于特定阈值时为低电平。

⑦此外还有模拟输入,一般用于ADC的采集通道。复用功能的输入则用于某些外设的功能。

⑧输出的情况有推挽、开漏、关闭三种。推挽输出则是P-Mos和N-Mos均有效,当从输出数据寄存器数据是0时则N-Mos输出低电平,反之输出1时为高电平,开漏的情况则是高电平会进入高阻态的情况,意味着P-Mos处于无效的状态。这时只能输出低电平,一般用于某些通信协议。关闭的情况先不管。

⑨最后讲一下输出寄存器和位设置\清除寄存器的作用,输出数据寄存器一共16位,如果想对某位进行清楚或者设置必须对整体进行操作,这就类似于51单片机的P0=0XFF,但位设置\清楚寄存器的作用则可以帮助输出数据寄存器实现某位的改写,类似于P1_0=1;这带来的极大的便利,我们库函数开发就是基于第二种进行的。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
下面是一个基本的STM32F103 GPIO输出程序,使用HAL库实现。在这个例子中,我们将PA5引脚配置为输出,并在其中断循环中交替设置和清除该引脚,以实现闪烁的效果。 ```c #include "stm32f1xx_hal.h" void SystemClock_Config(void); static void MX_GPIO_Init(void); int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); while (1) { HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); HAL_Delay(500); } } void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; __HAL_RCC_PWR_CLK_ENABLE(); __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI_DIV2; RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL16; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) { Error_Handler(); } } void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_5; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); } ``` 在这个例子中,我们首先初始化了HAL库,并在 `main` 函数中调用了 `SystemClock_Config` 和 `MX_GPIO_Init` 函数来配置系统时钟和GPIO引脚。然后我们进入一个无限循环,在其中断循环中交替设置和清除GPIOA5引脚,以实现闪烁的效果。 需要注意的是,我们使用了 `HAL_Delay` 函数来在每次交替GPIO引脚状态之间添加500ms的延迟,以便我们能够看到LED的闪烁效果。如果您想要更快或更慢的闪烁速度,您可以调整这个延迟时间。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值