一、NUCLEO-U575ZI-Q板载LED
从官网下载该开发板原理图文件,可以看到板载有3个可供用户使用的红、蓝、绿LED,分别连接在PG2、PB7、PC7引脚上。
从以上原理图知LED并不直接连接到MCU引脚上,而是通过一个三极管间接控制LED的点亮,这样做的目的能够增强负载的驱动能力。因此以上LED输出引脚输出高电平后三极管导通,于是LED被点亮
二、LED点亮方案
本次点亮开发板LED的方案是使用定时器中断实现,每间隔1秒闪烁LED。这样做的好处是延时的操作交给定时器完成,LED定时点亮只需在定时器产生中断那一刻由CPU介入处理来完成LED的亮灭操作,那么CPU将获得更充余的时间去处理别的事务
2.1
以下使用CubeMX创建项目基本工程
将PG2、PB7、PC7引脚设置为输出模式,同时重命名为LED1_Pin、LED2_Pin、LED3_Pin
使能TIM定时器7,其中MCU的工作主频设置为160MHz,将预分频系数Pre设为16000-1,这里减1的原因是内部寄存器存储的内容是从0开始的,0到16000-1恰好是16000次。计数Counter Period设为10000-1,总的定时溢出周期T为160M/(16000*10000)=1s。
在NVIC嵌套矢量中断管理器处勾选TIM7全局中断
在Code Manager工程管理这进行以上设置
我使用MDK Keil作为开发IDE工具,CubeMX设置完成后点击右上方的Generate Code
2.2 Keil编程
在Keil工程目录下{}Functions打开stm32u5xx_hal_tim.c文件,找到如下两个函数
HAL_TIM_Base_Start_IT
HAL_TIM_PeriodElapsedCallback
第一个函数为定时器中断启动函数,由于希望定时器完成定时的同时需要回调中断函数,因此需要使用该函数。第二个函数为弱定义的定时器回调函数,这个函数需要用户重写来完成相应的中断处理。
在main.c文件重写HAL_TIM_PeriodElapsedCallback函数,添加中断处理代码,即定时1s完成RGB LED闪烁。需要注意的是,keil所有代码的编写需要放在
/* USER CODE BEGIN */
/* USER CODE END */内
否则下一次CubeMX初始化后不在该区域内的代码会全部抹去
在main函数内启动HAL_TIM_Base_Start_IT函数
/* 重写定时器中断回调函数 */ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if(htim->Instance==htim7.Instance){//判断是否定时器7产生计数溢出中断 HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin); HAL_GPIO_TogglePin(LED2_GPIO_Port, LED2_Pin); HAL_GPIO_TogglePin(LED3_GPIO_Port, LED3_Pin); } else{ } }
三、动态修改TIM溢出周期
打开tim.c文件可以看到由CubeMX自动生成的定时器初始化代码,其中Pre、Counter Period与设置值相符。那么现在将Counter Period由9999改为5000-1,根据先前计算公式,得到定时器7的溢出周期为0.5s,因此在程序运行中就能够动态修改定时器的溢出周期
四、实验结果