OpenEdv-开源电子网

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

高级定时器PWM输出模式下可以产生更新中断吗?

[复制链接]

20

主题

74

帖子

0

精华

初级会员

Rank: 2

积分
184
金钱
184
注册时间
2013-3-24
在线时间
6 小时
发表于 2014-12-10 13:26:00 | 显示全部楼层 |阅读模式
5金钱
 想用定时器1产生一路pwm,都是没有问题的,但是开启更新中断后就没有输出了,开启比较中断也是不行,没有输出,难道在PWM输出模式下面不能产生更新中断?非要在比较输出模式下才行?
[mw_shl_code=c,true]/******************************************************************************* * Function Name : Tim1_Init(uint16_t Arr, uint16_t Psc) * Description : ???????¨?±?÷1??????????±???4?·PWM * Input : - * - * - * Output : ×°????999??·?????71,?¨?±?÷1us?????????? * Return : ????TIM1 *******************************************************************************/ void Tim1_Init(uint16_t Arr, uint16_t Psc) { GPIO_InitTypeDef GPIO_InitStructure; //IO?????? TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //TIM1?±?ù?????? NVIC_InitTypeDef NVIC_InitStructure; TIM_OCInitTypeDef TIM_OCInitStructure; //???? RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //????TIM1?±?? RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); //????GPIOA??AFIO?±?? GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //PA8 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA9 // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // GPIO_Init(GPIOA, &GPIO_InitStructure); // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PA10 // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // GPIO_Init(GPIOA, &GPIO_InitStructure); // // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //PA11 // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // GPIO_Init(GPIOA, &GPIO_InitStructure); TIM_TimeBaseStructure.TIM_Period = Arr; //×°???? TIM_TimeBaseStructure.TIM_Prescaler = Psc; //·????? TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //?ò?????????? TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //PWM2???? TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //???????? TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //?????????????§ TIM_OC1Init(TIM1, &TIM_OCInitStructure); // TIM_OC2Init(TIM1, &TIM_OCInitStructure); // TIM_OC3Init(TIM1, &TIM_OCInitStructure); // TIM_OC4Init(TIM1, &TIM_OCInitStructure); // TIM_ARRPreloadConfig(TIM1, ENABLE); // NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn; //TIM1???? // NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; //????3 // NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //?ì??3 // NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // NVIC_Init(&NVIC_InitStructure); // TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE); TIM_CtrlPWMOutputs(TIM1, ENABLE); TIM_Cmd(TIM1, ENABLE); //????TIM1 } //T1更新中断 /******************************************************************************* * Function Name : TIM1_CC_IRQHandler * Description : ???1???? * Input : - None * - * - * Output : None * Return : None *******************************************************************************/ void TIM1_UP_IRQHandler(void) { if (TIM_GetITStatus(TIM1, TIM_IT_Update) == SET) { TIM_ClearITPendingBit(TIM1, TIM_IT_Update); } }[/mw_shl_code]

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

使用道具 举报

20

主题

74

帖子

0

精华

初级会员

Rank: 2

积分
184
金钱
184
注册时间
2013-3-24
在线时间
6 小时
 楼主| 发表于 2014-12-10 13:49:37 | 显示全部楼层



第一个是不开启更新中断的,第二个是开启更新中断的,差别那么大,不知道为啥,就开了个更新中断,仿真看的DMA都开了
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-12-10 21:47:00 | 显示全部楼层
看不出问题,仿真可以进入中断么?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

20

主题

74

帖子

0

精华

初级会员

Rank: 2

积分
184
金钱
184
注册时间
2013-3-24
在线时间
6 小时
 楼主| 发表于 2014-12-11 08:49:28 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
中断是可以进的,但是IO没有输出,我想在中断中改变ARR而改变PWM频率
回复

使用道具 举报

20

主题

74

帖子

0

精华

初级会员

Rank: 2

积分
184
金钱
184
注册时间
2013-3-24
在线时间
6 小时
 楼主| 发表于 2014-12-11 10:27:10 | 显示全部楼层
我现在是用的PWM1模式,可以正常输出,只中断中改变装载值就可以改变PWM频率,我禁止了预装载,在中断中装载后就立即生效,但是在中断执行的总是每次都是两个重复的波形
[mw_shl_code=c,true]void TIM1_UP_IRQHandler(void) { static u8 CH_n = 0; if(TIM_GetITStatus(TIM1, TIM_IT_Update) == SET) { TIM_ClearITPendingBit(TIM1, TIM_IT_Update); switch(CH_n) { case 0:{ TIM1->ARR = 1000; CH_n++; break; } case 1: { TIM1->ARR = 2000; CH_n++; break; } case 2: { TIM1->ARR = 3000; CH_n++; break; } case 3: { TIM1->ARR = 4000; CH_n++; break; } case 4: { TIM1->ARR = 5000; CH_n++; break; } case 5:{ TIM1->ARR = 6000; CH_n++; break; } case 6: { TIM1->ARR = 7000; CH_n++; break; } case 7: { TIM1->ARR = 8000; CH_n++; break; } case 8: { TIM1->ARR = 10000; CH_n = 0; break; } default :break; } } }[/mw_shl_code]
分频是72,捕获值是400,所以装载值是1000的时候,就,400us的低电平,然后是600us的高电平,一次类推,switch实现单词多分支选择,但是现在的结果是都是两两重复,比如400低,600高,然后还是400低,600高,然后才是下一个,不知为什么
回复

使用道具 举报

20

主题

74

帖子

0

精华

初级会员

Rank: 2

积分
184
金钱
184
注册时间
2013-3-24
在线时间
6 小时
 楼主| 发表于 2014-12-11 10:28:39 | 显示全部楼层

这是捕获的波形,两两都是重复,所以出现重叠出现,但是感觉switch就是只执行了一次啊
回复

使用道具 举报

20

主题

74

帖子

0

精华

初级会员

Rank: 2

积分
184
金钱
184
注册时间
2013-3-24
在线时间
6 小时
 楼主| 发表于 2014-12-11 11:06:31 | 显示全部楼层
现在肯定不是switch语句的问题,应该是预装载的问题,按理说,我禁止了预装载后,在中断中装载后会不会立即生效呢?根据结果判定是立即生效了,而且下次更新后也生效了,所以就会出现了两次,是不是这样呢
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-12-11 23:14:41 | 显示全部楼层
回复【7楼】chenjiawei7:
---------------------------------
禁止预装载就是立即生效。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-27 23:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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