新闻中心

EEPW首页 > 设计应用 > 功率监测与控制系统DIY——搭建环境,定时器翻转LED

功率监测与控制系统DIY——搭建环境,定时器翻转LED

作者:CoderX9527 时间:2025-07-16 来源:EEPW 收藏

1   任务目标

使用单片机定时器实现1s翻转LED验证开发板时钟晶振是否正确

2   开发工具

STM32支持的开发环境很多,我现在中意下面的组合:

●   STM32CubeMX图形化配置、生成工程;

●   STM32CubeCLT意法半导体退出的一体化、多操作系统支持的命令行工具,主要面向第三发集成开发环境提供商,允许他们在自己的IDE框架内集成对STM32微控制器的支持,包括代码编译、烧录、调试等功能;

●   CLion 一个功能强大的且智能化的C/C++开发环境,具有高效的代码编辑、调试和项目管理能力;

●   STM32CubeIDE/Keil MDK/IAR曾经非常流行的STM32开发环境,这里不做介绍;

分别安装STM32CubeMX/STM32CubeCLT以及CLion,然后再Clion 中新建STM32CubeMX 工程。

在CLion 中第一次新建STM32CubeMX,还需要配置STM32CubeMX和STM32CubeCLT工具路径,下图中(2)出点击“编辑”分别选择对应的路径即可。

●   下图在SDK目录中新建一个工程;

●   STM32CubeMX和STM32CubeCLT工具检测OK;

●   启动STM32CubeMX配置工程,导出CMake工程即可

●   然后CLion打开刚才生成的工程目录即可,自动加载CMakeLists.txt并配置工程

1752639935125569.png

第一次打开CMakeLists.txt工程,弹出下面的配置对话框,一般选择Debug类型即可

1752640005354207.png

3   ST-Link固件升级

第一次调试工程,弹出ST-Link固件升级提示,按照下面的提示操作,升级固件通过。

1752640545820118.png

点击右下角的YES开始升级固件

1752640603164340.png

固件升级成功

1752640635979700.png

升级后固件版本号变了

1752640695296637.png

4   用户LED

LED是指用户LED,即板子上的绿色LD2,对应PA5,原理图如下:

1752640737807653.png

4.1 定时器

这里使用定时器1,配置如下:

●   时钟源,选择Internal Clock(TIM1 位于APB2 Timer Clock)

●   预分频为1000-1

●   向上计数模式

●   计数周期10000-1

1752640797912245.png

4.2 为什么这么设置预分频和计数周期呢?

因为参考手册中STM32F411xx的TIM1位于APB2 Timer clock 上,见下图。而且在时钟树中把APB2 Timer Clock 设置为100 MHz。

所以预分频1000-1把TIM1时钟频率配置为100MHz/1000=100KHz

计数周期10000-1即0.1秒钟产生中断。【要实现1 秒钟翻转LED,需要计数10 次】

1752640875200832.png

1752640905867022.png

最后使能TIM1的中断,中断类型是TIM1 update interrupt and TIM10 global interrupt,表示定时器溢出产生中断。

1752640950730918.png

5   流程

●   主流程中初始化硬件(GPIO、UART2、TIM1)然后已开启中断的方式启动TIM1

●   在TIM1的溢出中断服务函数中层层调用到HAL_TIM_PeriodElapsedCallback() 函数,计数10 次达到1 秒钟,翻转用户LD2

女超人.jpg

6 关键代码

6.1 主函数

int main(void)

{

/* USER CODE BEGIN 1 */

/* USER CODE END 1 */

/* MCU Configuration--------------------------------------------------------*/

/* Reset of all peripherals, Initializes the Flash inter face and the Systick. */

HAL_Init();

/* USER CODE BEGIN Init */

/* USER CODE END Init */

/* Configure the system clock */

SystemClock_Config();

/* USER CODE BEGIN SysInit */

/* USER CODE END SysInit */

/* Initialize all configured peripherals */

MX_GPIO_Init();

MX_USART2_UART_Init();

MX_TIM1_Init(); // 配置定时器TIM1

/* USER CODE BEGIN 2 */

HAL_TIM_Base_Start_IT(&htim1);

//启动定时器TIM1

/*USER CODE END 2 */

/*Infinite loop */

/*USER CODE BEGIN WHILE */

while (1)

{

HAL_Delay(200);

/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */

}

/* USER CODE END 3 */

}

6.2 TIM1定时溢出回调函数

tim.c中新增加一个函数,定时器溢出回调函数HAL_TIM_PeriodElapsedCallback()中实现1秒钟翻转LED2

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)

{

if (htim->Instance == htim1.Instance) 

//确保是特定的定时器实例(例如TIM1、TIM2 等)

{

tim_elapsed_cnt++;

if (tim_elapsed_cnt % 10 == 0) {

HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);

}

}

}

1752641891597046.png

7   实测演示

7.1 LD2闪烁

板子中心的绿色LD 每隔一秒钟点亮、熄灭一次。

(本文来源于《EEPW》


关键词: 202507

评论


技术专区

关闭