蓝桥杯stm32g431rbt6笔记一

本文介绍了如何使用CUBEMX进行STM32的配置,包括配置外部高速时钟、串口和时钟树,以及在Keil5中通过CUBEMX配置的GPIO控制LED灯和处理按键中断。作者详细展示了LED闪烁和按键操作的代码实现。
摘要由CSDN通过智能技术生成

一、点灯实验

1.CUBEMX配置

(1).PC8~PC15:

 (2).RCC开启外部高速时钟

 (3).SYS下载串口

 (4).时钟树配置

 (4).通用设置

 

         通过Cubemx的初步配置到此就完成了。

2.keil5中的代码编写

(1).添加文件

      a.   添加两个空白页,Ctrl+S保存到自己的创建的文件(我的是bsp)。(一个后缀.h  一个后缀.c)

       b.点击魔术棒,添加文件路径,点击左侧文件bsp,在其中添加刚刚保存的.c文件。

 

 

 

 (2).在创建的两个文件(.c和.h)里面写代码

led.c

#include"led.h"

void LED_Disp(uchar dsLED)   
{
	HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET);   //开始就使所有灯灭
	HAL_GPIO_WritePin(GPIOC,dsLED<<8,GPIO_PIN_RESET);     //左移8位   
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);     //打开锁存器
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
}

led.h

#ifndef _LED_H_
#define _LED_H_

#include"main.h"
void LED_Disp(uchar dsLED);
#endif

main.c

#include"led.h"
LED_Disp(0x00);  //led初始化
while (1)
  {
		LED_Disp(0x01);    //选择第一个灯亮
		HAL_Delay(500);
		LED_Disp(0x00);
	    HAL_Delay(500);    //实现第一个灯闪烁
   }

二、按键操作

1.Cubemx配置4个按键串口和定时中断,通过中断函数来配合按键

 

 

 2.keil5中的代码

interrupt.h

#include"interrupt.h"
struct keys key[4]={0,0,0};              //声明一个结构体变量

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)     //中断回调函数
{
	if(htim->Instance==TIM3)     // 判断中断是否来自TIM3
	{
		key[0].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0);      //读取每一个按键的状态
		key[1].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1);
		key[2].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2);
		key[3].key_sta=HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0);
		
	  for(int i=0;i<4;i++)
		{
			switch (key[i].judge_sta)
			{
				case 0:
				{
					if(key[i].key_sta==0)  key[i].judge_sta=1;
				}
				break;
				case 1:
				{
					if(key[i].key_sta==0)
					{
						key[i].judge_sta=2;
						key[i].single_flag=1;
					}
					else key[i].judge_sta=0;
				}
				break;
				case 2:
				{
					if(key[i].key_sta==1)
					{
						key[i].judge_sta=0;
					}
				}
				break;
			}
		}
		
	}
}
	

interrupt.h

#ifndef _INTERRUPT_H_
#define _INTERRUPT_H_

#include"main.h"
#include"stdbool.h"          //使用bool就要加这个头文件
struct keys                  //结构体
{
	uchar judge_sta;            
	bool key_sta;              
	bool single_flag;          
};

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);

#endif

main.c

extern struct keys key[]; 
HAL_TIM_Base_Start_IT(&htim3);  //位置很重要,最好紧挨着while

 while (1)
  {
		LED_Disp(0x01);
		HAL_Delay(500);
		LED_Disp(0x00);
	  HAL_Delay(500);

    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		uchar text[30];
		OLED_Clear();
		if(key[0].single_flag==1)
		{
			sprintf((char *)text,"  key0down       ");
			OLED_ShowString(2,2,(uint8_t *)text);
			
			key[0].single_flag=0;
		}
		if(key[1].single_flag==1)
		{
			sprintf((char *)text,"  key1down       ");
			OLED_ShowString(2,2,(uint8_t *)text);
			 
			key[1].single_flag=0;
		}
		if(key[2].single_flag==1)
		{
			sprintf((char *)text,"  key2down       ");
			OLED_ShowString(2,2,(uint8_t *)text);
			 
			key[2].single_flag=0;
		}
		if(key[3].single_flag==1)
		{
			sprintf((char *)text,"  key3down       ");
			OLED_ShowString(2,2,(uint8_t *)text);
			 
			key[3].single_flag=0;
		}
		
  }
  /* USER CODE END 3 */
}

        第一次写这个,刚好00:00完成。方便自己以后复习,也分享给大家参考。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值