STM32CubeMX基础例程(小熊派):05.定时器闪烁LED

1、准备开发板

这里我选用了一块网红开发板:”小熊派“,这款板子的人气比较高,还是全国大学生物联网设计竞赛(华为杯)的华为竞赛开发板,我个人也比较喜欢用这款板子,这款板子在放在纸箱吃灰半年之后,被我重新拿了起来,并想借此写博客的机会,整理一下自己的代码。

开发板功能区分布图

在这里插入图片描述

开发板俯视图

在这里插入图片描述

2、STM32CubeMX生成代码

在这里插入图片描述

搜索并选择芯片型号

在这里插入图片描述

配置系统时钟

在这里插入图片描述

配置时钟树

STM32L4的最高主频可达到80M,最后使HCLK = 80Mhz即可:

在这里插入图片描述
在这里插入图片描述

配置GPIO引脚

在这里插入图片描述
修改引脚的用户标签(相当于取另一个新名字)
在这里插入图片描述

配置TIM

定时中断发生的时间计算T:
T = ( arr + 1 )*( psc + 1 ) / 80M 当设置arr = 79,psc = 999时,T = 1000 us = 1 ms

在这里插入图片描述
在这里插入图片描述

生成工程设置

在这里插入图片描述

代码生成配置

在这里插入图片描述

生成代码

在这里插入图片描述

生成成功

在这里插入图片描述

在gpio.h中编写以下代码

/* USER CODE BEGIN Private defines */

typedef enum
{
    
	LED_OFF = 0,
	LED_ON,
	LED_Toggle
        
} LED_ENUM;

#define LED_Set(status) status != LED_Toggle ? HAL_GPIO_WritePin( LED_GPIO_Port, LED_Pin, status != LED_ON ? GPIO_PIN_RESET : GPIO_PIN_SET): HAL_GPIO_TogglePin( LED_GPIO_Port, LED_Pin);	//利用define可以美化和简短我们的代码,知识点就用到了三目运算符的嵌套判断。

/* USER CODE END Private defines */

在tim.h中编写以下代码

/* USER CODE BEGIN Private defines */
extern uint32_t time2Count;
/* USER CODE END Private defines */

/* USER CODE BEGIN Prototypes */
void TIM_Interupt_Enable(void);
/* USER CODE END Prototypes */

在tim.c中编写以下代码


/* USER CODE BEGIN 0 */

uint32_t time2Count;

/* USER CODE END 0 */

/* USER CODE BEGIN 1 */

void TIM_Interupt_Enable(void)
{
	
	__HAL_TIM_ENABLE_IT(&htim2,TIM_IT_UPDATE);		//使能定时器更新中断
	HAL_TIM_Base_Start(&htim2);										//启动定时器
	
}

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	if(htim->Instance == TIM2)
	{
		if(__HAL_TIM_GET_IT_SOURCE(htim,TIM_IT_UPDATE) != RESET)		//如果触发了更新中断
		{
			if(time2Count++ >= 4294967295UL)						//防止数值溢出
			{
				time2Count = 0;
			}
			__HAL_TIM_CLEAR_IT(htim,TIM_IT_UPDATE);			//清除更新中断标志位
		}
	}
}

/* USER CODE END 1 */

在main.c中的main函数中编写以下代码

/* USER CODE BEGIN 1 */
uint32_t led_time = 0;
/* USER CODE END 1 */
/* USER CODE BEGIN 2 */
TIM_Interupt_Enable();
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
    if(time2Count - led_time >= 1000)	//( 1ms * 1000 )计时一秒
    {

        led_time = time2Count;		//记下当前定时器2的数值
        LED_Set(LED_Toggle);		//翻转LED

    }

}
/* USER CODE END 3 */

在这里插入图片描述

4、配置烧录器

在这里插入图片描述
在这里插入图片描述

5、烧录代码

在这里插入图片描述

6、实验现象

​ 控制LED小灯每1秒钟闪烁一次。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值