蓝桥杯STM32G431RBT6学习——LED

蓝桥杯STM32G431RBT6学习——LED

前言

LED为每年必考考点,也是入门的基础,国信长天的开发板LED硬件如下:
在这里插入图片描述
经典的锁存器控制,因为LED所用引脚与LCD重叠,因此通过锁存器进行控制其状态。当74HC573的LE引脚(PD2)为高电平时,锁存器处于解锁状态,PC8~PC15电平直接输出给到LED,当LE引脚(PD2)为低电平时,74HC573将电平信号进行锁存。

STM32CubeMX配置

时钟配置依旧,只需要将LED及锁存器LE引脚对应的单片机IO口设置为输出模式即可,LED为共阳接法,且LE引脚为低电平锁定,因此IO口初始状态均设为低电平、推挽输出、无上下拉、低速。
在这里插入图片描述

Keil代码编写

GPIO的初始化由CubeMX自动生成与gpio.c中的MX_GPIO_Init函数。
关于LED的常用API如下:
设置输出电平

void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)

参数1:IO口所在组;
参数2:IO口引脚号;
参数3:输出电平
反转IO口电平输出

void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)

参数1:IO口所在组;
参数2:IO口引脚号

LED的控制只需要简单的给对应IO口赋值低电平即可点亮,为了方便使用,也可以对其控制进行封装,以下分别封装为整体控制与单独控制:
整体控制:
整体控制为一次改变所有LED的状态,因此可以在函数的开头对LED进行全灭处理,随后将目标LED状态写入,写入完成后开关锁存器将IO口信号输出到LED即可,最后保存写入值用于单独控制使用,代码如下:

/****************
函数功能:整体LED设置函数
函数参数:整体LED状态值(8位)
函数返回值:无
****************/
void LED_Set(uchar led_Pin)
{
	//每次更新状态先熄灭所有LED
	HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET);
	//写入LED的值(16位GPIO,LED占用高八位),以低电平写入
	HAL_GPIO_WritePin(GPIOC,led_Pin<<8,GPIO_PIN_RESET);
	//拉高解锁74HC573,传入数据后重新拉低锁存
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
	
	ledState = led_Pin;
}

单独控制:
由于整体控制会一次改变所有的LED状态,例如需要LED1保持不变的情况下改变LED2就会稍许麻烦,因此也封装一个函数用于单独改变某个LED的状态,直接读取上次的状态进行写入后,再对单独的LED进行控制即可,代码如下:

/****************
函数功能:单独LED设置函数
函数参数:参数1:LED所在引脚,参数2:LED状态值
函数返回值:无
****************/
void LED_SetOne(uint16_t GPIO_Pin, GPIO_PinState PinState)
{
	HAL_GPIO_WritePin(GPIOC,ledState<<8,GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOC,GPIO_Pin,PinState);
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
	
	ledState = !GPIOC->IDR>>8;
}
### 解决STM32G431RBT6蓝桥杯比赛中遇到的冲突问题 #### 一、理解冲突原因 对于STM32G431RBT6,在蓝桥杯嵌入式竞赛中,LCD与LED显示存在引脚重叠的情况。具体来说,LCD涉及的引脚数量较多,并且这些引脚(如PC8至PC15)也用于控制LED灯,这可能导致两者同时工作时发生资源争用,进而引起LED状态混乱[^4]。 #### 二、解决方案概述 针对上述提到的硬件资源共享带来的干扰问题,可以采取以下几种方法来有效缓解或彻底消除这种影响: #### 三、方案详情 ##### 方法一:分时复用技术的应用 通过编程手段实现对共享GPIO端口的时间片分配管理,即让LCD和LED轮流占用相同的物理接口进行操作。这样可以在不影响各自功能的前提下避免直接竞争同一组I/O线路。此方式简单易行但可能会影响响应速度。 ##### 方法二:修改硬件连接布局 如果条件允许的话,重新设计电路板使得LCD屏幕不再依赖于原本被用来驱动指示灯的部分管脚;或者增加额外的逻辑电平转换器件作为中介层隔离二者之间的电气联系。不过这种方法通常只适用于项目初期规划阶段而非临时调整策略。 ##### 方法三:软件层面优化配置 利用微控制器内部丰富的外设特性——比如DMA (Direct Memory Access),定时器等辅助模块配合中断服务程序巧妙安排任务优先级以及执行时机从而达到错开访问周期的效果。这种方式灵活性较高而且不会改变现有硬件架构。 ```c // 使用DMA传输数据给LCD, 减少CPU干预时间窗口 HAL_DMA_Start(&hdma_memtomem_dma2_stream0,(uint32_t)&bufferlcd,(uint32_t)LCD_FRAME_BUFFER,LCD_DATA_SIZE); __HAL_LINKDMA(htim,&htim->HDMA_Tx, hdma_memtomem_dma2_stream0); // 设置定时器触发事件处理函数更新LED状态 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){ static uint8_t led_state=0; if (htim==&htim2){ // 假定使用TIM2作为计数源 GPIO_WritePin(GPIOC, LED_PIN, !led_state); led_state=!led_state; } } ``` 以上三种途径均可不同程度地改善因共用IO造成的异常状况,实际应用当中可根据具体情况选择最适合的一种或是组合多种措施共同作用以获得最佳效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值