OpenEdv-开源电子网

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

关于PWM问题!

[复制链接]

4

主题

13

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2012-3-24
在线时间
0 小时
发表于 2012-4-20 13:19:41 | 显示全部楼层 |阅读模式

我参考原子哥的程序,然后自己写了个,第一次写的时候,配置大多是复制上次定时的代码,所以配置了定时中断(中断向量和中断使能都配置好了)。然后输出波形一直是高电平。把中断向量配置中的中断去掉后才现在正确的波形。
我的问题:为什么开启中断向量后,一直出现高电平?

下面是一直输出高电平的配置
void NVIC_Configuration(void)    //NVIC配置
{
  NVIC_InitTypeDef NVIC_InitStruct;

  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);  //中断组0
  NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0); //中断向量FLASH
  
  NVIC_InitStruct.NVIC_IRQChannel = TIM2_IRQn;
  NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级0 
     NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;   //从优先级0
   NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;    //中断向量使能
  NVIC_Init(&NVIC_InitStruct);
}

void TIM2_Configuration(void)   //1m定时
{
  TIM_TimeBaseInitTypeDef TIM_BaseInitStruct;
  TIM_OCInitTypeDef TIM_OCInitStruct;

  TIM_BaseInitStruct.TIM_Period = 900;  //重载值
  TIM_BaseInitStruct.TIM_Prescaler = 0; //预分频值
  TIM_BaseInitStruct.TIM_ClockDivision = 0; 
  TIM_BaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up; //向上计数0 ~ Period
  TIM_TimeBaseInit(TIM2,&TIM_BaseInitStruct);   //定时器寄存器初始化
 
  TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
  TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
     TIM_OCInitStruct.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值
  TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
 
  TIM_OC2Init(TIM2, &TIM_OCInitStruct);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
  TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);  //使能TIMx在CCR2上的预装载寄存器
 
  TIM_ARRPreloadConfig(TIM2, ENABLE); //使能TIMx在ARR上的预装载寄存器
 
  TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); //TIM中断使能
  TIM_Cmd(TIM2,ENABLE);       //定时器使能
}



下面是输出正确波形的配置
void NVIC_Configuration(void)    //NVIC配置
{
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);  //中断组0
  NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0); //中断向量FLASH
}

void TIM2_Configuration(void)  
{
  TIM_TimeBaseInitTypeDef TIM_BaseInitStruct;
  TIM_OCInitTypeDef TIM_OCInitStruct;

  TIM_BaseInitStruct.TIM_Period = 900;  //重载值
  TIM_BaseInitStruct.TIM_Prescaler = 0; //预分频值
  TIM_BaseInitStruct.TIM_ClockDivision = 0; 
  TIM_BaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up; //向上计数0 ~ Period
  TIM_TimeBaseInit(TIM2,&TIM_BaseInitStruct);   //定时器寄存器初始化
 
  TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
  TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
     TIM_OCInitStruct.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值
  TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
 
  TIM_OC2Init(TIM2, &TIM_OCInitStruct);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
  TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);  //使能TIMx在CCR2上的预装载寄存器
 
  TIM_ARRPreloadConfig(TIM2, ENABLE); //使能TIMx在ARR上的预装载寄存器
  
  TIM_Cmd(TIM2,ENABLE);       //定时器使能
}

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

使用道具 举报

4

主题

13

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2012-3-24
在线时间
0 小时
 楼主| 发表于 2012-4-20 13:25:20 | 显示全部楼层
是不是一中断后,就会重新配置,导致输出一直是高电平?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-4-20 13:46:50 | 显示全部楼层
回复【2楼】藏锋:
---------------------------------
你看看你中断服务函数做了什么工作?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

13

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2012-3-24
在线时间
0 小时
 楼主| 发表于 2012-4-20 16:10:34 | 显示全部楼层
奥,我懂了,原来是我的中断挂起了,没清除中断标志。

谢谢原子哥啊
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-25 15:52

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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