自学内容网 自学内容网

嵌入式蓝桥杯学习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才能改),然后点击PLLCLK,将HCLK(MHz)设置为80,设置完后按回车会自动配置时钟树。

 

上述为系统内部配置,下面配置使用到的GPIO引脚。

LED使用的引脚为PC8-PC15.

1.将PC8-PC15的引脚都设置为GPIO_Output。

2.将PD2设置为GPIO_Output。

f05cd6fb3b88499d87786e6d767cdaff.png

在System-Core中点击GPIO,将PC8-PC15全选中,对输出选项进行配置。

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只能选择低速)

eb2d8b22b86f4ab89bb9c06de55f72e8.png

点击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.

ca0e5aff27014da5a9ca47094ea236fe.png

点击GENERATE CODE.         

配置keli

(先编译一下,看看有没有报错,没报错再接着往下走)

在工程目录下新建一个文件夹(bsp)

在bsp中新建my_main.h、my_main.c

新建一个组命名为bsp,把新建好的文件添加进行。

点击魔术棒,C/C++——Include Path——添加bsp的路径

点击Debug,改为DAP调试器。

476d95775afa4ee3ac619dcd82136b77.png

点击setting,在Flash download里面勾选Reset and Run。

e8ae190cc2e64a34a3644732e4bae1be.png

代码编写

知识补充

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。
<<:左移。

*/


原文地址:https://blog.csdn.net/m0_74246768/article/details/144227188

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!