OpenEdv-开源电子网

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

STM32上如何实现在定时器中断服务程序中更改该定时器下次产生中断的时间

[复制链接]

80

主题

188

帖子

0

精华

高级会员

Rank: 4

积分
680
金钱
680
注册时间
2013-8-16
在线时间
37 小时
发表于 2015-6-8 11:32:16 | 显示全部楼层 |阅读模式
5金钱
大家好,我做了个实验使用定时器溢出中断产生PPM,溢出中断的时间控制输出PPM的IO口高低电平时间。可是智能进入一次中断,后面就进不去了,进而就产生不了PPM波形了。试了好几次都不行,也不知道问题处在哪里,希望知道的朋友可以指点一下,谢谢。下面是我写的代码:
//=================================================
void led_init(void)
{
 GPIO_InitTypeDef  GPIO_InitStructure;
 
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能PB端口时钟

 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //LED0-->B.8 端口配置
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
 GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化GPIOB.8
 GPIO_SetBits(GPIOB,GPIO_Pin_8); //PB.8
}
//=================================================
void io_init(void)
{
  GPIO_InitTypeDef  GPIO_InitStructure;
 
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); //使能PD端口时钟

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //LED0-->D.8 端口配置
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
  GPIO_Init(GPIOD, &GPIO_InitStructure); //根据设定参数初始化GPIOD.8
  GPIO_SetBits(GPIOD,GPIO_Pin_8);
}    
//=================================================
void time3_init(u32 arr,u16 prc)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

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

TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 计数到5000为500ms
TIM_TimeBaseStructure.TIM_Prescaler =prc; //设置用来作为TIMx时钟频率除数的预分频值  10Khz的计数频率  
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
 
TIM_ITConfig(  //使能或者失能指定的TIM中断
TIM3, //TIM2
TIM_IT_Update ,
ENABLE  //使能
);
NVIC_InitStructure.NVIC_IRQChannel = TIM3_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_InitStruct中指定的参数初始化外设NVIC寄存器

TIM_Cmd(TIM3, ENABLE);  //使能TIMx外设
}

void TIM3_IRQHandler(void)   //TIM3中断
{
 
 if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 
  {
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);  //清除TIMx的中断待处理位:TIM 中断源 
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, DISABLE);
T1_Counter=T1_Counter++;
if(T1_Counter>10)
{T1_Counter=10;}

switch(T1_Counter)
{
 case 0:
TIM3->ARR=400;
GPIO_SetBits(GPIOD,GPIO_Pin_8);
      break;

 case 1:
   TIM3->ARR=1000;
GPIO_ResetBits(GPIOD,GPIO_Pin_8);
      break;

 case 2:
  TIM3->ARR=400;
  GPIO_SetBits(GPIOD,GPIO_Pin_8);
      break;

 case 3:
  TIM3->ARR=1000;
  GPIO_ResetBits(GPIOD,GPIO_Pin_8);
      break;

 case 4:
  TIM3->ARR=400;
  GPIO_SetBits(GPIOD,GPIO_Pin_8);
      break;

 case 5:
  TIM3->ARR=1000;
  GPIO_ResetBits(GPIOD,GPIO_Pin_8);
      break;

 case 6:
  TIM3->ARR=400;
  GPIO_SetBits(GPIOD,GPIO_Pin_8);
      break;

 case 7:
  TIM3->ARR=1000;
  GPIO_ResetBits(GPIOD,GPIO_Pin_8);
      break;

      case 8:
  TIM3->ARR=400;
  GPIO_SetBits(GPIOD,GPIO_Pin_8);
      break;

 case 9:
  TIM3->ARR=1000;
  GPIO_ResetBits(GPIOD,GPIO_Pin_8);
      break;

 case 10:
  TIM3->ARR=400;
  GPIO_SetBits(GPIOD,GPIO_Pin_8);
      break;

  }
}
//=================================================
int main(void)
{
  SystemInit();//系统初始化
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断优先级设置
  delay_init();//延时函数初始化
  led_init();//led灯初始化
  io_init();//输出PPM波形的IO口初始化
  time3_init(99999,71);//定时器初始化、定时器中断初始化
  while(1)
  {

  }
}

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

使用道具 举报

2

主题

239

帖子

0

精华

高级会员

Rank: 4

积分
545
金钱
545
注册时间
2015-6-5
在线时间
110 小时
发表于 2015-6-8 13:15:15 | 显示全部楼层
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, DISABLE);

阿ENABLE勒?
回复

使用道具 举报

80

主题

188

帖子

0

精华

高级会员

Rank: 4

积分
680
金钱
680
注册时间
2013-8-16
在线时间
37 小时
 楼主| 发表于 2015-6-8 13:44:45 | 显示全部楼层
对不起,我刚才粘代码的时候粘贴错了,我把代码重新粘贴一下:

//=================================================
void led_init(void)
 {
  GPIO_InitTypeDef  GPIO_InitStructure;
   
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能PB端口时钟

 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //LED0-->B.8 端口配置
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
  GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化GPIOB.8
  GPIO_SetBits(GPIOB,GPIO_Pin_8); //PB.8
 }
 //=================================================
 void io_init(void)
 {
   GPIO_InitTypeDef  GPIO_InitStructure;
   
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); //使能PD端口时钟

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //LED0-->D.8 端口配置
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
   GPIO_Init(GPIOD, &GPIO_InitStructure); //根据设定参数初始化GPIOD.8
   GPIO_SetBits(GPIOD,GPIO_Pin_8); 
 }    
 //=================================================
 void time3_init(u32 arr,u16 prc)
 {
     TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
     NVIC_InitTypeDef NVIC_InitStructure;

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

TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 计数到5000为500ms
 TIM_TimeBaseStructure.TIM_Prescaler =prc; //设置用来作为TIMx时钟频率除数的预分频值  10Khz的计数频率  
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
 
TIM_ITConfig(  //使能或者失能指定的TIM中断
TIM3, //TIM2
 TIM_IT_Update ,
 ENABLE  //使能
);
NVIC_InitStructure.NVIC_IRQChannel = TIM3_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_InitStruct中指定的参数初始化外设NVIC寄存器

TIM_Cmd(TIM3, ENABLE);  //使能TIMx外设
}

void TIM3_IRQHandler(void)   //TIM3中断
{
  
  if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 
   {
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);  //清除TIMx的中断待处理位:TIM 中断源 
     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, DISABLE);
 T1_Counter=T1_Counter++;
 if(T1_Counter>10)
 {T1_Counter=10;}

 switch(T1_Counter)
 {
  case 0:
 time3_init(400,71);
 GPIO_SetBits(GPIOD,GPIO_Pin_8);
       break;

  case 1:
    time3_init(1000,71);
 GPIO_ResetBits(GPIOD,GPIO_Pin_8);
       break;

  case 2:
   time3_init(400,71);
   GPIO_SetBits(GPIOD,GPIO_Pin_8);
       break;

  case 3:
   time3_init(1000,71);
   GPIO_ResetBits(GPIOD,GPIO_Pin_8);
       break;

  case 4:
   time3_init(400,71);
   GPIO_SetBits(GPIOD,GPIO_Pin_8);
       break;

  case 5:
   time3_init(1000,71);
   GPIO_ResetBits(GPIOD,GPIO_Pin_8);
       break;

  case 6:
   time3_init(400,71);
   GPIO_SetBits(GPIOD,GPIO_Pin_8);
       break;

  case 7:
   time3_init(1000,71);
   GPIO_ResetBits(GPIOD,GPIO_Pin_8);
       break;

       case 8:
   time3_init(400,71);
   GPIO_SetBits(GPIOD,GPIO_Pin_8);
       break;

  case 9:
   time3_init(400,71);
   GPIO_ResetBits(GPIOD,GPIO_Pin_8);
       break;

  case 10:
   time3_init(1000,71);
   GPIO_SetBits(GPIOD,GPIO_Pin_8);
       break;
 } 
   }
 }
 //=================================================
 int main(void)
 {
   SystemInit();//系统初始化
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断优先级设置 
  delay_init();//延时函数初始化
  led_init();//led灯初始化
  io_init();//输出PPM波形的IO口初始化
  time3_init(99999,71);//定时器初始化、定时器中断初始化
  while(1)
   {

   }
 }
回复

使用道具 举报

13

主题

611

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1929
金钱
1929
注册时间
2014-10-6
在线时间
625 小时
发表于 2015-6-8 15:57:59 | 显示全部楼层
1楼都给我说了,你在中断中 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, DISABLE);了,定时器怎么再中断?
回复

使用道具 举报

2

主题

239

帖子

0

精华

高级会员

Rank: 4

积分
545
金钱
545
注册时间
2015-6-5
在线时间
110 小时
发表于 2015-6-8 16:00:17 | 显示全部楼层
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
++ TIM_Cmd(TIM3, DISABLE);

加這行試試
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-21 11:18

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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