【STM32】HAL库LED点灯

目录

一、STM32中HAL库函数开发方法

二、STM32CubeMX的安装

三、STM32Cube完成两个LED灯闪烁

1.新建项目

2.配置项目

3.Keil函数修改

4.实验结果

四、采用中断模式控制LED灯点亮

1.配置项目

2.Keil函数修改

一、STM32中HAL库函数开发方法

  基于HAL库的开发方式,其实质是仍然是通过操作底层寄存器来实现相应功能,只是将寄存器操作进行了封装,以函数形式提供给开发人员使用。

  HAL库开发模式需要用到两个软件:STM32CubeMX用于外设功能模块的参数配置、生成相应编译器的工程代码;编译器用于应用程序的开发。

HAL库的接口函数

类型函数原型功能描述
初始化及复位函数HAL_GPIO_Init()GPIO**初始化函数**
HAL_GPIO_DeInit**()**复位选定的端口引脚到初始状态
引脚功能**操作函数**HAL_GPIO_ReadPin**()**读取选定的端口引脚的电平状态
HAL_GPIO_WritePin**()**设置选定的端口引脚输出高电平或低电平
HAL_GPIO_TogglePin()设置选定端口引脚的电平状态翻转
HAL_GPIO_LockPin()当端口引脚电平状态改变时保持锁定时的值
HAL_GPIO_EXTI_IRQHandler()外部中断处理函数
HAL_GPIO_EXTI_Callback()中断回调函数

二、STM32CubeMX的安装

点击Next,同意协议后点击Next,然后选择对应安装位置。

若遇到下图情况直接点击确定。

安装成功后打开STM32Cube进行固件库安装

选择对应的固件库进行安装

三、STM32Cube完成两个LED灯闪烁

1.新建项目

2.配置项目

进行输出端口设置,选择PA3,PA4为GPIO_Output;

配置SYS:

配置RCC:

配置GPIO:

设置为High

时钟配置:

项目建立:

3.Keil函数修改

在main.c文件中给while循环添加如下代码

	  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET); 
	  HAL_Delay(1000);
	  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_SET);
	  
	  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
	  HAL_Delay(1000); // ??1s
	  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);

stlink链接过后先编译程序再进行烧录

4.实验结果

线路连接:

实验效果:

四、采用中断模式控制LED灯点亮

1.配置项目

配置SYS:

配置RCC:

配置GPIO:

2.Keil函数修改

在mian.c中添加以下代码

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) 
{ 
	if( GPIO_Pin == B1_EXTI_Pin )
		{
			HAL_GPIO_TogglePin(LD5_GPIO_Port, LD5_Pin); 
		}
}

注:B1_EXTI指PB15;LED5指PA5

参考博客: STM32中断和基于HAL库的LED流水灯_stm32按键中断控制灯闪烁-CSDN博客

STM32基于HAL库流水灯实验_hel库安装教程中文版-CSDN博客

### STM32 HAL配合上位机控制LED亮灭 #### 使用STM32 HAL与上位机交互来控制LED的操作主要涉及几个方面: - **硬件连接** - 单片机(如STM32F103)上的指定GPIO引脚连接到LED,通常会有一个限流电阻串联以保护LED[^2]。 - **软件设置** - 配置USART接口用于串口通信。这可以通过STM32CubeMX工具完成基本配置并生成初始化代码。确保选择了合适的波特率以及数据帧格式等参数匹配上下位机之间的通讯需求[^4]。 - 初始化定时器以便于处理延时操作,虽然对于简单的LED控制并非必需,但在某些应用场景下可能需要用到它来进行周期性的状态切换或其他功能实现[^1]。 - **编写接收命令解析逻辑** 为了响应来自PC端的应用指令,在MCU侧需定义一套协议用来识别不同的动作请求。这里给出一段简化版的例子展示如何基于接收到的不同字符改变LED的状态: ```c #include "main.h" UART_HandleTypeDef huart1; TIM_HandleTypeDef htim2; #define LED_PIN GPIO_PIN_5 #define LED_PORT GPIOA void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_USART1_UART_Init(void); int main(void){ HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_USART1_UART_Init(); while (1){ // 主循环等待事件发生 } } // UART中断服务程序 void USART1_IRQHandler(void){ uint8_t ch; /* ENTER批判区 */ __disable_irq(); if (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_RXNE)){ ch = (uint8_t)(huart1.Instance->DR & (uint8_t)0xFF); switch(ch){ case 'o': // 打开LED HAL_GPIO_WritePin(LED_PORT, LED_PIN, GPIO_PIN_SET); break; case 'f': // 关闭LED HAL_GPIO_WritePin(LED_PORT, LED_PIN, GPIO_PIN_RESET); break; } } __enable_irq(); } ``` 上述代码片段展示了通过串口中断的方式监听到来自上位机的数据,并依据特定字符('o' 或者 'f')执行相应的LED点亮或熄灭的动作。 #### C#上位机部分简易示例 在Windows环境下利用C#语言开发图形界面应用程序向嵌入式设备发送控制信号相对简单。下面是一段基础的WinForm窗体应用中的按钮点击事件处理器样例,负责构建和传输控制消息至目标微控制器: ```csharp using System.IO.Ports; private SerialPort sp = new SerialPort("COM3", 9600, Parity.None, 8, StopBits.One); public Form1(){ InitializeComponent(); sp.Open(); } private void btnOpen_Click(object sender, EventArgs e){ sp.Write("o"); } private void btnClose_Click(object sender, EventArgs e){ sp.Write("f"); } ``` 这段代码实现了两个按钮的功能:一个是发送`'o'`字符使能远程节点处的LED发光;另一个则是发出`'f'`关闭光。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值