STM32实现流水灯

目录

一、GPIO简介

1.1简介

1.2STM32 的 GPIO 特点

1.3STM32 的 GPIO 电气特性

一、硬件电路

二、软件实现


上篇文章介绍了如何创建STM32的库函数版本的工程模板,本位我将介绍STM32GPIO的一些应用

一、GPIO简介


1.1简介


GPIO全称:General Purpose Input Output,即通用输入输出端口,一般用来采集外部器件的信息或者控制外部器件工作,即输入输出

1.2STM32 的 GPIO 特点


不同型号,IO口数量可能不一样,可通过选型手册快速查询
快速翻转,每次翻转最快只需要两个时钟周期(F1最高速度可以到50Mhz)
每个IO口都可以做中断
支持 8 种工作模式:

(1). 输入模式(Input mode)

输入模式是GPIO端口最基本的工作模式,用于接收外部信号并读取其电平状态。在输入模式下,GPIO端口通常具有三种状态:高电平、低电平和浮空状态。当外部信号为高电平时,GPIO端口会输出高电平;当外部信号为低电平时,GPIO端口会输出低电平;当外部信号未接入时,GPIO端口处于浮空状态。

输入模式广泛应用于各种传感器、开关等场合,例如读取温度传感器、检测按键状态等。

(2). 输出模式(Output mode)

输出模式是GPIO端口另一个基本的工作模式,用于控制外部设备的状态。在输出模式下,GPIO端口可以输出高电平或低电平信号,从而控制外部设备的开关状态。

输出模式广泛应用于各种控制场合,例如控制LED灯、继电器等。

(3). 复用功能模式(Alternate function mode)

STM32微控制器内部集成了多种外设模块,例如串口、SPI、I2C等。在复用功能模式下,GPIO端口可以通过设置复用功能模式,将其与这些外设模块进行连接,从而实现与外设模块的通信功能。

复用功能模式广泛应用于各种通信场合,例如串口通信、SPI通信等。

(4). 模拟模式(Analog mode)

模拟模式是GPIO端口的一种特殊工作模式,用于输入或输出模拟信号。在模拟模式下,GPIO端口可以通过DAC(数字模拟转换器)输出模拟信号,或通过ADC(模拟数字转换器)输入模拟信号。

模拟模式广泛应用于各种模拟信号处理场合,例如音频信号处理、传感器信号采集等。

(5). 推挽输出模式(Push-pull output mode)

推挽输出模式是GPIO端口的一种特殊输出模式,用于控制需要较大输出电流的设备。在推挽输出模式下,GPIO端口可以输出高电平或低电平信号,并通过内部电路将输出电流放大,从而控制外部设备的状态。

推挽输出模式广泛应用于各种高电流控制场合,例如驱动电机、继电器等。

(6). 开漏输出模式(Open-drain output mode)

开漏输出模式是GPIO端口的另一种特殊输出模式,也用于控制需要较大输出电流的设备。在开漏输出模式下,GPIO端口可以输出低电平信号,并通过内部电路将输出电流放大,从而控制外部设备的状态。但是,当输出高电平信号时,GPIO端口不会输出电流,而是处于高阻态。

开漏输出模式广泛应用于各种高电流控制场合,例如驱动LED灯、I2C通信等。

(7). 外部中断模式(External interrupt mode)

外部中断模式是GPIO端口的一种特殊输入模式,用于检测外部信号的边沿变化并触发中断。在外部中断模式下,GPIO端口可以配置为上升沿触发、下降沿触发或双边沿触发模式,并在信号变化时触发中断,从而进行相关处理。

外部中断模式广泛应用于各种事件触发场合,例如检测按键状态、检测传感器信号等。

(8). 模拟中断模式(Analog interrupt mode)

模拟中断模式是GPIO端口的一种特殊输入模式,用于检测模拟信号的变化并触发中断。在模拟中断模式下,GPIO端口可以通过设置阈值,当模拟信号超过阈值时触发中断,并进行相关处理。

模拟中断模式广泛应用于各种模拟信号处理场合,例如音频信号处理、传感器信号采集等。

1.3STM32 的 GPIO 电气特性


STM32 的工作电压:2 V ≤ VDD ≤ 3.6 V
GPIO 的识别范围:COMS 端口:
-0.3 V ≤ VIL ≤ 1.164 V
1.833 V ≤ VIH ≤ 3.6 V
输出电流:单个 GPIO 最大 25mA

一、硬件电路

相信大家对于二极管都不陌生了,二极管是用半导体材料(硅、硒、锗等)制成的一种电子器件   。二极管有两个电极,正极,又叫阳极;负极,又叫阴极,给二极管两极间加上正向电压时,二极管导通, 加上反向电压时,二极管截止。 二极管的导通和截止,则相当于开关的接通与断开。

下面给出Proteus仿真流水灯的电路图;

这边给的是共阴极数码管,单片机型号是STM32F103C8,当我们给GPIO高电平的适合二极管被点亮;我们下面给出两种实现流水灯的程序;

二、软件实现

for循环实现流水灯,给出代码和仿真结果

#include "stm32f10x.h"// Device header
#include "Delay.h"
typedef int unsigned uint;
typedef char unsigned uchar;
int main(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//开启外设GPIOA时钟
	GPIO_InitTypeDef GPIO_InitStructure;//定义GPIO结构体变量
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//GPIO输出模式为推挽输出
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All;//初始化PA——PA15引脚
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	GPIO_ResetBits(GPIOA,GPIO_Pin_All);//初始化给全低电平,二极管全灭
	uchar i;
	
	while(1)
	{		/*从PA0到PA7依次点亮*/
			for(i=0;i<8;i++)
		{
			GPIO_WriteBit(GPIOA, GPIO_Pin_0<<i, Bit_SET);
			Delay_s(100);//延时函数
			GPIO_WriteBit(GPIOA, GPIO_Pin_0<<i, Bit_RESET);
			Delay_s(100);
		}
		/*从PA7到PA0依次点亮*/
		for(i=0;i<8;i++)
		{
			GPIO_WriteBit(GPIOA, GPIO_Pin_7>>i, Bit_SET);
			Delay_s(100);
			GPIO_WriteBit(GPIOA, GPIO_Pin_7>>i, Bit_RESET);
			Delay_s(100);
			
		}
		
	}
}

下面用库函数版本实现流水灯;

#include "stm32f10x.h"// Device header
#include "Delay.h"
typedef int unsigned uint;
typedef char unsigned uchar;
int main(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//开启外设GPIOA时钟
	GPIO_InitTypeDef GPIO_InitStructure;//定义GPIO结构体变量
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//GPIO输出模式为推挽输出
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All;//初始化PA——PA15引脚
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	GPIO_ResetBits(GPIOA,GPIO_Pin_All);//初始化给全低电平,二极管全灭
	uchar i;
	
	while(1)
			{		
		GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET);
		Delay_s(100);//延时函数
		GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET);
		Delay_s(100);
				
		GPIO_WriteBit(GPIOA,GPIO_Pin_1,Bit_SET);
		Delay_s(100);//延时函数
		GPIO_WriteBit(GPIOA,GPIO_Pin_1,Bit_RESET);
		Delay_s(100);
				
		GPIO_WriteBit(GPIOA,GPIO_Pin_2,Bit_SET);
		Delay_s(100);//延时函数
		GPIO_WriteBit(GPIOA,GPIO_Pin_2,Bit_RESET);
		Delay_s(100);
				
		GPIO_WriteBit(GPIOA,GPIO_Pin_3,Bit_SET);
		Delay_s(100);//延时函数
		GPIO_WriteBit(GPIOA,GPIO_Pin_3,Bit_RESET);
		Delay_s(100);
				
		GPIO_WriteBit(GPIOA,GPIO_Pin_4,Bit_SET);
		Delay_s(100);//延时函数
		GPIO_WriteBit(GPIOA,GPIO_Pin_4,Bit_RESET);
		Delay_s(100);
				
		GPIO_WriteBit(GPIOA,GPIO_Pin_5,Bit_SET);
		Delay_s(100);//延时函数
		GPIO_WriteBit(GPIOA,GPIO_Pin_5,Bit_RESET);
		Delay_s(100);
		
		GPIO_WriteBit(GPIOA,GPIO_Pin_6,Bit_SET);
		Delay_s(100);//延时函数
		GPIO_WriteBit(GPIOA,GPIO_Pin_6,Bit_RESET);
		Delay_s(100);
				
		GPIO_WriteBit(GPIOA,GPIO_Pin_7,Bit_SET);
		Delay_s(100);//延时函数
		GPIO_WriteBit(GPIOA,GPIO_Pin_7,Bit_RESET);
		Delay_s(100);
	}
}

上面就是两种实现流水灯的方式了,其实还有很多种,大家可以自己试试,一起加油咯!

  • 5
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
STM32可以通过使用HAL库来实现流水灯效果。首先,你需要安装STM32CubeIDE,并创建一个新的工程。然后,你可以按照以下步骤来完成流水灯实现: 1. 配置LED引脚:打开CubeMX,选择合适的单片机型号,然后在Pinout & Configuration选项中找到LED引脚。将LED引脚配置为输出模式。 2. 初始化GPIO:在生成代码之前,确保你已经选择了合适的GPIO库,并在“Pinout & Configuration”选项中将LED引脚配置为输出模式。 3. 编写代码:在代码编辑器中打开主程序文件,使用HAL库的相关函数来控制LED。以下是一个简单的流水灯实现示例: ```c #include "main.h" #include "stm32f4xx_hal.h" void SystemClock_Config(void); 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(200); } } 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_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLM = 8; RCC_OscInitStruct.PLL.PLLN = 180; RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; RCC_OscInitStruct.PLL.PLLQ = 4; 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_DIV4; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != 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.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); } ``` 在上述代码中,使用了HAL库来初始化系统时钟和GPIO,并通过`HAL_GPIO_TogglePin()`函数来控制LED引脚的状态,实现流水灯效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

温室角落的草

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值