STM32学习_HAL库_LED闪烁

软件下载与激活

【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); 
    }
}

 

编译后

 http://t.csdnimg.cn/UuxX1

有SWDIO


 

确定选型

再选择

编译后load 

六、接线 

此时连接一个led到你自己设置的引脚,笔者设置的是A9,程序里一直循环令A9赋值1和0,高低电位跳变。

如果LED阳极接A9,阴极必须接GND

如果LED阴极接A9,阳极必须接3.3V

上面使用的是HAL_GPIO_WritePin()

接下来使用HAL_GPIO_TogglePin()

注释的快捷键设置

http://t.csdnimg.cn/soC8j

去到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

http://t.csdnimg.cn/UuxX1

  • 23
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您演示如何使用STM32的定时器和HAL库来设计LED闪烁效果。 首先,您需要在STM32CubeMX中配置您的硬件资源,并生成HAL库代码。确保您已经将LED连接到正确的GPIO引脚上。 接下来,您需要选择一个定时器,并将其配置为适当的模式。在这个例子中,我们将选择TIM6,并将其配置为基本定时器模式。您可以通过以下代码来实现: ``` TIM_HandleTypeDef htim6; void MX_TIM6_Init(void) { TIM_MasterConfigTypeDef sMasterConfig = {0}; htim6.Instance = TIM6; htim6.Init.Prescaler = 0; htim6.Init.CounterMode = TIM_COUNTERMODE_UP; htim6.Init.Period = 999; if (HAL_TIM_Base_Init(&htim6) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim6, &sMasterConfig) != HAL_OK) { Error_Handler(); } } ``` 在这个例子中,我们将TIM6的时钟预分频器设置为0,使得它的时钟频率等于系统时钟频率。然后,我们将其配置为向上计数模式,并将其周期设置为999,这将使定时器每1ms触发一次中断。 接下来,我们需要在中断处理程序中切换LED的状态。我们可以通过以下代码来实现: ``` void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim->Instance == TIM6) { HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); } } ``` 在这个例子中,我们检查定时器实例是否是TIM6,如果是,我们将切换LED的状态。 最后,我们需要启动定时器。我们可以通过以下代码来实现: ``` HAL_TIM_Base_Start_IT(&htim6); ``` 在这个例子中,我们使用HAL_TIM_Base_Start_IT函数启动TIM6,并在每个定时器周期结束时触发一个中断。 现在,您已经成功地使用STM32的定时器和HAL库来设计LED闪烁效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值