第十二届蓝桥杯嵌入式比赛准备(二)——LED

这次是竞赛板的LED部分。

SN74HC573ADWR是锁存器,LED1-8由PC的高八位控制PC8-PC15.

其中还有PD2作为锁存器的“开关”。

在操作LED时必须要打开锁存器,这时要把PD2置1,在操作完LED后要记得把PD2置0,这样做是因为LCD也会用到PC口,会造成冲突,解决方案会在之后提出。

先是按照上一次配置好基本的东西。

其次是配置PC端的高八位,设置成GPIO_Output模式,它默认是推挽输出,不用做什么改变。如图所示

在这里点开某一个引脚后,会出现配置信息。最下面有个User Label,可以自己定义,这里我定义它为LED1,在进入工程后可以在main.h中找到相关的define,就是将这一个引脚的端口和引脚等信息进行define,便于阅读与移植。

/* Private defines -----------------------------------------------------------*/
#define LED1_Pin GPIO_PIN_8
#define LED1_GPIO_Port GPIOC

配置完成后就直接生成工程就行了。

打开工程后就是这样,不用修改。

上面有BEGIN和END的语句,自己写的内容,比如函数,还有一些define、变量之类的东西最好都写在BEGIN和END语句中间,不写在这中间的话,如果想要修改配置再次使用CubeMx生成工程时,不写在这中间的内容都会擦除,写在BEGIN和END语句中间的内容不会被抹去。

其次,需要点开魔术棒,点开Debug,生成的工程,由于刚开始选择的是Serial Wire,所以这里默认会是STLink,但是比赛需要用的是CMSIS-DAP Debugger这个下载器。

点开旁白的Setting,可以选择Max Clock为10MHz,也可以不修改,这个没啥影响。

点开Flash Download,勾选Reset and Run,不然会报错。有时候可能flah也会没有,这时候需要自己添加。如果MDK中没有这个flash,可以在STM32G4的芯片包里找到,然后复制到MDK的flash就可以添加了。

下面就是正式编写程序了。

相对应的函数都可以在对应的头文件中找到。

主要应用的函数就是下面三个

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

GPIO_PinState     HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);

就是读取对应的引脚的状态。多用在输入的时候。

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

就是给对应的引脚写状态。

void              HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);

就是对应引脚的状态翻转。

在工程中,延时函数是已经定义好的。

__weak void HAL_Delay(uint32_t Delay)
{
  uint32_t tickstart = HAL_GetTick();
  uint32_t wait = Delay;

  /* Add a freq to guarantee minimum wait */
  if (wait < HAL_MAX_DELAY)
  {
    wait += (uint32_t)(uwTickFreq);
  }

  while ((HAL_GetTick() - tickstart) < wait)
  {
  }
}

可以直接在main函数里引用。

下面就可以点亮LED与流水灯了\

下面就是使用的宏定义的PC8,即LED1_PIN。

  while (1)
  {
		HAL_GPIO_WritePin(GPIOC,LED1_Pin,GPIO_PIN_RESET);
		HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
		HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
		HAL_Delay(500);
		HAL_GPIO_WritePin(GPIOC,LED1_Pin,GPIO_PIN_SET);
		HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
		HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
        HAL_Delay(500);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

上述内容也可以写成(换个引脚,换成PC9)

  while (1)
  {
		HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_9);
		HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
		HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
		HAL_Delay(500);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

也可以使用宏定义,像下面这种(可以定义在gpio.h中)

#define LED2_TOGGLE() HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_9);\
									HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);\
									HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);

在多行的宏定义的时候,要在每一行最后加一个\,且后面不能有任何字符,否则会产生错误。、

然后直接在main函数里调用即可。

  while (1)
  {
		LED2_TOGGLE();
		HAL_Delay(500);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

 

### 第十二届蓝桥杯嵌入式省赛示例程序代码 针对第十二届蓝桥杯嵌入式省赛中的题目,可以提供一段关于LED控制的简化版本代码作为参考。这段代码展示了如何实现单个LED灯的开关操作。 ```c #include "stm32f10x.h" // 定义GPIO端口和引脚配置 #define LED_PORT GPIOA #define LED_PIN GPIO_Pin_8 void delay_ms(uint32_t ms); // 延迟函数声明 /** * @brief 初始化LED使用的GPIO引脚. */ void led_init(void){ GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = LED_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(LED_PORT, &GPIO📐⚗ beğenmediğiniz bir şey mi var? Bu mesajı almanın sebebi, belirttiğiniz konuda tam olarak size yardımcı olamadığım için olabilir. Belirli bir hata veya eksiklik olduğunu düşünüyorsanız lütfen daha fazla bilgi verin ki Size daha iyi yardımcı olabilelim. Devam etmek için: 初始化完成后,下面定义两个用于单独控制LED开闭的功能函数: ```c /** * @brief 打开指定编号的LED. * * @param turn 表示要打开哪个LED (这里仅作示意,实际应用中可能对应具体的硬件连接). */ void led_single_on(uint8_t turn){ if(turn == 1){ // 如果是第一个LED,则设置相应的IO为低电平点亮它 GPIO_WriteBit(LED_PORT, LED_PIN, Bit_RESET); } } /** * @brief 关闭指定编号的LED. * * @param turn 表示要关闭哪个LED. */ void led_single_off(uint8_t turn){ if(turn == 1){ // 如果是第一个LED,则设置相应的IO为高电平熄灭它 GPIO_WriteBit(LED_PORT, LED_PIN, Bit_SET); } } ``` 为了使上述功能正常工作,还需要一个简单的延时函数来帮助观察效果,在此给出一个基于循环计数器的简单延时子程序例子: ```c /** * @brief 实现毫秒级延迟. * * @param ms 需要等待的时间长度(单位:ms). */ void delay_ms(uint32_t ms){ uint32_t count; while(ms--){ for(count=SystemCoreClock/4000;count!=0;count--); } } ``` 以上就是对于第十二届蓝桥杯嵌入式比赛中涉及到的基础外设——LED的操作实例[^3]。这些基础组件的应用不仅限于比赛本身,也是学习STM32或其他微控制器平台的良好起点。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值