蓝桥杯嵌入式之模块驱动

一、LED驱动

1.头文件

#ifndef     __LED_H__
#define    __LED_H__
#include "main.h"
void led_disp(u8 uled);
void Led_dispos(u8 pos);
void LED_Disp(u8 dsLED);
void TurnOn_LED(uint8_t _led);
void TurnOff_LED(uint8_t _led);
void Toogle_LED(uint8_t _led);

#endif   /*__LED_H__*/

2.源文件

#include "led.h"
  void led_disp(u8 uled)
  {
    
       HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12| 
	   GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15, GPIO_PIN_SET);
	  
	  HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
	  HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
	  
	  HAL_GPIO_WritePin(GPIOC,uled<<8,GPIO_PIN_RESET);
	  HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
	  HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
	  
	  
  }

  void Led_dispos(u8 pos)
  {
     switch(pos)
	  {
		 case 1:
			led_disp(0x01); 
		 break;
		  case 2:
			led_disp(0x02); 
		 break;
		   case 3:
			led_disp(0x04); 
		 break;
		    case 4:
			led_disp(0x08); 
		 break;
			 case 5:
			led_disp(0x10); 
		 break;
			  case 6:
			led_disp(0x20); 
		 break;
			   case 7:
			led_disp(0x40); 
		 break;
			    case 8:
			led_disp(0x80); 
		 break;
				default:
					led_disp(0x00);
					
	  }
  
  }
  
  
  u32 led = 0xff00;

/*
LED_Disp:全灭LED灯,然后点亮一个LED灯
dsLED:要点亮的LED灯,如dsLED==0x01,点亮LED1
*/
void LED_Disp(u8 dsLED)
{
	HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOC,dsLED<<8,GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
}

/*
TurnOn_LED:点亮某个LED灯(使用寄存器)
参数:
	@_led:要打开的LED灯序号(如第一个为“1”)
*/
void TurnOn_LED(uint8_t _led)
{
	led &= ~(0x01<<(7+_led));
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
	GPIOC->ODR = (uint32_t)led;
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
}

/*
TurnOff_LED:熄灭某个LED灯(使用寄存器)
参数:
	@_led:要熄灭的LED灯序号(如第一个为“1”)
*/
void TurnOff_LED(uint8_t _led)
{
	led |= (0x01<<(7+_led));
	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
	GPIOC->ODR = (uint32_t)led;
	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
}

/*
Toogle_LED:反转某个LED灯(使用寄存器)
参数:
	@_led:要反转的LED灯序号(如第一个为“1”)
*/
void Toogle
### 关于 `vc-complex-type.2.4.a` 错误的分析 `vc-complex-type.2.4.a` 错误通常与编译器验证复杂数据类型的扩展级别设置有关。当指定的 `'extension-level'` 值不符合预期或超出支持范围时,可能会触发此错误。以下是对此问题的深入解析: #### 1. **错误背景** 该错误可能源于布局库 (`layoutlib`) 头文件中的配置不一致。具体来说,如果头文件中定义的扩展级别未被当前使用的工具链所识别,则会引发此类警告或错误。 #### 2. **解决方案** ##### (1)检查并调整 `'extension-level'` 参数 确认项目中是否显式设置了 `'extension-level'` 参数及其值。例如,在某些情况下,可能需要将其更改为受支持的标准值之一(如 `"basic"` 或 `"advanced"`)。可以通过修改相关宏定义来实现这一点: ```c++ #define EXTENSION_LEVEL "basic" ``` ##### (2)更新布局库版本 确保正在使用的 `layoutlib` 是最新版本。旧版库可能存在兼容性问题,无法正确处理新的扩展级别选项。可以尝试升级到最新的稳定版本[^1]。 ##### (3)审查头文件内容 仔细检查涉及的头文件是否有不当声明或冲突定义。特别是那些控制扩展行为的关键字段,比如结构体成员变量 `struct v4l2_buffer.memory` 的遗漏可能导致类似的误解。 ##### (4)启用调试模式重新构建 通过增加详细的日志输出或者切换至更高的诊断等级,定位具体的失败点所在位置。这有助于进一步缩小问题根源。 ```bash gcc -Wall -Wextra -pedantic-errors ... ``` #### 3. **代码实例展示修正方法** 下面是一个简单的例子演示如何安全地初始化以及应用有效的扩展层次设定: ```cpp #include <iostream> #include <string> // 定义合法的扩展层常量集合 const std::string VALID_EXTENSION_LEVELS[] = {"none", "basic", "intermediate", "full"}; bool validateExtensionLevel(const std::string& level){ for(auto valid : VALID_EXTENSION_LEVELS){ if(valid == level) return true; } return false; } int main(){ std::string current_level="invalid"; // 替换为实际读取得到的level if(!validateExtensionLevel(current_level)){ std::cerr << "`" << current_level << "` is an invalid extension level."<<std::endl; exit(EXIT_FAILURE); } std::cout<<"Using extension level:"<<current_level<<std::endl; return EXIT_SUCCESS; } ``` #### 结论 上述措施能够有效缓解因 `'extension-level'` 配置失误而产生的 `vc-complex-type.2.4.a` 类型错误。务必依据实际情况选取最合适的策略加以实施。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值