qt 定时器累加值_零基础入门单片机定时器详解

一、基本定时器介绍

在STM32中,基本定时器有TIM6、TIM7等。基本定时器主要包含时基单元,提供16位的计数,能计数0~65535。基本定时器除了计数功能以外,还能输出给DAC模块一个TRGO信号。基本定时器框图如下:

8b0e44bd9c538d52a6fe8cc3ae1070b4.png

二、时基单元介绍

STM32的所有定时器都具备时基单元,时基单元的功能就是简单的计数,即计数时钟源TMxCLK的脉冲个数,这个时钟源来至APB1总线。高级和通用定时器还可以使用其他的时钟源进行计数,在高级定时器和通用定时器中会详细介绍。在基本定时器框架中可知时基单元包含如下三个部分:

1.ARR 自动重装载寄存器

2.CNT 计数器

3.PSC 预分频器

基本定时器的定时(计数)功能配置如下:

void TIM6_IRQHandler(void)

{

static int counter = 0;

if(TIM_GetITStatus(TIM6,TIM_IT_Update))

{

//在设置TIM_SelectOnePulseMode(TIM6,TIM_OPMode_Single);后中断进去两次

TIM_ClearITPendingBit(TIM6,TIM_IT_Update);

}

}

//基本定时器

void TIM6_Configuration()

{

TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;

NVIC_InitTypeDef NVIC_InitStruct;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE); //时钟使能

TIM_TimeBaseInitStruct.TIM_Period = 10 -1;

TIM_TimeBaseInitStruct.TIM_Prescaler = 72;

TIM_TimeBaseInitStruct.TIM_ClockDivision = 0;

TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;

TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;

TIM_TimeBaseInit(TIM6,&TIM_TimeBaseInitStruct);// TIMx->EGR.UG

NVIC_InitStruct.NVIC_IRQChannel = TIM6_IRQn;

NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;

NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;

NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;

NVIC_Init(&NVIC_InitStruct);

TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE);

TIM_ClearITPendingBit(TIM6,TIM_IT_Update);

// TIM_SelectOnePulseMode(TIM6,TIM_OPMode_Single);//如需配置单脉冲模式,开启此注释

TIM_ARRPreloadConfig(TIM6,ENABLE);

TIM_Cmd(TIM6,ENABLE);//CEN 位

TIM_ClearITPendingBit(TIM6,TIM_IT_Update);

}

值得说明的是,基本定时器还支持单脉冲模式,配置单脉冲模式如代码注释即可。单脉冲模式要注意的是在定时器溢出两次后才关闭定时器,即失能定时器。在代码中,配置有中断,在单脉冲模式下,可以清晰的看到进入定时器中断2次。

三、定时器信号输出

定时器的信号输出与定时器中的控制寄存器2(TIM6->CR2)的MMS位相关,基本定时器输出的信号只能用作DAC的触发,而高级定时器、通用定时器的输出信号可以触发定时器以及DAC,具体细节这里不细说。定时器信号输出的例子可以参考我的博文http://blog.csdn.net/quentinecho/article/details/79068001。这个例子中使用TIM6输出的TRGO信号启动了DAC产生一个三角波,当然其他的DAC触发方式也可以产生一个三角波。

#include "stm32f10x.h"

#include "stm32f10x_rcc.h"

#include "system_stm32f10x.h"

#include "stm32f10x_dac.h"

#include "stm32f10x_gpio.h"

#include "stm32f10x_tim.h"

/*DAC输出 = Vref x (DOR/4095)*/

//DAC的两个通道可以配置使用

//相同触发源/不同触发源

//同时触发/独立触发 DAC_DualSoftwareTriggerCmd函数设置软件同时触发

//使用波形发生器/不使用波形发生器

//使用三角波发生器/使用噪声发生器/不使用波形发生器

//设置相同DAC_LFSRUnmask_TriangleAmplitude的值/设置不相同DAC_LFSRUnmask_TriangleAmplitude的值

//等等以上各种情况可以任意组合,互不影响。

void DAC_Configuration(void)

{

GPIO_InitTypeDef GPIO_InitStruct;

DAC_InitTypeDef DAC_InitStruct;

//第一步 使能时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC,ENABLE);

//第二步 配置参数

/*一旦使能DACx通道,相应的GPIO引脚就会自动与DAC的模拟输出相连,为了避免寄生的干扰和额外的功耗,引脚PA4/PA5在之前应当设置成“模拟输入”

注意是“模拟输入“,因为STM32中没有模拟输出,所以虽然PA4 PA5是输出模拟信号,也只能设置成GPIO_Mode_AIN*/

GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;

GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;

GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOA,&GPIO_InitStruct);

GPIO_SetBits(GPIOA,GPIO_Pin_4 | GPIO_Pin_5) ;//PA.4 PA.5输入高 ,上拉输入起抗干扰的作用

// /*DAC 通道1 PA4 产生噪声*/

// DAC_InitStruct.DAC_WaveGeneration = DAC_WaveGeneration_Noise;

// DAC_InitStruct.DAC_Trigger = DAC_Trigger_T6_TRGO;//DAC_Trigger_T6_TRGO;

// DAC_InitStruct.DAC_OutputBuffer = DAC_OutputBuffer_Disable;//输出缓存可以用来减少输出阻抗,无需外部运放即可直接驱动外部负载

// DAC_InitStruct.DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bits10_0;//每次触发计算一次LSFR算法,并将得到的值再加上DAC_DHRx的数值,去掉溢出位后写入DAC_DORx寄存器,输出特定的电压

// DAC_Init(DAC_Channel_1,&DAC_InitStruct);//参与LSFR算法的位数由DAC_LFSRUnmask_TriangleAmplitude来确定,DAC_LFSRUnmask_Bits10_0数值表示有10位参与LSFR计算

/*DAC 通道1 PA4 普通数模转换*/

DAC_InitStruct.DAC_WaveGeneration = DAC_WaveGeneration_None;//关闭波形发生器

DAC_InitStruct.DAC_Trigger = DAC_Trigger_T6_TRGO;//DAC_Trigger_Software/DAC_Trigger_Ext_IT9

DAC_InitStruct.DAC_OutputBuffer = DAC_OutputBuffer_Disable;//输出缓存可以用来减少输出阻抗,无需外部运放即可直接驱动外部负载

DAC_InitStruct.DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bit0;//该参数与噪声/三角波发生器相关,普通DAC转换是设置为0即可

DAC_Init(DAC_Channel_1,&DAC_InitStruct);

/*DAC 通道2 PA5 产生三角波*/

DAC_InitStruct.DAC_WaveGeneration = DAC_WaveGeneration_Triangle;

DAC_InitStruct.DAC_Trigger = DAC_Trigger_T6_TRGO;

DAC_InitStruct.DAC_OutputBuffer = DAC_OutputBuffer_Disable;

DAC_InitStruct.DAC_LFSRUnmask_TriangleAmplitude = DAC_TriangleAmplitude_4095;//内部的三角波计数器每次触发时候之后累加1,该计数器的值与DAC_DHRx的数值相加,去掉溢出位后写入DAC_DORx寄存器,输出电压

DAC_Init(DAC_Channel_2,&DAC_InitStruct);//三角波计数器的最大值由DAC_LFSRUnmask_TriangleAmplitude来确定,当计数器达到这个最大值,然后三角波计数器开始递减

//第三步 使能器件

//DAC_SetDualChannelData(DAC_Align_12b_R,4095,0);等价于DAC_SetChannel1Data(DAC_Align_12b_R, 4095); DAC_SetChannel2Data(DAC_Align_12b_R, 0);

/*DAC 通道1 PA4 使能*/

DAC_SetChannel1Data(DAC_Align_12b_R, 4095); //12位右对齐数据格式设置DAC值 设置值最大为4095,设置成4096则溢出,DORx即为0

DAC_Cmd(DAC_Channel_1, ENABLE); //使能DAC1

/*DAC 通道2 PA5 使能*/

DAC_Cmd(DAC_Channel_2, ENABLE); //使能DAC1

DAC_SetChannel2Data(DAC_Align_12b_R, 0); //12位右对齐数据格式设置DAC值

}

//基本定时器

void TIM6_Configuration()

{

TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;

//第一步 使能时钟

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE); //时钟使能

//第二步 配置参数

TIM_TimeBaseInitStruct.TIM_Period = 10 -1;

TIM_TimeBaseInitStruct.TIM_Prescaler = 72;

TIM_TimeBaseInitStruct.TIM_ClockDivision = 0;

TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;

TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;

TIM_TimeBaseInit(TIM6,&TIM_TimeBaseInitStruct);// TIMx->EGR.UG

/*TIM6,7可以输出3种类型的TRGO信号

#define TIM_TRGOSource_Reset ((uint16_t)0x0000) //复位 UG

#define TIM_TRGOSource_Enable ((uint16_t)0x0010) //使能 CEN

#define TIM_TRGOSource_Update ((uint16_t)0x0020) //更新事件

*/

TIM_SelectOutputTrigger(TIM6,TIM_TRGOSource_Update);//输出触发TRGO信号 这里TRGO信号就是定时器溢出产生的更新信号

//第三步 使能器件

TIM_Cmd(TIM6,ENABLE);//CEN 位

}

int main()

{

DAC_Configuration();

TIM6_Configuration();

while(1)

{

}

}

看到这里还是没懂的话可以参考这个视频资料

http://www.makeru.com.cn/live/1392_1199.html?s=45051​www.makeru.com.cn

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/550316.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

生成 一个多边形网格的函数

简介 生成一个多边形网格的函数。 三角形面片判断法线方向 顺时针,表示平面方向向下?? 逆时针,表示平面方向向上?? 代码 // AddPolygon.cpp: 定义控制台应用程序的入口点。 ////#include "stdafx.h&qu…

linux系统怎么设置开机密码,Linux_Linux系统怎么设置开机密码?Linux设置开机密码的方法,为了保证Linux系统的安全,应 - phpStudy...

Linux系统怎么设置开机密码?Linux设置开机密码的方法为了保证Linux系统的安全,应该给系统设置开机密码。注意,“开机密码”和“登录密码”是不同的。本文笔者就和大家分享一下“给Linux设置开机密码”的经验,希望能能对大家有所帮…

jvm 安装位置_简单了解JVM

1、JVM的位置:JVM是在操作系统上面的应用软件JVM虚拟机有三种如下:① Sun公司的HotSpot;    ② BEA公司的JRockit;    ③ IBM公司的J9 JVM;java虚拟机属于第一种:2、JVM的体系结构:3、类…

前端安全之 XSS攻击

参看: XSS的原理分析与解剖 前端安全 -- XSS攻击 web大前端开发中一些常见的安全性问题 1、前言 XSS 是面试时,hr提出来给我的,然后大体的浏览一遍,今天才查阅资料大体了解了它。 XSS 攻击:攻击者向HTML页面传入恶意的…

linux设置命令nmui,Linux网络配置及管理

一、IP、网关、路由、掩码网络间主机的通信是通常是基于TCP/IP协议。数据从A主机发送到网络中的B主机,需要通过层层包装及协议转发,最终通过B主机的IP地址定位,B主机才能最终接收到数据。这个过程很复杂,中间数据的处理是通过TCP/…

anaconda新建python2环境安装不了jupyterlab_在Mac下安装anaconda及配置jupyterLab和PyTorch的方法...

在Mac下安装anaconda及配置jupyterLab和PyTorch的方法1、 首先在anaconda官网上下载anaconda包(国内网速度不算太慢)https://www.anaconda.com/products/individual#macos2、 创建一个新的环境,用于Pytorch的学习conda create –name pytorchpython3.7标蓝部分可以换…

图片

转载于:https://www.cnblogs.com/water-1/p/11138418.html

idea 调节背景护眼_夜间用电脑亮瞎眼睛?这份夜间护眼指南来帮你。

题图:来自 Unsplash文/彭宏豪,笔名/安哥拉不知从什么时候起,「头秃」成了网友和周围人口中的一个高频词汇,似乎很多事情都离不了头秃——学到头秃、工作到头秃、熬夜到头秃等等,就连「突然」也渐渐演变成「秃然」。但对…

windows和linux命令的区别,linux和windows命令区别

命令的目的MS-DOSLinuxLinux 的简单实例复制文件copycpcp thisfile.txt /home/thisdirectory转移文件movemvmv thisfile.txt /home/thisdirectory列举文件dirlsLs清除屏幕clsclearClear关闭 shell 提示exitexitExit显示或设置日期datedateDate删除文件delrmrm thisfile.txt把输…

生成一个Cylinder

简介 用到了上一个博客的&#xff0c;AddPolygon。 生成的是一个筒状物体。 代码 // CreateCylinder.cpp: 定义控制台应用程序的入口点。 ////#include "stdafx.h" #include <iostream> #include "AddPolygon.h" #include <OpenMesh/Core/IO/Mesh…

linux下添加apt-get命令,Ubuntu Linux系统下apt-get命令整理

Ubuntu Linux系统下apt-get命令整理首次接触ubuntu&#xff0c;很多命令都需要sudo。尤其是安装命令都需要apt 。这里做个apt命令的简单汇总&#xff0c;方便一来了解下加深印象&#xff0c;二来以便以后使用查阅。常用的APT命令参数&#xff1a;apt-cache search package 搜索…

编写有效用例电子版_剖析用例设计方法的使用

今天给大家讲解的是用例设计方法的使用&#xff0c;在设计用例时该如何应用用例设计方法、设计出覆盖率高的测试用例呢&#xff1f;场景简介&#xff1a;普遍登录页面测试用例设计分析拿到需求&#xff0c;首先要做需求分析。我们看到登录界面有三个测试点&#xff1a;1.账号2.…

一个参数大小写引发的uploadify报错 Syntax error, unrecognized expression: #

上传控件uploadify 报错"Syntax error, unrecognized expression: #" 版本为 uploadify3.2 报错原因&#xff1a;参数ID【hidInfoId】小写错写成了大写。debug过程&#xff1a; ①&#xff1a;报错 "Syntax error, unrecognized expression: #" ②&#xf…

linux切换目录使用命令,linux命令切换目录的使用方法

1.cd - 作用是快速切换到前一个目录&#xff0c;如下:amosliamosli-pc:~$ cd learn/fd/amosliamosli-pc:~/learn/fd$ cd -/home/amosli2.dirs:显示目录栈,列出当前堆栈中保存的目录列表amosliamosli-pc:~/learn/fd$ dirs~/learn/fd说明: dirs的 -p参数可以每行一个目录的形式显…

python小孩的报酬_孩子做了家务,家长该不该支付“酬劳”呢?

现在有一些家长&#xff0c;跟自己的孩子签订“家务劳动劳务合同”&#xff1a;如刷碗一次付2元&#xff0c;扫地一次付2元&#xff0c;取牛奶一次付1元……活干完&#xff0c;经验收合格&#xff0c;结账&#xff0c;现金支付劳务报酬。这些家长认为这样做符合“等价交换”的原…

LinkedHashMap 源码详细分析(JDK1.8)

原文链接&#xff1a;https://www.imooc.com/article/22931转载于:https://www.cnblogs.com/Wbin01/p/11142250.html

linux冷备机怎么切换,linux – 热备用主机vs冷备用主机?

Sobrique explains how the manual intervention causes your proposed solution to be sup-optimal和ewwhite talks about probability of failure of various components.这两个IMO都提出了非常好的观点,应该加以深思熟虑.然而,到目前为止,似乎还有一个问题似乎没有人评论过,…

【Ubuntu日常技巧】Ubuntu命令行设置系统时区、时间

最近折腾手机上安装Ubuntu&#xff0c;发现显示的时间不对&#xff0c;可惜当前的 Date and Time菜单中没法进行时间设置&#xff0c;而且其显示的为London地区的时间&#xff0c;故通过命令行修改之&#xff1b; 1、确定所在时区的编号 可以通过tzselect命令实现&#xff1a; …

linux7 dns正向,Centos 7 搭建DNS正向解析和反向解析

Centos 7 搭建DNS正向解析和反向解析服务的三要素:安装-配置-启动1.使用yum安装DNSyum install bind -y2.修改配置文件vi /etc/named.conf修改以下内容&#xff1a;listen-on port 53 { any; };allow-query { any; };vi /etc/named.rfc1912.zones在末尾添加以下内容:zone "…

python databaseoperate_python开发_python操作mysql数据库

1 #-*- coding: utf-8 -*-2 #python operate mysql database3 importMySQLdb45 #数据库名称6 DATABASE_NAME 7 #host localhost or 172.0.0.18 HOST 9 #端口号10 PORT 11 #用户名称12 USER_NAME 13 #数据库密码14 PASSWORD 15 #数据库编码16 CHAR_SET 1718 #初始化参数1…