STM32CubeMx设定
基本定时器配置
本次使用单片机为STM32F103ZET6,打开STM32CubeMx,跳转到定时器界面:
找到基本定时器并将其激活,可以将鼠标悬停在选项上查看属于什么定时器,或者打开相应的技术手册查看,这里需要设置定时器更新中断时间,可根据一下公式计算:
Tout= ((arr+1)*(psc+1))/Tclk,这里的参数对应:Tout为溢出时间,arr为自动重装载值,psc为预分配系数以及Tclk为输入时钟频率,其中arr、psc以及Tclk可以在STM32CubeMx中查看并设置,最终计算出Tout,这里设置时间为1s,根据公式首先会先带入psc,我们设置psc为72-1,Tclk为72M,就可以算出arr为10000-1,即下图:
输入时钟频率我们可以在系统时钟树配置中查看:
基本定时器中断设置
打开基本定时器中断并进行配置抢占优先级和响应优先级
可根据自身需求设置,这里设置为0,0。
工程生成及代码编写
工程生成
生成工程后我们可以看到左边已经有了相关的代码:
在用到基本定时器中断有以下几个比较重要的函数:
void MX_TIM6_Init(void); //基本定时器6初始化及配置
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle); //相关时钟使能及NVIC中断配置
HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim);//使能更新中断函数
void TIM6_IRQHandler(void); //定时器6中断处理服务函数
void HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim); //HAL库定时器公共服务处理函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim); //定时器溢出中断回调函数
接下来就是如何使用这些函数:
定时器6初始化及配置
打开tim.c文件即可查看到初始化相关函数:
我们在STM32CubeMx中的配置,在keil中已经一键生成了代码,需要做的就是加入使能更新中断函数:
HAL_TIM_Base_Start_IT(&htim6); //配置的基本定时器为定时器6
中断回调函数编写
使能了定时器中断后,下一步就是编写中断回调函数,功能比较简单,就是翻转IO口的电平即可控制灯的亮灭:
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin);
}
这里的参数参考板子上相关控制LED灯的IO口即可。
main函数
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface 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_TIM6_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
这里的main函数我们不需要编写,STM32CubeMx已经帮我们生成好了,至此,我们所需要实现的通过基本定时器实现每秒翻转一次LED的亮灭功能已经实现。