[STM32 HAL]立创天空星开发板STM32F407VET6开发过程1——LED结构体方式实现指南
前言: 由于立创搞活动19.9 ,我就搞了一个立创的开发板(ps: 实际上是加运费28.9)。想着来学习一下。
我写代码很少废话的,接下来是开门见山的东西。
立创·梁山派·天空星开发文档https://lceda001.feishu.cn/wiki/QaWRwow7TiXHhgkwF5mcxZLsne7
目录
图片展示
一、创建工程
New一个工程
进行基础的参数修改
时钟树配置
配置LED引脚与WK_UP
工程生成
二、接下来是KEIL环节
代码环节
定义结构体
构建LED函数
初始化结构体
代码测试
编译&烧录
结果展示
图片展示
——————————————————-分隔符————————————————————–
一、创建工程
这里使用的是CubeMX进行工程构建,官方的是标准库。
New一个工程
进行基础的参数修改
将Debug给选择成串口线,用的是啥勾选啥。有些朋友用的是Jlink呢?
时钟树配置
注意: 小心这里,开发板上面的是8MHz 的晶振
反正就是左边的input输入频率写8,右边的时钟写80,168,都可以,只要选择HSE和PLLCLK就行
配置LED引脚与WK_UP
根据给出的原理图可以知道LED和按键KEY都有一个下拉电阻所以可以配置成以下
注意哦,LED和KEY都是接的低电平,默认低电平。所以后面检测和赋值都是给高电平才是点亮和按下去
工程生成
配置好之后就可以进行工程生成了
命名和路径自定义,IDE选择自己使用的那一个,比如我用的是KEIL所以选择MDK-ARM。最低版本选择V5就可以我这偷懒就默认5.32。
这个选择仅复制必要的文件和勾选生成独立的.c/.h文件。到这工程配置结束。
二、KEIL环节
选择你所使用的调试器,我使用的是DAP_Link所以选择CMSIS DAP,选择后点击右边的Settings
然后打开如图界面勾选Reset and Run,也就是点击烧录后会直接运行程序。
代码环节
其实我没使用到按键,但是按键检测大家都会吧???
注意将代码写到CODE BEBIN和CODE END里面,不然后续再次生成的时候会被覆盖
定义结构体
// 在main.c找到如下位置,构造LED结构体
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
// 定义 LED 控制结构体
typedef struct
{
void (*On)(GPIO_TypeDef *, uint16_t); // 点亮 LED 的函数指针
void (*Off)(GPIO_TypeDef *, uint16_t); // 熄灭 LED 的函数指针
void (*Toggle)(GPIO_TypeDef *, uint16_t); // 翻转 LED 的函数指针
void (*Loop)(GPIO_TypeDef *, uint16_t, uint16_t); // 循环点亮与熄灭 LED 的函数指针
} LED_Control;
/* USER CODE END PTD */
构建LED函数
结构体里所需要的有如下函数
// main.c 找到这个 USER CODE BEGIN 0
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
// LED 点亮函数
void LED_On(GPIO_TypeDef * GPIOx, uint16_t LEDx_Pin) {
HAL_GPIO_WritePin(GPIOx, LEDx_Pin, GPIO_PIN_SET);
}
// LED 熄灭函数
void LED_Off(GPIO_TypeDef * GPIOx, uint16_t LEDx_Pin) {
HAL_GPIO_WritePin(GPIOx, LEDx_Pin, GPIO_PIN_RESET);
}
// 翻转 LED 的函数
void LED_Toggle(GPIO_TypeDef * GPIOx, uint16_t LEDx_Pin)
{
HAL_GPIO_TogglePin(GPIOx, LEDx_Pin);
}
// 循环点亮与熄灭 LED 的函数
void LED_Loop(GPIO_TypeDef * GPIOx, uint16_t LEDx_Pin, uint16_t Delay)
{
HAL_GPIO_TogglePin(GPIOx, LEDx_Pin);
HAL_Delay(Delay);
}
/* USER CODE END 0 */
这个代码好不好取决于你的LED多不多,反正我自己很少会用这个结构体来写这种简单的东西,加上这个板子只有一个LED,这样写确实挺浪费。不过这个教程主要是写如何使用结构体做某事。
初始化结构体
// main.c 上面有LED的各种函数
LED_Control LED =
{
.On = LED_On,
.Off = LED_Off,
.Toggle = LED_Toggle,
.Loop = LED_Loop
};
/* USER CODE END 0 */
代码测试
使用这个结构体的Loop进行测试
// main.c 找到main函数里的while循环
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
LED.Loop(GPIOB, LED1_Pin, 200);
//使用LED的Loop方法(第一个参数写引脚在哪个区,第二个参数写引脚在第几个位置, 第三个是循环闪烁一次的延时时间)
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
编译&烧录
最后编译,并下载烧录
最后的最后
结果展示
作者:赤小束