STM32MP157(实验八)——通用定时器us延时

STM32MP157(实验八)——通用定时器us延时,第1张

STM32MP157(实验八)——通用定时器us延时

文章目录
  • 设计需求
  • 一、基础知识
  • 二、硬件设计
  • 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 
工程目录结构

运行结果

开发板显示也没有问题,两个灯一起闪烁。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5698625.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存