- 设计需求
- 一、基础知识
- 二、硬件设计
- STM32CubeIDE开发
- MX设置
- 代码设计
- 工程目录结构
- 运行结果
设计需求
这里假设需求为使用通用定时器,得到一个us级别的延时
一、基础知识
HAL库提供了一个毫秒级的延时函数“HAL_Delay()”,它也是基于SysTick。有些应用场合可能需要微秒级别的延时,该函数就不能满足我们的需求,因此这里利用定时器,自己创建一个us级延时
STM32MP157的TIM有14个,不同的定时器精度不同,这里使用TIM5,精度位32位,可以从0计数到2^32.
二、硬件设计TIM不涉及电路设计
STM32CubeIDE开发 MX设置
200MHz就是1秒钟,计数200000000次。
driver_tim_us.h
#include "driver_tim_us.h" #include "stm32mp1xx_hal_tim.h" volatile uint16_t tickend=0;//设置定时器周期满的标志位 //启动定时器函数 void us_timer_delay(uint32_t t){ uint32_t counter=0; uint32_t autoreload=200*t-1; //200MHz表示1us 计数200次,对应数字就是200-1,tus就是200*t-1; tickend=0;//标志位置0 HAL_TIM_base_Stop_IT(&htim5);//先暂停计数,因为我要改变周期的计数值了 __HAL_TIM_SET_AUTORELOAD(&htim5,autoreload);//装载计数 __HAL_TIM_SET_COUNTER(&htim5,counter);//设置计数初始值 HAL_TIM_base_Start_IT(&htim5);//开始计数 while(!tickend);//等待中断处理 } void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){ if(htim->Instance==TIM5){ tickend=1; HAL_TIM_base_Stop_IT(&htim5);//停止计数 } }
driver_led.h
#ifndef DRIVER_LED_H_ #define DRIVER_LED_H_ #include "main.h" #include "stm32mp1xx_hal.h" #define LED_GREEN_ON() HAL_GPIO_WritePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin, GPIO_PIN_RESET); #define LED_GREEN_OFF() HAL_GPIO_WritePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin, GPIO_PIN_SET); #define LED_YELLOW_ON() HAL_GPIO_WritePin(LED_YEELOW_GPIO_Port, LED_YEELOW_Pin, GPIO_PIN_RESET); #define LED_YELLOW_OFF() HAL_GPIO_WritePin(LED_YEELOW_GPIO_Port, LED_YEELOW_Pin, GPIO_PIN_SET); #endif工程目录结构 运行结果
开发板显示也没有问题,两个灯一起闪烁。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)