OpenEdv-开源电子网

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

STM32控制PWM波的个数

[复制链接]

4

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2014-9-13
在线时间
0 小时
发表于 2014-9-13 21:29:09 | 显示全部楼层 |阅读模式
5金钱
刚接触STM32,想控制PWM波的个数,用TIM2产生周期为20ms的PWM波,然后使能定时器2中断,中断函数里面定义一个变量,中断一次就加1,加到20就关定时器2。大神们告诉一下,这样的方案可行吗?我仿真试了一下,不行啊,附上程序:
void time_gpio(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
}
void time_init(void)
{
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;



RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
TIM_TimeBaseStructure.TIM_Period=199;
TIM_TimeBaseStructure.TIM_Prescaler=7199;
TIM_TimeBaseStructure.TIM_ClockDivision=0;
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);//配置TIM2时钟,PWM频率为50HZ
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //开定时器中断



TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse=100;
TIM_OC4Init(TIM2,&TIM_OCInitStructure);
TIM_Cmd(TIM2, ENABLE);


NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void TIM2_IRQHandler(void)
{
int i=0;
if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET) 
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
i++;
}
if(i==20)
{
TIM_Cmd(TIM2, DISABLE);
}
}


void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;

NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);


NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 
}
#include "stm32f10x.h"
#include "Configuration.h"
int main(void)
{
RCC_Configuration();
NVIC_Configuration();
time_gpio();
time_init();
while(1)
{}
}

最佳答案

查看完整内容[请看2#楼]

中断中的int i 是局部变量,永远不可能到20.
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

37

主题

146

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2014-6-4
在线时间
92 小时
发表于 2014-9-13 21:29:10 | 显示全部楼层
中断中的int i 是局部变量,永远不可能到20.
一路狂奔!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-9-14 00:00:45 | 显示全部楼层
方法可行的。
不行你得根据现象去判断是什么问题。
是没波,还是没中断。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

4

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2014-9-13
在线时间
0 小时
 楼主| 发表于 2014-9-14 09:17:15 | 显示全部楼层
回复【2楼】正点原子:
如果加上中断子函数void TIM2_IRQHandler(void)就直接没波了,如果把中断子函数去除就有波,谢谢!

-------------------------------
回复

使用道具 举报

3

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2014-4-26
在线时间
0 小时
发表于 2014-9-14 09:30:01 | 显示全部楼层
这么诡异,不过我看到你第一个函数void time_gpio(void)没开时钟,是不是在其他地方有开启?
不努力,就什么也得不到
回复

使用道具 举报

4

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2014-9-13
在线时间
0 小时
 楼主| 发表于 2014-9-14 09:37:48 | 显示全部楼层
回复【4楼】fresh杰尼龟:时钟RCC_Configuration()在这里开了,刚刚试了一下,有波了,但是没有中断。因为PWM波可以生成,要控制步进电机,所以要控制波的个数,所以我就这样弄了一下,但是现在不能中断。谢谢!
---------------------------------
回复

使用道具 举报

4

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2014-9-13
在线时间
0 小时
 楼主| 发表于 2014-9-14 09:47:16 | 显示全部楼层
---------------------------------
回复【4楼】fresh杰尼龟:GPIO口也要开时钟?
---------------------------------
回复

使用道具 举报

3

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2014-4-26
在线时间
0 小时
发表于 2014-9-14 10:46:02 | 显示全部楼层
回复【6楼】爱转了一圈:
---------------------------------
要的
不努力,就什么也得不到
回复

使用道具 举报

3

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2014-4-26
在线时间
0 小时
发表于 2014-9-14 10:50:42 | 显示全部楼层
回复【5楼】爱转了一圈:
---------------------------------
怎么看到没中断的?
不努力,就什么也得不到
回复

使用道具 举报

4

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2014-9-13
在线时间
0 小时
 楼主| 发表于 2014-9-14 12:21:12 | 显示全部楼层
回复【8楼】fresh杰尼龟:看了i的值,一直是0,所以没进中断啊
---------------------------------
回复【7楼】fresh杰尼龟:我没开,也能产生PWM波啊
---------------------------------
回复

使用道具 举报

4

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2014-9-13
在线时间
0 小时
 楼主| 发表于 2014-9-14 18:04:51 | 显示全部楼层
回复【3楼】爱转了一圈:
---------------------------------
回复【2楼】正点原子:原子哥,这个直接就进不去中断啊,里面的变量i的值一直就是0啊---------------------------------
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-9-15 01:19:50 | 显示全部楼层
回复【10楼】爱转了一圈:
---------------------------------
那就检查配置啊。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

4

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2014-9-13
在线时间
0 小时
 楼主| 发表于 2014-9-15 18:34:57 | 显示全部楼层
回复【11楼】正点原子:
---------------------------------
查了一遍,配置应该没错啊
回复

使用道具 举报

4

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2014-9-13
在线时间
0 小时
 楼主| 发表于 2014-9-15 23:31:09 | 显示全部楼层
回复【13楼】南帝:
---------------------------------
嗯,是的,把程序贴出来之后我就发现这个问题了,但后来的时候我把i定义到中断函数外面,还是不行
回复

使用道具 举报

4

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2014-9-13
在线时间
0 小时
 楼主| 发表于 2014-9-16 19:19:17 | 显示全部楼层


仿真出现这样的错误,是怎么回事?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-1 04:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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