STM32 定时器的4通道计数器应用

发布者:技术旅人最新更新时间:2016-07-26 来源: eefocus关键字:STM32  定时器  计数器 手机看文章 扫描二维码
随时随地手机看文章
通用定时器确实比较强悍,功能极多我也比较晕

 此为在不牵扯PWM 与 DMA下像C51那样计数点灯。

 当然你要配置一些IO口作为点灯用这里就不详细说了。

 

就如

#defineLED2_ON  GPIO_ResetBits(GPIOD,GPIO_Pin_7)
#define LED2_OFF GPIO_SetBits(GPIOD,GPIO_Pin_7)

这样的。

 

然后启用通用定时器2设置它的中断等3.0的库;

  //Timer2中断*//

void NVIC_Configuration(void)
{
 NVIC_InitTypeDef NVIC_InitStructure;
 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
 NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;//TIM2全局中断3.0的
 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority= 0;
 NVIC_InitStructure.NVIC_IRQChannelSubPriority =0;
 NVIC_InitStructure.NVIC_IRQChannelCmd =ENABLE;
 NVIC_Init(&NVIC_InitStructure);

}

 //TIM2 clock enable

 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

 TIM_OCInitTypeDef TIM_OCInitStructure;

 

 TIM_TimeBaseStructure.TIM_Period =8000;   //计数值  
 TIM_TimeBaseStructure.TIM_Prescaler =7200-1;    //预分频,此值+1为分频的除数
 TIM_TimeBaseStructure.TIM_ClockDivision =0x0;   //设置时钟分割
 TIM_TimeBaseStructure.TIM_CounterMode =TIM_CounterMode_Up;  //向上计数


********************************************************************************************** 
 TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);

TIM_ClockDivision,设置时钟分割

它就是RCC控制寄存器1(TIMx_CR1)的位9:8(CKD),具体含义如下:

CKD[1:0]: 时钟分频因子
定义在定时器时钟(CK_INT)频率与数字滤波器(ETR,TIx)使用的采样频率之间的分频比例。
0x00:tDTS = 1 x tCK_INT
0x01:tDTS = 2 xtCK_INT
0x10:tDTS = 4 xtCK_INT

TIM_TimeBaseStructure中应该还有一个更新报告  uint8_t TIM_RepetitionCounter;不管他也行。

  72M/7200=10K分频后的结果就是,定时器速度为10K.计数器为向上计数,8000 溢出,所以溢出时间就是
8000/10K=0.8秒.而捕获的比较值则为:
u16 CCR1_Val = 4000;
u16 CCR2_Val = 2000;
u16 CCR3_Val = 1000;
u16 CCR4_Val = 500;
也就是说,在定时器开始计数后,第一通道的中断发生在4000/10k=0.4秒,第二通道是0.2,第三
通道是0.1,第四是0.05*/

************************************************************************************************ 


 

   //比较设置*/              

  TIM_OCInitStructure.TIM_OCMode =TIM_OCMode_Inactive;       //输出比较非主动模式

  TIM_OCInitStructure.TIM_OCPolarity =TIM_OCPolarity_High;  //极性为正

    //比较通道1*/           
  TIM_OCInitStructure.TIM_Pulse =CCR1_Val;  //就是4000装入捕获比较寄存器的脉冲值

  TIM_OC1Init(TIM2,&TIM_OCInitStructure);             //写入配置
  TIM_OC1PreloadConfig(TIM2,TIM_OCPreload_Disable);  //禁止OC1重装载,其实可以省掉这句,因为默是

 //4路都不重装的.

********************************************************************************************

typedef struct
{
  uint16_t TIM_OCMode; //选择定时器模式比较多有的功能也比较相似
  uint16_t TIM_OutputState; //使能通道 为了和2.0兼容吧我不管他
  uint16_tTIM_OutputNState; //失能??
  uint16_tTIM_Pulse;      //待装入捕获比较寄存器的脉冲值
 uint16_t TIM_OCPolarity;  //输出极性
  uint16_t TIM_OCNPolarity; //???
  uint16_tTIM_OCIdleState;  //???
  uint16_t TIM_OCNIdleState; //???不懂得不管用默认就好
} TIM_OCInitTypeDef;

 

******************************************************************************************** 

 

    //比较通道2 /      
 TIM_OCInitStructure.TIM_Pulse =CCR2_Val; 
 
 TIM_OC2Init(TIM2,&TIM_OCInitStructure);
 TIM_OC2PreloadConfig(TIM2,TIM_OCPreload_Disable);
 
   //比较通道3 /         
 TIM_OCInitStructure.TIM_Pulse =CCR3_Val; 
 
 TIM_OC3Init(TIM2,&TIM_OCInitStructure);
 TIM_OC3PreloadConfig(TIM2,TIM_OCPreload_Disable);
 
 //比较通道4 /    
 TIM_OCInitStructure.TIM_Pulse =CCR4_Val; 
 
 TIM_OC4Init(TIM2,&TIM_OCInitStructure);
 TIM_OC4PreloadConfig(TIM2,TIM_OCPreload_Disable);

 

 

 //使能预装载/
 TIM_ARRPreloadConfig(TIM2,ENABLE);  //这个历程中没有软件修改寄存器所以没他也行
  //预先清除所有中断位防止一启用就有中断从九九那抄的/
 TIM_ClearITPendingBit(TIM2, TIM_IT_CC1 |TIM_IT_CC2 | TIM_IT_CC3 | TIM_IT_CC4|TIM_IT_Update);

  //4个通道和溢出都配置中断/
 TIM_ITConfig(TIM2, TIM_IT_CC1 | TIM_IT_CC2 |TIM_IT_CC3 | TIM_IT_CC4|TIM_IT_Update, ENABLE);
  //允许TIM2开始计数 /
 TIM_Cmd(TIM2, ENABLE);

 

服务中断函数比较简单直接抄来

 

void TIM2_IRQHandler(void)
{
 if (TIM_GetITStatus(TIM2, TIM_IT_CC1) !=RESET)
 {
  //必须清空标志位/*/
  TIM_ClearITPendingBit(TIM2,TIM_IT_CC1);

   //点亮LED5 一定要是中文的 不然中间的 内容就不见了 本想大家移植到自己的作品中方便 看来SINA不可这样用

关键字:STM32  定时器  计数器 引用地址:STM32 定时器的4通道计数器应用

上一篇:AD7714+STM32使用注意事项
下一篇:MDK4.0使用J-Link方法

推荐阅读最新更新时间:2024-03-16 15:01

意法半导体在 GitHub网站上开设 STM32 Hotspot社区
意法半导体在 GitHub网站上开设 STM32 Hotspot社区 发布内部项目的可信代码 2022 年 10 月 19 日,中国——意法半导体在GitHub网站上创建了 STM32 Hotspot社区,为开发者寻找专业开发的STM32 微控制器嵌入式软件项目提供了一个新场所。STM32 Hotspot 包含意法半导体内部工程师原本是为展品和概念验证模型等用途开发的非产品化代码。 意法半导体通常不会与外部分享此类代码示例。意法半导体已经为用户提供大量的 STM32 参考代码,现在STM32 Hotspot又将内部项目代码分享供给更广泛的开发者社区,助力他们创造更多的产品附加值。通过意法半导体GitHub社区获取软
[单片机]
意法半导体在 GitHub网站上开设 <font color='red'>STM32</font> Hotspot社区
【实验一】跑马灯实验
一、实验目的 通过控制战舰STM32开发板上的两个LED灯:DS0和DS1交替闪烁,实现类似跑马灯的效果。 二、STM32 IO简介 STM32 的每个 IO 端口都有 7 个寄存器来控制。他们分别是:配置模式的 2 个 32 位的端口配置寄存器 CRL 和 CRH; 2 个 32 位的数据寄存器 IDR 和 ODR; 1 个 32 位的置位/复位寄存器BSRR;一个 16 位的复位寄存器 BRR; 1 个 32 位的锁存寄存器 LCKR。 8种模式: 1、 输入浮空 2、 输入上拉 3、 输入下拉 4、 模拟输入 5、 开漏输出 6、 推挽输出 7、 推挽式复用功能 8、 开漏复用功能 IO 操作步骤:
[单片机]
STM32 上使用 printf 输出函数
如果要实现在串口 或者 LCD 上显示,必须重定义标准库函数里调用的与输出设备相关的函数。 如果使用 printf 输出到串口,需要将 fputc 里面的输出指向串口,这一过程就叫重定向。 那么如何让 STM32 使用 printf 函数呢?只需要将 fputc 里面的输 出指向 STM32 串口即可。 int fputc(int ch,FILE *p) //函数默认的,在使用 printf 函数时自动调用 { USART_SendData(USART1,(u8)ch); while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET); return ch;
[单片机]
<font color='red'>STM32</font> 上使用 printf 输出函数
stm32的RTC操作
分为两个文件: rtc.c /******************************************************************************* * 文件名 :rtc.c * 描述 :wit_yuan * 论坛 : **********************************************************************************/ #include rtc.h #include stdio.h #include misc.h uint8_t const *WEEK_STR = { 日 , 一 , 二 , 三 , 四 , 五
[单片机]
STM32进入睡眠模式下的GPIO配置参考
1. GPIO内部电路图 1.根据设备原理图查看IO外部引脚连接电路,闲置状态为低电平时,设置为下拉输入;闲置状态为高电平时,设置为上拉输入;闲置状态为悬空时设置为模拟输入;输出引脚根据功能需要设置就行 原因:当IO通过外围电路电阻接地被拉低时,如果设置为上拉输入,则在芯片内部的上拉电阻和外围的下拉电阻构成回路,电流损耗取决于这两个电阻;当IO通过外围电路电阻接电源被拉高时,则在芯片内部的下拉电阻和外围的上拉电阻构成回路,电流损耗也取决于这两个电阻;当悬空时,斯密特触发器是打开的,要判断输入的是高电平还是低电平,需要一点电流损耗,但是设备模拟输入,这个触发器是关闭的 --------------------- 假设你的这个GP
[单片机]
<font color='red'>STM32</font>进入睡眠模式下的GPIO配置参考
STM32之FSMC的液晶使用
经过这两天的学习液晶,对STM32的FSMC有了初步的了解。虽然遇到了一些问题,但经过不懈的努力,都一一的解决了,接下来我就使用FSMC可能遇到的问题进行说明。希望能对大家的学习有所帮助。 一、端口配置 1、 由于FSMC写NOR时序与8080接口的时序十分相识,因此我们采用模拟8080时序, 2、 STM32的引脚图如图所示。 3、根据上图我们可以得出,FSMC的数据端口D 如下 4、我们使用的是 FSMC 的信号线 NE1 作为控制 8080 的 CSX 片选信号,所以我们把本成配置为 FSMC_Bank1_NORSRAM1 (NE1 片选BANK1)。由上图得FSMC-NE1 ==PD7
[单片机]
STM32标准库中DMA配置详解 (标准库版)
写博客Mark下自己对STM32中DMA功能的一些分析: 先看上图中下左侧的偏移地址,偏移地址是相对于DMA1_BASE的相对地址。查表可得DMA1_BASE的实际物理地址是:0x4002 0000 .故我们可以得出这些寄存器的实际地址是什么。实际上我们对寄存器配置的时候也是对这几个寄存器值进行修改。 DMA_ISR: 0x4002 0000 DMA_IFCR 0x4002 0004 DMA_CCR1: 0x4002 0008 DMA_CNDTR1: 0x4002 000C DMA_CPAR1: 0x4002 0010 DMA_CMAR1: 0x4002 0014 接下来,我们去STM32的程序
[单片机]
<font color='red'>STM32</font>标准库中DMA配置详解 (标准库版)
80C51单片机的定时计数器的结构和工作原理
单片机怎么学,先从哪入手开始学,怎么开始入门 无论是对于新手还是已经在行内的朋友,学习单片机技术,实战动手能力十分重要,如果只知道从网络上的视频以及配套教材来入手开始学,很肯定的说,你永远也学不会。为何?单片机的学习最重要的一点是需要去动手实战实操,单单只看培训教材,也许看的时候能懂一些,但过了一段时间就会遗忘得一干二净,中国有句成语交“纸上谈兵”,经常用来嘲讽一些完全没有实践过的人,单凭从书上了解的知识就胸有成竹的长篇大论。 在这里建议大家,一定要给自己构建一个合适的动手实战试验场所,结合具体的实操对象就很容易理解单片机的电路组态原理,以及理解单片机的程序编制原理,对于入行不深的人,建议给自己出一道居家智能化的物联网课题,采
[单片机]
80C51单片机的定时<font color='red'>计数器</font>的结构和工作原理
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved