stm32g431led
时间: 2025-01-08 11:10:28 浏览: 6
### STM32G431 控制 LED 示例代码教程
#### 使用74HC595扩展LED控制
对于STM32G431CBU6单片机而言,当需要驱动较多数量的LED时,可以采用74HC595移位寄存器来扩展I/O口的数量。通过SPI通信协议模拟数据传输给74HC595芯片,从而达到控制多路LED的目的[^1]。
下面是一个简单的程序框架,在此框架下能够完成对连接至74HC595上的八个LED灯进行循环点亮操作:
```c
#include "main.h"
#define LATCH_PIN GPIO_PIN_2
#define DS_PIN GPIO_PIN_3
#define SH_CP_PIN GPIO_PIN_4
GPIO_InitTypeDef GPIO_InitStruct = {0};
void setup(void){
__HAL_RCC_GPIOA_CLK_ENABLE(); //使能端口时钟
//配置LATCH,DS,SH_CP为推挽输出模式
GPIO_InitStruct.Pin = LATCH_PIN | DS_PIN | SH_CP_PIN;
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);
}
uint8_t data_to_shift;
void loop(void){
int i;
for(i=0;i<8;i++){
data_to_shift = (1 << i); //设置要显示的数据
HAL_GPIO_WritePin(GPIOA,LATCH_PIN,GPIO_PIN_RESET);//拉低锁存信号
SPI_HandleTypeDef hspi1; //假设已经初始化好SPI1外设
HAL_SPI_Transmit(&hspi1,(uint8_t*)&data_to_shift,sizeof(data_to_shift),HAL_MAX_DELAY);
HAL_GPIO_WritePin(GPIOA,LATCH_PIN,GPIO_PIN_SET); //拉高锁存信号保存当前状态
HAL_Delay(500); //延时一段时间观察效果
}
}
```
这段代码展示了如何利用STM32CubeIDE环境下的HAL库函数配合硬件资源(如GPIO和SPI接口),实现向74HC595发送指令以改变其输出电平的状态,进而间接地操控外部电路中的LED阵列。
#### 基于串口命令控制单一LED开关
除了上述批量处理方式之外,还可以编写更灵活的应用场景——即接收来自PC或其他设备发出的不同字符作为触发条件,分别执行打开/关闭指定编号LED的动作,并且回传相应的确认消息回源地址[^2]。
这里给出一段简化版的UART中断服务子程序ISR模板,它可以根据接收到的具体ASCII码值决定下一步动作:
```c
extern UART_HandleTypeDef huart1;
void USART1_IRQHandler(void)
{
uint8_t received_data;
if (__HAL_UART_GET_FLAG(&huart1,UART_FLAG_RXNE)){
received_data = (uint8_t)USART_RECEIVE_DATA(huart1.Instance);
switch(received_data){
case 'O':
HAL_GPIO_WritePin(LED_PORT,LED_PIN,GPIO_PIN_SET);
send_string("LED1OPEN!");
break;
case 'C':
HAL_GPIO_WritePin(LED_PORT,LED_PIN,GPIO_PIN_RESET);
send_string("LED1CLOSE!");
break;
default:
;//忽略其他输入
}
}
}
```
以上两部分介绍了两种不同类型的LED控制系统设计方案及其对应的软件编码实践指南,适用于初学者快速入门STM32系列微控制器平台的学习过程之中。
阅读全文