嵌入式蓝桥杯学习1 电量LED
cubemx配置
1.新建一个STM32G431RBT6文件
2.在System-Core中点击SYS,找到Debug(设置为Serial Wire)
3.在System-Core中点击RCC,找到High Speed Clock(设置为Crystal/Ceramic Resonator)
4.打开Clock Configuration (时钟树配置),将左侧的Input frequency改为24(要将PLL改为HSE才能改),将HCLK(MHz)设置为80,设置完后按回车会自动配置时钟树。
上述为系统内部配置,下面配置使用到的GPIO引脚。
LED使用的引脚为PC8-PC15.
1.将PC8-PC15的引脚都设置为GPIO_Output。
2.将PD2设置为GPIO_Output。
在System-Core中点击GPIO,将PC8-PB15全选中,对输出选项进行配置。
GPIO output level (初始电平) :High(初始化为高电平,使所有LED熄灭)
GPIO mode(输出模式):Output Push Pull (选择推挽输出)、
GPIO Pull-up/Pull-down(上拉/下拉):No pull-up and no pull-down(不需要上下拉)
Maximum output speed(速度):Low(低速节能,PC14和PC15只能选择低速)
点击Project Manager
1.Project name(文件名)(不要有中文)
2.Project Location (文件路径):选择没有中文路径的。
3.Toolchain /IDE:MDK-ARM
点击Code Generator ,在STM32Cube MCU packages and enbedded software packs中选择Copy only the necessary library files (复制必要的库文件,可以大幅度减少工程体积);勾选Generated files 中的Generated peripheral initialization as a pair of '.c/.h' files per peripheral.
点击GENERATE CODE.
配置keli
(先编译一下,看看有没有报错,没报错再接着往下走)
在工程目录下新建一个文件夹(bsp)
在bsp中新建my_main.h、my_main.c
新建一个组命名为bsp,把新建好的文件添加进行。
点击魔术棒,C/C++——Include Path——添加bsp的路径
点击Debug,改为DAP调试器。
点击setting,在Flash download里面勾选Reset and Run。
代码编写
知识补充
PD2 : 74HC573的LE(PD2)端为1时,Q端随D端变化;LE端为0时,Q端不随D端变化
GPIO输出函数:
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);
参数说明:
GPIOx:GPIO名称,取值是GPIOA~GPIOG
GPIO_Pin:GPIO引脚,取值是GPIO_PIN_0 ~ GPIO_PIN_15
GPIO_PIN_All <-l小写
PinState:GPIO引脚状态,取值是GPIO_PIN_RESET或GPIO_PIN_SET
在main.c中添加以下内容
1.在25行添加include“my_main.h”
2.在89行添加setup()
3.while(1)内添加loop()
my_main.h
#ifndef _MY_MAIN_
#define _MY_MAIN_
#include "gpio.h"
#include "main.h"
void setup(void);
void loop(void);
void LED_Disp(uint8_t dsLED);
#endif
my_main.c
#include "my_main.h"
//LED引脚: PC8 - PC15
//uint8_t led_sta=0x10;
uint8_t led_sta=0x01;
/*
电量LED:
1.把PC0-PC15置为高电平
2.原地址在0-7,左移8位送入8-15
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
3.开关锁存器(PD2)
1:熄灭 0:点亮
*/
void LED_Disp(uint8_t dsLED)
{
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET);//所有LED熄灭(l小写)
HAL_GPIO_WritePin(GPIOC,dsLED<<8,GPIO_PIN_RESET);//左移8位:控制C8-C15引脚,值为1的电量
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);//开锁存器
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);//关锁存器
}
//单独控制LED某一位
void LED_chg(uint8_t num,uint8_t sta)
{
// uint8_t pos=0x01;
// pos=pos<<(num-1);
// if(sta==1) led_sta=(led_sta&(~pos))|pos;
// else led_sta=(led_sta&(~pos));
// LED_Disp(led_sta);
uint8_t pos=0x01<<(num-1);
led_sta=(led_sta&(~pos))|(pos*sta);
LED_Disp(led_sta);
}
//程序开始时执行一次
void setup()
{
LED_Disp(0x00);
// HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
// HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_RESET);
}
//反复执行
void loop()
{
//LED闪烁0.0
// HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_RESET);
// HAL_Delay(1000);
// HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_SET);
// HAL_Delay(1000);
//LED闪烁1.0
// HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_8);
// HAL_Delay(500);
//LED闪烁2.0
// LED_Disp(0x02);
// HAL_Delay(500);
// LED_Disp(0x00);
// HAL_Delay(500);
//LED闪烁4.0
// led_sta=(led_sta&0xfe)|0x01;
// //0001 0000 led_sta
// //1111 1110 0xfe
// //0001 0000 作用:最后一位清零 XXXX XXX0
// //0000 0001 0x01
// //0001 0001 led_sta
// LED_Disp(led_sta);
// HAL_Delay(500);
// led_sta=(led_sta&0xfe)|0x00;
// //0001 0001 led_sta
// //1111 1110 0xfe
// //0001 0000
// //0000 0000
// //0001 0000
// LED_Disp(led_sta);
// HAL_Delay(500);
//LED交替点亮
// for(int i=0;i<10;i++)
// {
// led_sta=(led_sta&0xfe)|0x01;
// led_sta=(led_sta&0xfd)|0x00;
// LED_Disp(led_sta);
// HAL_Delay(100);
// }
// for(int i=0;i<10;i++)
// {
// led_sta=(led_sta&0xfd)|0x02;
// led_sta=(led_sta&0xfe)|0x00;
// LED_Disp(led_sta);
// HAL_Delay(100);
// }
//流水灯 1.0
// for(int i=0;i<8;i++)
// {
// LED_Disp(0x01<<i);
// HAL_Delay(400);
// }
// for(int i=1;i<7;i++)
// {
// LED_Disp(0x80>>i);
// HAL_Delay(400);
// }
//流水灯 2.0
// for(int i=0;i<8;i++)
// {
// led_sta=(led_sta&0x00)|(0x01<<i);
// LED_Disp(led_sta);
// HAL_Delay(700);
// }
LED_chg(2,1);
HAL_Delay(500);
LED_chg(2,0);
HAL_Delay(500);
}
/*
与&:全1为1。
或|:有1则1。
<<:左移。
*/