OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 20139|回复: 9

想问一下tim1的RCR 寄存器

[复制链接]

6

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2013-2-13
在线时间
0 小时
发表于 2013-8-25 11:34:37 | 显示全部楼层 |阅读模式

TIM_RepetitionCounter(TIM1_RCR)=0,每次向上溢出都产生更新事件
如果 TIM_RepetitionCounter = 1;那么是不是每两次溢出产生一次中断,,但是我用软件仿真,发现好像有点问题,根本没起任何作用。

程序如下:

#include "timer.h"
#include "led.h"
//////////////////////////////////////////////////////////////////////////////////  
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK战舰STM32开发板
//定时器 驱动代码   
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//修改日期:2012/9/3
//版本:V1.0
//版权所有,盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2009-2019
//All rights reserved  
//////////////////////////////////////////////////////////////////////////////////    

//通用定时器3中断初始化
//这里时钟选择为APB1的2倍,而APB1为36M
//arr:自动重装值。
//psc:时钟预分频数
//这里使用的是定时器3!
void TIM3_Int_Init(u16 arr,u16 psc)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //时钟使能
TIM_DeInit(TIM1);
//定时器TIM3初始化
TIM_ClearITPendingBit(TIM1, TIM_FLAG_Update); //清中断
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0xf5;这个数
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
 
TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断

//中断优先级NVIC设置
NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;  //TIM3中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器

 TIM_SetCounter(TIM1,0);
 TIM_ClearITPendingBit(TIM1, TIM_FLAG_Update); //清中断
TIM_Cmd(TIM1, ENABLE);  //使能TIMx  
}
//定时器3中断服务程序
void TIM1_UP_IRQHandler(void)   //TIM3中断
{
if (TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET)  //检查TIM3更新中断发生与否
{
TIM_ClearITPendingBit(TIM1, TIM_IT_Update  );  //清除TIMx更新中断标志 
LED1=!LED1;
}
}



#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include "timer.h"
//ALIENTEK战舰STM32开发板实验8
//定时器中断实验  
//技术支持:www.openedv.com
//广州市星翼电子科技有限公司 
 int main(void)
 {
 
delay_init();     //延时函数初始化  
NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(9600); //串口初始化为9600
  LED_Init();     //LED端口初始化
LED1 = 0;
TIM3_Int_Init(9999,71);//10Khz的计数频率,计数到5000为500ms

while(1);  
    while(1)
{
LED0=!LED0;
delay_ms(200);   
}  

 
}  




正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-25 22:33:49 | 显示全部楼层
这个功能倒是还没用过,帮顶。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

6

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2013-2-13
在线时间
0 小时
 楼主| 发表于 2013-8-26 20:46:51 | 显示全部楼层
汗,。。。没人回答,。
这个功能实现的是产生一定数量的脉冲,,示波器的第一个脉冲不知道怎么消除,,貌似在一个tim中断内,rcr寄存器不起作用,,所以我用了一个static变量判断。。
软件仿真的图有错,,不知道是不是软件的问题,,还有请问一下,示波器的图为什么是尖峰,,示波器不太会玩,,
代码: 主要的配置就这些,,下面的代码就差一些使能的函数,
void TIM1_PWM_Reg_Config(u16 arr,u16 psc)
{  
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
TIM_OCInitTypeDef  TIM_OCInitStructure;
TIM_BDTRInitTypeDef TIM_BDTRInitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //使能定时器3时钟
  TIM_DeInit(TIM1);
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler = psc; //设置用来作为TIMx时钟频率除数的预分频值 
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0x3;      

TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
//初始化TIM3 Channel2 PWM模式
TIM_ARRPreloadConfig(TIM1, ENABLE);//启用ARR的影子寄存器(直到产生更新事件才更改设置) 
 #if 1
  /* Channel 1, 2,3 and 4 Configuration in PWM mode */
  /*选择定时器输出比较为PWM模式2.在向上计数时,当TIM1_CNT<TIM1_CCR1时,通道1为无效电平。否则为有效电平;
  在向下计数时,当TIM1_CNT>TIM1_CCR1时,通道1为有效电平。否则为无效电平;
如果选择PWM模式1,则相反*/
TIM_OCInitStructure.TIM_OCMode       = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
//选择输出比较状态,以及互不输出比较状态
TIM_OCInitStructure.TIM_OutputState  = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;  
//输出极性和互补输出极性的有效电平为高  
TIM_OCInitStructure.TIM_OCPolarity   = TIM_OCPolarity_High;    
TIM_OCInitStructure.TIM_OCNPolarity  = TIM_OCNPolarity_High;
//选择空闲状态下的非工作状态(MOE=0时,设置TIM输出比较空闲状态) 
TIM_OCInitStructure.TIM_OCIdleState  = TIM_OCIdleState_Set;
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;  


TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);//启用CCR2寄存器的影子寄存器(直到产生更新事件才更改设置)
// TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);
// TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable);
TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable);
//设置通道捕获比较寄存器的脉冲值——占空比为0%                
  TIM_OCInitStructure.TIM_Pulse = 500;
TIM_OC1Init(TIM1, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC3
//设置通道捕获比较寄存器的脉冲值——占空比为0% 
            
  TIM_OCInitStructure.TIM_Pulse = 50;
// TIM_OC2Init(TIM1, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC4
//设置通道捕获比较寄存器的脉冲值——占空比为0%                
  TIM_OCInitStructure.TIM_Pulse = 50;
// TIM_OC3Init(TIM1, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC4
//设置通道捕获比较寄存器的脉冲值——占空比为0% 
//TIM1只有三组相配的互补PWM输出               
  TIM_OCInitStructure.TIM_Pulse = 500;
TIM_OC4Init(TIM1, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC4
    //死区设置  
//设置在运行模式下非工作状态  
TIM_BDTRInitStructure.TIM_OSSRState  = TIM_OSSRState_Enable;    
TIM_BDTRInitStructure.TIM_OSSIState  = TIM_OSSIState_Enable; 
/*写保护:锁定级别为1,不能写入TIM1——BDTR寄存器的DTG/BKE/BKP/AOE位、
  TIM_CR2寄存器的OISx/OISxN位。系统复位后,只能写入一次LOCK位,其内容冻结直至复位。*/   
TIM_BDTRInitStructure.TIM_LOCKLevel  = TIM_LOCKLevel_OFF;    
TIM_BDTRInitStructure.TIM_DeadTime    = 0x5;  //这里调整死区大小0-0xff    
TIM_BDTRInitStructure.TIM_Break = TIM_Break_Enable;   //刹车输入使能
//配置刹车(中止)输入信号特性:高电平有效,允许自动输出
TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_Low;
TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;
 
//TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure); 
       
//TIM1_OC通道输出PWM(一定要加)    
TIM_CtrlPWMOutputs(TIM1, ENABLE);
 #endif

}

示波器:接PA。8


软件:


结论:被软件仿真搞死了,,还有

回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-26 22:00:29 | 显示全部楼层
回复【3楼】1519256298:
---------------------------------
示波器输入耦合方式选择:直流方式
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
发表于 2014-10-16 13:50:27 | 显示全部楼层
原子哥, TIM_TimeBaseStructure.TIM_Prescaler这个值,设置为71或者719会不会不准确了呢?如果我设置7199,那arr得零点几了。
TIM3_Int_Init(155,71);//1MHz的计数频率,从0计数到155为156us
小小蜗牛
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-10-16 23:05:04 | 显示全部楼层
回复【5楼】jiutianshenjian:
---------------------------------
你自己根据需要设置。
分频不是万能的
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
发表于 2014-10-17 09:47:51 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
你的第一句话,就是可以设为71了?不影响准确度
第二句话,目前还不能理解。
小小蜗牛
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-10-18 01:05:53 | 显示全部楼层
回复【7楼】jiutianshenjian:
---------------------------------
可以是71
因为有时候分频也得不到你要的结果啊。

比如我要分频100万,那么明显无能为力...
最大就是65536.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
发表于 2014-10-18 09:23:58 | 显示全部楼层
 回复【8楼】 正点原子 :
---------------------------------
可以就好啊。
再问个定时器例程中断问题:
TIM_ITConfig(TIM3,TIM_IT_Trigger,ENABLE ); //使能指定的TIM3中断,允许更新中断
原来是update,我换成trigger就不定时触发了。下面的也换成trigger了,但是update就有反应。怎么选择呢?
void TIM3_IRQHandler(void)   //TIM3中断
{
    if (TIM_GetITStatus(TIM3, TIM_IT_Trigger) != RESET)  //检查TIM3更新中断发生与否
    {
            TIM_ClearITPendingBit(TIM3, TIM_IT_Trigger);  //清除TIMx更新中断标志 
            GetAdc();
    }
}
小小蜗牛
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-10-18 23:36:07 | 显示全部楼层
回复【9楼】jiutianshenjian:
---------------------------------
没用过这个触发中断。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-30 06:50

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表