软件下载与激活
【STM32入门教程-2023版 细致讲解 中文字幕】 https://www.bilibili.com/video/BV1th411z7sn/?share_source=copy_web&vd_source=be33b1553b08cc7b94afdd6c8a50dc5a
LED闪烁
一、新建工程
复制工程重命名 ,笔者命名为源码(LED)
新建BSP/LED 路径
点击.uvprojx打开工程
打开后
1.1 添加.c/.h文件
新建文件
先不考虑内容,保存文件
路径就是刚才新建的LED文件夹
led.c
led.h
添加文件到工程分组
可以看到左侧工具栏目录出现添加的路径,但是新建的.c和.h文件还没有添加进来
双击后出现Add Files添加文件的提示框
目前只添加.c文件
文件类型选择All files可以看到文件夹中所有文件
添加后
打开delay.c
左键点delay.h,右键再点一下,选择菜单中Open document
打开了delay.h文件
复制内容
#ifndef __DELAY_H
#define __DELAY_H
#include "./SYSTEM/sys/sys.h"
void delay_init(uint16_t sysclk); /* 初始化延迟函数 */
void delay_ms(uint16_t nms); /* 延时nms */
void delay_us(uint32_t nus); /* 延时nus */
#if (!SYS_SUPPORT_OS) /* 如果不支持OS */
void HAL_Delay(uint32_t Delay); /* HAL库的延时函数,HAL库内部用到 */
#endif
#endif
粘贴到led.h,修改成
#ifndef __LED_H
#define __LED_H#include "./SYSTEM/sys/sys.h"
#endif
#endif后面必须有空行
二、编辑led.c
1.使能时钟
x替换为你想使用的A,B,C
__HAL_RCC_GPIOx_CLK_ENABLE()
2.设置工作模式
HAL_GPIO_Init()
3.结构体定义
初始化结构体。需要观察定义
GPIO_InitTypeDef gpio_init_struct
右键点击或者左键点击拖动一下可选择分栏查看
分栏后:
代码补全的问题
之前打开江协科技工程,设置了代码补全功能,有效,现在打开正点原子的项目,同样的设置代码补全的功能又不见了。
Mode
Pull
不用管
Speed
HAL_GPIO_WritePin
来到GPIO_PinState的定义
我们需要初始化时灯是灭的,需要引脚置位,选择SET
led.c
#include "./BSP/LED/led.h"
void led_init(void)
{
GPIO_InitTypeDef gpio_init_struct;
__HAL_RCC_GPIOA_CLK_ENABLE();
gpio_init_struct.Pin=GPIO_PIN_9; /*根据自己接的引脚*/
gpio_init_struct.Mode=GPIO_MODE_OUTPUT_PP; /*推挽*/
gpio_init_struct.Speed=GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA,&gpio_init_struct);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET);
}
三、 led.h
#ifndef __LED_H
#define __LED_H
#include "./SYSTEM/sys/sys.h"
void led_init();
#endif
四、编辑main.c
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.c"
int main(void)
{
HAL_Init(); /* 初始化HAL库 */
sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */
delay_init(72); /* 延时初始化 */
led_init(); /* LED初始化 */
while(1)
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_9,GPIO_PIN_SET); /* PA9置1 */
delay_ms(500);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_9,GPIO_PIN_RESET); /* PA9置0 */
delay_ms(500);
}
}
五、编译烧录
报错
..\..\Output\atk_f103.axf: Error: L6200E: Symbol led_init multiply defined (by led.o and main.o).
main.c改成引用led.h
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"
int main(void)
{
HAL_Init(); /* 初始化HAL库 */
sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */
delay_init(72); /* 延时初始化 */
led_init(); /* LED初始化 */
while(1)
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_9,GPIO_PIN_SET); /* PA9置1 */
delay_ms(500);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_9,GPIO_PIN_RESET); /* PA9置0 */
delay_ms(500);
}
}
编译后
有SWDIO
确定选型
再选择
编译后load
六、接线
此时连接一个led到你自己设置的引脚,笔者设置的是A9,程序里一直循环令A9赋值1和0,高低电位跳变。
如果LED阳极接A9,阴极必须接GND
如果LED阴极接A9,阳极必须接3.3V
上面使用的是HAL_GPIO_WritePin()
接下来使用HAL_GPIO_TogglePin()
注释的快捷键设置
去到HAL_GPIO_TogglePin()的定义,看看需要什么变量
main.c
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"
int main(void)
{
HAL_Init(); /* 初始化HAL库 */
sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */
delay_init(72); /* 延时初始化 */
led_init(); /* LED初始化 */
while(1)
{
// HAL_GPIO_WritePin(GPIOA,GPIO_PIN_9,GPIO_PIN_SET); /* PA9置1 */
//
// delay_ms(500);
// HAL_GPIO_WritePin(GPIOA,GPIO_PIN_9,GPIO_PIN_RESET); /* PA9置0 */
// delay_ms(500);
HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_9);
delay_ms(1000);
}
}
参考
【STM32入门教程-2023版 细致讲解 中文字幕】 https://www.bilibili.com/video/BV1th411z7sn/?share_source=copy_web&vd_source=be33b1553b08cc7b94afdd6c8a50dc5a
【【正点原子】手把手教你学STM32 HAL库开发全集【真人出镜】STM32入门教学视频教程 单片机 嵌入式】 https://www.bilibili.com/video/BV1bv4y1R7dp/?p=4&share_source=copy_web&vd_source=be33b1553b08cc7b94afdd6c8a50dc5a