OpenEdv-开源电子网

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

stm32的全局变量问题

[复制链接]

12

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
317
金钱
317
注册时间
2015-11-4
在线时间
51 小时
发表于 2016-5-27 16:17:21 | 显示全部楼层 |阅读模式
10金钱
我现在遇到一个奇葩问题,我在主函数定义一个全局变量,在中断服务函数里面修改,然后发现他的值不知道飞哪里去了。。。
我是用的TIM5作为编码器模式,TIM7来定时算速度,就是那个rcnt5这个值
TIM5如下:void TIM5_Configuration(void){
       GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_ICInitTypeDef  TIM_ICInitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA , ENABLE);
                                                                                              
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;         
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
       GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;       
       GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;       
        GPIO_Init(GPIOA, &GPIO_InitStructure);                                 
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource0,GPIO_AF_TIM5);
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource1,GPIO_AF_TIM5);

       TIM_TimeBaseStructure.TIM_Period = 720;
        TIM_TimeBaseStructure.TIM_Prescaler = 0;
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
        TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure);
       

        TIM_EncoderInterfaceConfig(TIM5, TIM_EncoderMode_TI12,TIM_ICPolarity_Rising,TIM_ICPolarity_Rising);
        TIM_ICStructInit(&TIM_ICInitStructure);
       TIM_ICInitStructure.TIM_ICFilter = 6;  
       TIM_ICInit(TIM5, &TIM_ICInitStructure);
       TIM_ClearFlag(TIM5, TIM_FLAG_Update);
       TIM_ITConfig(TIM5, TIM_IT_Update, ENABLE);
       TIM5->CNT = 0;
        TIM_Cmd(TIM5, ENABLE);
       
        NVIC_InitStructure.NVIC_IRQChannel=TIM5_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
        NVIC_Init(&NVIC_InitStructure);
       
       
}


        void TIM5_IRQHandler(void)
{
  if (TIM5 -> CR1 & 0X0010)                 
   {
    rcnt5 -= 1;
   }
   else rcnt5 += 1;
   TIM_ClearITPendingBit(TIM5, TIM_IT_Update);
       

}
TIM7如下:void TIM7_Configuration(void)
{

       
        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
       
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM7,ENABLE);  
       
       TIM_TimeBaseInitStructure.TIM_Period = 5000-1;        
        TIM_TimeBaseInitStructure.TIM_Prescaler=8400-1;  
        TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;
        //TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0;
        TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
       
        TIM_TimeBaseInit(TIM7,&TIM_TimeBaseInitStructure);
       
        TIM_ITConfig(TIM7,TIM_IT_Update,ENABLE);
        TIM_UpdateRequestConfig(TIM7,TIM_UpdateSource_Regular);
        TIM_Cmd(TIM7,ENABLE);
       
        NVIC_InitStructure.NVIC_IRQChannel=TIM7_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
        NVIC_Init(&NVIC_InitStructure);

}



void TIM7_IRQHandler(void)
{
  get_encoder_FOU();//这个函数中只是把rcnt5拿来用了一下,没有改;

  TIM_ClearITPendingBit(TIM7,TIM_FLAG_Update);

}
主函数:
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        delay_init(168);  
        uart_init(19200);       
        LED_Init();                                       
        TIM5_Configuration();
        TIM7_Configuration();
       
        while(1)
{
          delay_ms(500);
       
          printf("\r\n  iμÄÖμ  %d\r\n",rcnt5);

}

结果就像那个图
1111.PNG

最佳答案

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

换个TIM试试,是不是中断配置或者计数值设置有问题
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

183

帖子

0

精华

高级会员

Rank: 4

积分
684
金钱
684
注册时间
2016-1-27
在线时间
184 小时
发表于 2016-5-27 16:17:22 | 显示全部楼层
夜愿晨城 发表于 2016-5-30 09:45
解决的方法就是,我不用了

换个TIM试试,是不是中断配置或者计数值设置有问题
回复

使用道具 举报

12

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
317
金钱
317
注册时间
2015-11-4
在线时间
51 小时
 楼主| 发表于 2016-5-27 16:19:36 | 显示全部楼层
TIM7其实可以忽略,就只剩TIM5然后我让rcnt5在中断服务函数里自增然后输出,结果一样。
回复

使用道具 举报

12

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
317
金钱
317
注册时间
2015-11-4
在线时间
51 小时
 楼主| 发表于 2016-5-27 16:28:26 | 显示全部楼层
附上工程吧,这是简化版,只针对rcnt5的。

111.zip

4.25 MB, 下载次数: 82

回复

使用道具 举报

12

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
317
金钱
317
注册时间
2015-11-4
在线时间
51 小时
 楼主| 发表于 2016-5-27 16:29:41 | 显示全部楼层
然后,求大神
回复

使用道具 举报

0

主题

183

帖子

0

精华

高级会员

Rank: 4

积分
684
金钱
684
注册时间
2016-1-27
在线时间
184 小时
发表于 2016-5-27 16:31:03 | 显示全部楼层
rcnt5的初值是多少?是不是反向溢出了?你是直接一步到位了吗,有没有检查读编码器脉冲数是否正确
回复

使用道具 举报

12

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
317
金钱
317
注册时间
2015-11-4
在线时间
51 小时
 楼主| 发表于 2016-5-27 16:33:43 | 显示全部楼层
不吃鱼的老鼠 发表于 2016-5-27 16:31
rcnt5的初值是多少?是不是反向溢出了?你是直接一步到位了吗,有没有检查读编码器脉冲数是否正确

初值:0,编码器没有问题,而且脉冲数的问题也不会导致这个结果啊,至于溢出那也不会啊,可以说溢出需要很久。
回复

使用道具 举报

18

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
283
金钱
283
注册时间
2015-11-12
在线时间
54 小时
发表于 2016-5-27 16:37:47 | 显示全部楼层
你这只能是没进中断的情况吧
回复

使用道具 举报

12

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
317
金钱
317
注册时间
2015-11-4
在线时间
51 小时
 楼主| 发表于 2016-5-27 16:42:19 | 显示全部楼层
pthread 发表于 2016-5-27 16:37
你这只能是没进中断的情况吧

中断是需要外面编码器给脉冲,然后TIM5计数到溢出,触发中断。
回复

使用道具 举报

0

主题

183

帖子

0

精华

高级会员

Rank: 4

积分
684
金钱
684
注册时间
2016-1-27
在线时间
184 小时
发表于 2016-5-27 16:48:03 | 显示全部楼层
夜愿晨城 发表于 2016-5-27 16:33
初值:0,编码器没有问题,而且脉冲数的问题也不会导致这个结果啊,至于溢出那也不会啊,可以说溢出需要 ...

我的意思是,是不是编码器反转了,初值为0的话,减1就是-1了,而且我没看到你有给你的rcnt5赋初值
回复

使用道具 举报

12

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
317
金钱
317
注册时间
2015-11-4
在线时间
51 小时
 楼主| 发表于 2016-5-27 16:57:58 | 显示全部楼层
不吃鱼的老鼠 发表于 2016-5-27 16:48
我的意思是,是不是编码器反转了,初值为0的话,减1就是-1了,而且我没看到你有给你的rcnt5赋初值

正反我换了,一样,定义这个值上面给的貌似是没初值,加了一样(我加了试了),因为全局貌似是默认为0的。
回复

使用道具 举报

12

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
317
金钱
317
注册时间
2015-11-4
在线时间
51 小时
 楼主| 发表于 2016-5-27 17:03:09 | 显示全部楼层
我现在把别的全部删了,只有TIM5计数,然后溢出中断,rcnt5+1输出,这样也不行,输出不知道从哪里来的数字。。。。。我想知道是不是我TIM5有问题,可是之前没有的
回复

使用道具 举报

12

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
317
金钱
317
注册时间
2015-11-4
在线时间
51 小时
 楼主| 发表于 2016-5-27 17:07:47 | 显示全部楼层
这是我按了几次复位键的结果,惨不忍睹。。。。
33.PNG
回复

使用道具 举报

0

主题

183

帖子

0

精华

高级会员

Rank: 4

积分
684
金钱
684
注册时间
2016-1-27
在线时间
184 小时
发表于 2016-5-27 17:18:30 | 显示全部楼层
在溢出中断中加标志位判断
if(TIM_GetITStatus(TIM5, TIM_IT_Update)!= RESET)
{
   if (TIM5 -> CR1 & 0X0010)                  //小心注意
   {
       rcnt5 -= 1;
   }
   else rcnt5 += 1;
   TIM_ClearITPendingBit(TIM5, TIM_IT_Update);
}
回复

使用道具 举报

12

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
317
金钱
317
注册时间
2015-11-4
在线时间
51 小时
 楼主| 发表于 2016-5-27 17:52:42 | 显示全部楼层
不吃鱼的老鼠 发表于 2016-5-27 17:18
在溢出中断中加标志位判断
if(TIM_GetITStatus(TIM5, TIM_IT_Update)!= RESET)
{

我刚刚发现中断进了好几次,加上这句试试。
回复

使用道具 举报

12

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
317
金钱
317
注册时间
2015-11-4
在线时间
51 小时
 楼主| 发表于 2016-5-27 17:58:45 | 显示全部楼层
夜愿晨城 发表于 2016-5-27 17:52
我刚刚发现中断进了好几次,加上这句试试。

还是这样。讲道理,应该没有别的会触发TIM5中断了,这是为什么。。。我TIM5->CNT扔在主函数,
rcnt5扔在中断里
4654.PNG
回复

使用道具 举报

0

主题

183

帖子

0

精华

高级会员

Rank: 4

积分
684
金钱
684
注册时间
2016-1-27
在线时间
184 小时
发表于 2016-5-30 08:52:25 | 显示全部楼层
夜愿晨城 发表于 2016-5-27 17:58
还是这样。讲道理,应该没有别的会触发TIM5中断了,这是为什么。。。我TIM5->CNT扔在主函数,
rcnt5扔在 ...

什么意思,现在是好了吗?
回复

使用道具 举报

12

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
317
金钱
317
注册时间
2015-11-4
在线时间
51 小时
 楼主| 发表于 2016-5-30 09:45:14 | 显示全部楼层
不吃鱼的老鼠 发表于 2016-5-30 08:52
什么意思,现在是好了吗?

当然没好。。。。。应该只有一次rcnt5的输出,因为只进一次服务函数,可是他发出了两次。。。第一次更是发了三个。。。
回复

使用道具 举报

12

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
317
金钱
317
注册时间
2015-11-4
在线时间
51 小时
 楼主| 发表于 2016-5-30 09:45:57 | 显示全部楼层
不吃鱼的老鼠 发表于 2016-5-30 08:52
什么意思,现在是好了吗?

解决的方法就是,我不用了
回复

使用道具 举报

12

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
317
金钱
317
注册时间
2015-11-4
在线时间
51 小时
 楼主| 发表于 2016-5-30 10:18:09 | 显示全部楼层
不吃鱼的老鼠 发表于 2016-5-30 10:16
换个TIM试试,是不是中断配置或者计数值设置有问题

换了TIM3,突然好了什么鬼
回复

使用道具 举报

2

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
174
金钱
174
注册时间
2015-12-3
在线时间
71 小时
发表于 2016-5-30 11:49:43 | 显示全部楼层
别使用printf,自己用仿真器单步调试一下看看他的值
回复

使用道具 举报

12

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
317
金钱
317
注册时间
2015-11-4
在线时间
51 小时
 楼主| 发表于 2016-5-30 15:23:54 | 显示全部楼层
void 发表于 2016-5-30 11:49
别使用printf,自己用仿真器单步调试一下看看他的值

恩,我也怀疑是printf的问题,可惜单步调试不怎么好用,我把数据存起来试试
回复

使用道具 举报

2

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
174
金钱
174
注册时间
2015-12-3
在线时间
71 小时
发表于 2016-5-30 18:30:01 | 显示全部楼层
夜愿晨城 发表于 2016-5-30 15:23
恩,我也怀疑是printf的问题,可惜单步调试不怎么好用,我把数据存起来试试

如果你用的是Jlink,打个断点,你把鼠标移到那个变量上,就可以显示那个变量的值
回复

使用道具 举报

12

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
317
金钱
317
注册时间
2015-11-4
在线时间
51 小时
 楼主| 发表于 2016-5-30 19:18:08 | 显示全部楼层
void 发表于 2016-5-30 18:30
如果你用的是Jlink,打个断点,你把鼠标移到那个变量上,就可以显示那个变量的值

是ST-link,如果是J-Link的话就没有这些问题了
回复

使用道具 举报

2

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
174
金钱
174
注册时间
2015-12-3
在线时间
71 小时
发表于 2016-5-31 12:19:50 | 显示全部楼层
夜愿晨城 发表于 2016-5-30 19:18
是ST-link,如果是J-Link的话就没有这些问题了

没用过ST-link,按说也应该有这种功能吧。如果你的printf不是用中断发的,十有八九就是printf的问题。
回复

使用道具 举报

84

主题

766

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2775
金钱
2775
注册时间
2015-6-1
在线时间
394 小时
发表于 2016-5-31 16:42:57 | 显示全部楼层
兄弟,我也奇怪,请问你定义的这个全局变量是float型的吗?还是什么类型的?
自在随心
回复

使用道具 举报

0

主题

183

帖子

0

精华

高级会员

Rank: 4

积分
684
金钱
684
注册时间
2016-1-27
在线时间
184 小时
发表于 2016-5-31 17:00:38 | 显示全部楼层
问题解决了吗?现在是什么现象
回复

使用道具 举报

12

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
317
金钱
317
注册时间
2015-11-4
在线时间
51 小时
 楼主| 发表于 2016-6-1 09:56:38 | 显示全部楼层
yuzeyuan1 发表于 2016-5-31 16:42
兄弟,我也奇怪,请问你定义的这个全局变量是float型的吗?还是什么类型的?

刚开始为了兼容性等用的s32,然后用的float。
回复

使用道具 举报

12

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
317
金钱
317
注册时间
2015-11-4
在线时间
51 小时
 楼主| 发表于 2016-6-1 09:58:24 | 显示全部楼层
yuzeyuan1 发表于 2016-5-31 16:42
兄弟,我也奇怪,请问你定义的这个全局变量是float型的吗?还是什么类型的?

我试过把它定义成数组,结构体,都不行。
回复

使用道具 举报

12

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
317
金钱
317
注册时间
2015-11-4
在线时间
51 小时
 楼主| 发表于 2016-6-1 10:04:02 | 显示全部楼层
不吃鱼的老鼠 发表于 2016-5-31 17:00
问题解决了吗?现在是什么现象

我本来使用另外一个定时器TIM7来随时打断TIM5,根据TIM5->cnt的值还有rcnt5来算转速的,但是一加tim7就不行,不加就没有问题,所以,我先放弃算转速了,没有的话比较正常
回复

使用道具 举报

12

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
317
金钱
317
注册时间
2015-11-4
在线时间
51 小时
 楼主| 发表于 2016-6-1 10:05:30 | 显示全部楼层
不吃鱼的老鼠 发表于 2016-5-31 17:00
问题解决了吗?现在是什么现象

说法有点问题,打断tim5但是他还是在计数,tim7优先级最高
回复

使用道具 举报

12

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
317
金钱
317
注册时间
2015-11-4
在线时间
51 小时
 楼主| 发表于 2016-6-1 10:07:46 | 显示全部楼层
yuzeyuan1 发表于 2016-5-31 16:42
兄弟,我也奇怪,请问你定义的这个全局变量是float型的吗?还是什么类型的?

我都不能理解,我单步执行的时候,他在,某个定时器初始化结束后突然变为0xffffffff,想不明白,heap和stack我都改了,没用,还有上面的方法,初始化什么的,都没用,真心没遇见过。
回复

使用道具 举报

12

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
317
金钱
317
注册时间
2015-11-4
在线时间
51 小时
 楼主| 发表于 2016-6-1 10:09:55 | 显示全部楼层
不吃鱼的老鼠 发表于 2016-5-31 17:00
问题解决了吗?现在是什么现象

不知道是不是定时器之间有点关系(不然为什么去掉一个定时计算的定时器就一切正常了),我正在把程序整合试试。
回复

使用道具 举报

84

主题

766

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2775
金钱
2775
注册时间
2015-6-1
在线时间
394 小时
发表于 2016-6-1 11:32:32 | 显示全部楼层
夜愿晨城 发表于 2016-6-1 09:56
刚开始为了兼容性等用的s32,然后用的float。

我的代码里用float就会出问题,莫名其妙的问题。
要不你试试不用float呢?
自在随心
回复

使用道具 举报

12

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
317
金钱
317
注册时间
2015-11-4
在线时间
51 小时
 楼主| 发表于 2016-6-1 14:02:33 | 显示全部楼层
yuzeyuan1 发表于 2016-6-1 11:32
我的代码里用float就会出问题,莫名其妙的问题。
要不你试试不用float呢?

恩,我试试
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-12 18:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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