栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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 
工程目录结构

运行结果

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/698497.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号