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秒钟闪烁一次。