历史上的今天
今天是:2024年08月23日(星期五)
2021年08月23日 | stm32定时器的妙用
2021-08-23 来源:eefocus
一、初步了解定时器
stm32定时器时钟图如下:
定时器2-7:普通定时器
定时器1、8:高级定时器

二、使用定时器
以下,我使用定时器7(以下TIM7)去实现计算获取一条指令的运行时间。
1.TIM7初始化
以下初始化函数中
入口参数:TIMx:TIM7,arr:重载值,psc分频值
函数功能:TIM7的定时配置
返回参数:无
说明:和timer7只具有更新中断功能
void Timer7_Init(TIM_TypeDef * TIMx, unsigned short arr, unsigned short psc)
{
TIM_TimeBaseInitTypeDef timer_initstruct;
NVIC_InitTypeDef nvic_initstruct;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM7, ENABLE);
nvic_initstruct.NVIC_IRQChannel = TIM7_IRQn;
timer_initstruct.TIM_CounterMode = TIM_CounterMode_Up;
timer_initstruct.TIM_Period = arr;
timer_initstruct.TIM_Prescaler = psc;
TIM_TimeBaseInit(TIMx, &timer_initstruct);
TIM_ITConfig(TIMx, TIM_IT_Update, ENABLE); //使能更新中断
nvic_initstruct.NVIC_IRQChannelCmd = ENABLE;
nvic_initstruct.NVIC_IRQChannelPreemptionPriority = 1;
nvic_initstruct.NVIC_IRQChannelSubPriority = 1;
NVIC_Init(&nvic_initstruct);
TIM_Cmd(TIMx, ENABLE); //使能定时器
}
2.中断服务函数
产生更新中断时进入
void TIM7_IRQHandler(void)
{
if(TIM_GetITStatus(TIM7, TIM_IT_Update) == SET)
{
TIM_ClearITPendingBit(TIM7, TIM_IT_Update);
timer_info.timer7Out++;
}
}
其中timer_info为结构体,存放更新次数变量(也可以用静态变量)
typedef struct
{
unsigned char timer7Out;
} TIM_INFO;
extern TIM_INFO timer_info;
TIM_INFO timer_info = {0};
3.使用例程
调用初始化函数 Timer6_7_Init(TIM7, 49999, 71);//1us计数一次,50ms中断一次
关闭定时器,清零计数 TIM_Cmd(TIM7, DISABLE); TIM_SetCounter(TIM7, 0);
在指令之前打开定时器,指令完成之后关闭定时器
计算时间,通过中断次数、计数器剩余值判断。
清零
以下代码为计算usart1发送"hello word!"的时间
#include "stm32f10x.h"
#include "delay.h"
#include "usart.h"
#include "timer.h"
void Hardware_Init(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断控制器分组设置
Delay_Init(); //Systick初始化,用于普通的延时
Usart1_Init(9600); //初始化串口1,波特率9600
Timer6_7_Init(TIM7, 49999, 71); //1us计数一次,50ms中断一次
TIM_Cmd(TIM7, DISABLE); //关闭定时器
TIM_SetCounter(TIM7, 0); //清零计数器
}
int main(void)
{
unsigned int time = 0;
Hardware_Init(); //硬件初始化
while(1)
{
TIM_Cmd(TIM7, ENABLE); //使能定时器计时
UsartPrintf(USART1, "rnhello word!!nrn");
TIM_Cmd(TIM7, DISABLE); //关闭定时器
time = timer_info.timer7Out * 50000; //测算时间-中断次数*中断周期
time += TIM_GetCounter(TIM7); //获取当前中断前的剩余值
TIM_SetCounter(TIM7, 0); //清零
timer_info.timer7Out = 0;
UsartPrintf(USART1, "发送时间: %d微秒rn", time);
DelayMs(2500);
}
}
史海拾趣
|
招聘高级硬件开发工程师 本公司提供良好发展机会和平台 我公司是一家主营一卡通智能管理系统、智能卡机具、热工仪表三大类产品,集研发、生产、销售、工程安装维护等全套工程实施,具有雄厚技术、销售实力的民营企业。 公司于2003年11月取得ISO9 ...… 查看全部问答> |
|
在监控系统工程中,针对不同的格式,不知如何去选择硬盘的容量和录像的时间? 实际上这个问题涉及到几个方面,一是视频信号本身的大小,二是压缩后的大小。 现在监控系统通常是用CIF或者D1的分辨率,其象素值如下: & ...… 查看全部问答> |
|
福布斯》网站于周三发布文章称,在各大公司重点开发诸如iPhone 4、Droid X和Evo 4等新一代智能手机的同时,有事实表明,无线行业领域内的部分大公司也被与高端智能手机大相径庭的低价智能手机市场蕴藏的潜力所吸引。这不,高通、诺基亚和宏达电都开 ...… 查看全部问答> |
|
我现在按照以下代码做,该代码没有添加“图片旋转功能”那三行时是可以加载一幅jpb图片到用户区(VC++2005,WinMobile 6.0中文模拟器环境): void CImagingDemoDlg::OnBnClickedRotate() { // TODO: 在此添加控件通知处理程序代码 &nb ...… 查看全部问答> |
|
可能是网络问题,在发送数据过程中连接会自动关闭,可是连接关闭后,服务器并没有自动断开(此时已经不能发送数据了) 为什么呀??如果有谁在做EM200通讯,请与我联系qq:273498325 不胜感激~~~~~… 查看全部问答> |
|
【LED术语】外延生长(epitaxial growth) 在基片上生长结晶轴相互一致的结晶层的技术。用于制作没有杂质和缺陷的结晶层。包括在基片上与气体发生反应以积累结晶层的VPE(气相生长)法、以及与溶液相互接触以生长结晶相的LPE(液相生长 ...… 查看全部问答> |
|
ZigBee无线自组网的LED节能灯控制系统 摘要:设计了一种基于ZigBee无线自组网控制LED节能灯的控制系统。以TI公司的CC2530为主要硬件平台,利用ZigBee Pro协议栈组建了Mesh网络,在上位机上实现了LED灯亮度的调整和环境温度、电压的监 ...… 查看全部问答> |
|
公司简介 概伦电子科技有限公司(ProPlus Electronics, Co. Ltd.)致力于电子设计自动化(EDA)技术解决方案,其目标是成为EDA领域的世界级企业。概伦电子在美国硅谷、北京中关村科技园区和济南国家信息通信国际创新园设有 ...… 查看全部问答> |




