本章介绍使用STM32CubeMX对GPIO进行配置的方法,并通过控制LED灯亮灭的实现来展示配置效果,在进行实验前介绍了GPIO的相关知识。
GPIOs (general-purpose inputs/outputs) 芯片通过GPIO引脚与外部设备连接用来实现信号采集或信号输出控制功能,即输入输出功能。STM32的GPIO它按组分配,每组 16 个(注意,如果芯片引脚有限,最后一组不一定满16个),组数视芯片而定,如stm32f103c6t6只有3组,且第三组PC只有PC13、PC14、PC15。除此之外,STM32的GPIO的部分 IO 口兼容 5V,哪些IO兼容5V可以通过查找datasheet确定,如下图:
GPIO 有八种工作模式,分别是:
输入模式有:
输出功能有:
输入浮空模式:数据通道中仅接入TTL触发器(作用是将相对缓慢变化的模拟信号变成矩形信号)整形,随后输出到输入数据寄存器,该种工作模式未接入任何上拉/下拉电阻, IO 口的电平完全是由外部电路决定。 模式特点:在该引脚悬空(无信号输入)的情况下,读取该端口的电平是不确定的。
适用场合:外部按键输入检测/USART RX引脚
上拉输入模式:与浮空输入模式相比,仅仅是在数据通道前端接入了一个上拉电阻。 特点是:在无信号输入时端口电位受上拉电阻钳制,I/O端口输入电平始终保持为高电平;而当端口输入电平为低电平时,I/O端口输入电平为低电平。
适用场合:配置中断输入(引脚触发中断条件为下降沿触发/低电平触发时),不可以做电流型驱动
下拉输入模式:与浮空输入模式相比,仅仅是在数据通道前端接入了一个下拉电阻。 模式特点:在无信号输入时端口电位受下拉电阻钳制,I/O端口输入电平始终保持为低电平;而当端口输入电平为高电平时,I/O端口输入电平为高电平。
适用场合:配置中断输入(引脚触发中断条件为上升沿触发/高电平触发时),不可以做电流型驱动
模拟输入模式:数据通道不接入任何处理单元(TTL触发器/钳制电阻),直接输入MCU内部的处理单元。 模式特点:相较于其他输入模式只能读取到逻辑高/低电平(数字量),该模式能读取到细微变化的值(模拟量)。
适用场合:该模式下需要用到芯片内部的模拟电路单元, 用于 ADC、 DAC、 MCO这类操作模拟信号的外设。ADC模拟输入/低功耗下省电。
4种输出模式
推挽输出:输出具有驱动能力,当CPU输出逻辑’0’时,I/O端口输出低电平,而当CPU输出逻辑’1’时,I/O端口输出高电平。推挽输出模式下输出高电平,有较强的的驱动能力,驱动电流最大可达25mA。
应用场景:驱动LED、数码管等电子元器件、输出控制某个信号。另外在推挽输出模式下,我们可以读取该 IO 口的电平状态。
开漏输出:适合做电流型的驱动,其吸收电流能力较强。当CPU输出逻辑’0’时,I/O端口输出低电平,而当CPU输出逻辑’1’时,该引脚处于开漏,也就是浮空状态(高阻态),如果想输出高电平则必须接入上拉电阻。同时IO口可以由外部电路改变为低电平或不变,即可读IO输入电平变化,实现了I/O端口的双向功能;
应用场景:I2C(I2C_SDA),SMBus,等总线判断总线占用状态。
复用推挽输出:在STM32中,一个引脚通常可作为普通GPIO来使用,但通常有多个复用模块对应着同一个引脚,那么当这个GPIO作为内置外设引脚时,就叫做复用模式。
适用场合:常见片内外设(USART TX引脚/SPI/PWM输出等等)
复用开漏输出:与开漏输出特性一致,只不过引脚选择了复用功能。
适用场合:常见片内外设(I2C/SMBus等等)
选择芯片stm32f103c6t6,新建工程
设置时钟源,最小系统外部晶振8Mhz,作为外部高速HSE时钟源。由于没有外接外部低速晶振,这里低速时钟源选择旁路时钟源。
配置时钟树,这里使用官方推荐的配置
配置引脚功能,因为我使用杜邦线链接LED和MCU,功能引脚输出电流,驱动LED灯点亮,我这里选择PA0作为GPIO_Output
功能引脚,GPIO mode选择推挽输出(回忆下前面我们介绍的几种模式),输出高电平,当然也可以去配置输出上拉或者下拉,以及输出速率等参数。
Code Generator中设置只拷贝使用到的库,分离.c和.h文件
设置好项目名称和路径,点击GENERATE CODE即可,生成后使用keil5 IDE打开。
实现一个LED等间隔1s闪烁一次的功能,代码如下
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 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_0); //PA0
HAL_Delay(1000);
}
/* USER CODE END 3 */
}
代码编译成功
在下载前检查keil是否检测到ST-LINK,选择魔法棒进行设置
如图所示,已经检测到ST-LINK 下载器
点击load,自动下载固件
烧录器ST-LINK V2和最小系统板的连接如图所示: 四线连接 SWDIO,GND,SWCLK,和3.3V电源
由于没有找到LED灯,所以使用示波器进行测量,从测试结果可以看到,输出了PA0脚输出了电压为3.3V,高低点评间隔1s的方波,如下图所示,以后找到LED灯再拍个视频补上吧。
其实使用示波器测量结果也有一个好处,就是更好判断验结果是否正确,延时和输出电平是否正确这些元素都可以很明显的看到。
本章通过电量LED灯的实验来介绍STM32CubeMX对GPIO进行配置的方法,最后由于没有找到led灯,只能使用示波器来测试实验结果,不过这个实验比较简单,很容易分析结果。