蓝桥杯嵌入式(stm32CubeMx+keil5 开发)

一、stm32CubeMx新建工程

 1.打开stm32CubeMx软件后

2.选择需要开发的芯片:STM32G431RBT6

3.时钟配置:选择外部时钟

4.时钟树配置

3.外设配置

 (1)KEY(原理图)

  PA0、PB0、PB1、PB2这几个GPIO口配置为GPIO——InPut模式----No Pull up and pull down(默认)

(2)LED(原理图)

PC8 -----PC15-----> GPIO_output模式 ---->GPIO ---->Hight(灭);

PD2------>GPIO_output模式-------Low(使能端)

(3)生成工程

(4)生成的keil 工程

(6)添加自己的bsp文件夹(驱动代码)

(7)建立各个驱动子文件夹

(8新建各个驱动的头文件和源文件

(9)Keil中新建BSP文件夹

(10)Keil中添加源文件

注意:返回上一层后添加代码

(11)点击keil工具栏中的魔法棒添加头文件路径

注意:文件的目录添加存在头文件目录的上一级目录即可。

(12)在.c和.h文件中添加自己的代码

led.c代码:

#include "led.h"


//函数名:LED_Disp
//入口参数:ucLed
//出口参数:void
//函数功能:LD8-LD1对应ucLed的8个位
void LED_Disp(unsigned char ucLed)
{
	//**将所有的灯熄灭
	HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15|GPIO_PIN_8
												|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);		
	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);

	//根据ucLed的数值点亮相应的灯
	HAL_GPIO_WritePin(GPIOC, ucLed<<8, GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);		
	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);	
	
}



key.c代码:

#include "key.h"
#include "key.h"

unsigned char Key_Scan(void)
{
	unsigned char unKey_Val = 0;
	
	if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) == GPIO_PIN_RESET)
		unKey_Val = 1;

	if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1) == GPIO_PIN_RESET)
		unKey_Val = 2;

	if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2) == GPIO_PIN_RESET)
		unKey_Val = 3;
	
	if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET)
		unKey_Val = 4;	
	
	return unKey_Val;
}









(13)在main函数中添加代码实现功能key1按下8个LED灯全灭,key4按下8个LED灯全亮

实现功能的代码:

void Key_Proc()
{
	if((uwTick - uwTick_Set_Point) < 100) return;
	 uwTick_Set_Point = uwTick;
	ucKey_Val = Key_Scan();
//情况1: 100ms两次扫描,按键得到的结果从0 (都没按下)到B4按下,产生了下降沿。
//ucKey_Val = 4(0000 0100)
//unKey_Down = 0000 0100 & ( 0000 0000 ^ 0000 0100) = 0000 0100 & 0000 0100 = 0000 0100 (4)
//ucKey_Up = 1111 1011 & 0000 0100 = 0000 0000
//ucKey_Old = 4
//情况2: B4产生了下降沿后,按键一直按着
//ucKey_Val = 4(0000 0100)
//unKey_DownT= 0000 0100 & ( 0000 0100 ^ 0000 0100) = 0000 0100 & 0000 0000 = 0000 0000 (0)
//ucKey_Up = 1111 1011 & 0000 0000 = 0000 0000
//ucKey_0ld = 4
//情况3: B4按键一直按着随后弹起
//ucKey_Val = 0(0000 0000)
//unKey_Down = 0000 0000 & ( 0000 0100 ^ 00000000) = 0000 0000 & 0000 0100 = 0000 0000 (0)
//ucKey_Up = 1111 1111 & 0000 0100 = 0000 0100 (4)
//ucKey_Old = 0

	unKey_Down = ucKey_Val & (ucKey_Old ^ ucKey_Val); 
	ucKey_Up = ~ucKey_Val & (ucKey_Old ^ ucKey_Val);	
	ucKey_Old = ucKey_Val;
	if(unKey_Down == 4)
	{
		LED_Disp(0xff);
		
		
	}
	if(unKey_Down == 1)
	{
		LED_Disp(0x00);
	}
	
}

(14)在main函数的while循环中调用实现功能的代码

注意:不要忘记在main函数上面声明:void Key_Proc();

还要注意的是:

以上添加的话,以下这样包含:

另外一种包含:

(15)成功案例

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值