功率监测与控制系统DIY——搭建环境,定时器翻转LED
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并配置工程
第一次打开CMakeLists.txt工程,弹出下面的配置对话框,一般选择Debug类型即可
3 ST-Link固件升级
第一次调试工程,弹出ST-Link固件升级提示,按照下面的提示操作,升级固件通过。
点击右下角的YES开始升级固件
固件升级成功
升级后固件版本号变了
4 用户LED
LED是指用户LED,即板子上的绿色LD2,对应PA5,原理图如下:
4.1 定时器
这里使用定时器1,配置如下:
● 时钟源,选择Internal Clock(TIM1 位于APB2 Timer Clock)
● 预分频为1000-1
● 向上计数模式
● 计数周期10000-1
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 次】
最后使能TIM1的中断,中断类型是TIM1 update interrupt and TIM10 global interrupt,表示定时器溢出产生中断。
5 流程
● 主流程中初始化硬件(GPIO、UART2、TIM1)然后已开启中断的方式启动TIM1
● 在TIM1的溢出中断服务函数中层层调用到HAL_TIM_PeriodElapsedCallback() 函数,计数10 次达到1 秒钟,翻转用户LD2
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);
}
}
}
7 实测演示
7.1 LD2闪烁
板子中心的绿色LD 每隔一秒钟点亮、熄灭一次。
(本文来源于《EEPW》202507)
评论