OpenEdv-开源电子网

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

为什么该程序刚刚拷进去30s时候有一次灯的亮灭变化 然后都是一分钟变一次 我的应该都是一分钟变化一次

[复制链接]

1

主题

11

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2013-10-8
在线时间
0 小时
发表于 2013-11-5 10:57:59 | 显示全部楼层 |阅读模式
原子哥你好  期待您的解答  谢谢
这是在开发板例程定时器中断基础上改的
程序如下:
 #include "sys.h"
#include "usart.h"  
 #include "led.h"
#include "timer.h"    
//ALIENTEK战舰STM32开发板实验8
//定时器中断实验 
//技术支持:www.openedv.com
//广州市星翼电子科技有限公司
 int n=0,j=0;
int main(void)

             
 Stm32_Clock_Init(9); //系统时钟设置
 uart_init(72,9600);   //串口初始化为9600
// delay_init(72);       //延时初始化
 LED_Init();      //初始化与LED连接的硬件接口
  TIM2_Int_Init(35999,59999);//
    while(1)
 {
 } 
}
#include "timer.h"
#include "led.h"
 
extern int n,j;
//定时器2中断服务程序(主要在这里做了修改 
void TIM2_IRQHandler(void)
{
               
 if(TIM2->SR&0X0001)//溢出中断
 {   n++;
  if(n==2)
        {
  n=0;
  LED0=!LED0;
  }
 
    TIM2->SR&=~(1<<0);//清除中断标志位                                
 }      
  
}
//通用定时器2中断初始化
//这里时钟选择为APB1的2倍,而APB1为36M
//arr:自动重装值。
//psc:时钟预分频数
//这里使用的是定时器2!
void TIM2_Int_Init(u16 arr,u16 psc)
{
 RCC->APB1ENR|=1<<0; //TIM2时钟使能   
  TIM2->ARR=arr;   //设定计数器自动重装值//刚好1ms   
 TIM2->SC=psc;   //预分频器7200,得到10Khz的计数时钟   
 TIM2->DIER|=1<<0;   //允许更新中断  
   MY_NVIC_Init(1,3,TIM2_IRQChannel,2);//抢占1,子优先级3,组2
 TIM2->CR1|=0x01;    //使能定时器2         
}
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2013-11-5 11:18:31 | 显示全部楼层
n是不是在声明的时候给个初值0啊 光直接声明变量,初值不一定为0
————————————————————————————————
看错了,给了初值。初始化TIM时候清下中断标志位试试看
回复 支持 反对

使用道具 举报

19

主题

302

帖子

2

精华

高级会员

Rank: 4

积分
727
金钱
727
注册时间
2011-11-22
在线时间
10 小时
发表于 2013-11-5 11:34:16 | 显示全部楼层
1、不建议用n这样的全局变量,好多函数里的局部变量也有可能是n,如果对其操作,后果无法预知
2、
     n++;
   if(n==2)
         {
   n=0;
   LED0=!LED0;
   }
 改成这样是不是更好
   n++;
   if(n>=2)
         {
   n=0;
   LED0=!LED0;
   }
世界如此美好,好好珍惜每一天吧!
回复 支持 反对

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2013-10-8
在线时间
0 小时
 楼主| 发表于 2013-11-5 14:04:54 | 显示全部楼层
回复【2楼】ricefat:
---------------------------------
软件仿真 每次n的初值都是0的,然后就是这个led是在低电平的时候亮的   即使只有 
if(TIM2->SR&0X0001)//溢出中断
 {  
  LED0=!LED0;
  }
其余没有的时候  我设置的最初端口输出高电平 可是显示确实led亮,所以我怀疑是不是什么地方,一开始就进入了一次中断
回复 支持 反对

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2013-10-8
在线时间
0 小时
 楼主| 发表于 2013-11-5 14:11:08 | 显示全部楼层
回复【3楼】dzng11:
---------------------------------
在你说这个问题之前  我改过好几个变量试过  不是这的问题  刚才试了试你的修改意见 还是没有解决 还有就是这个led是在低电平的时候亮的   即使只有  
if(TIM2->SR&0X0001)//溢出中断 
 {   
  LED0=!LED0; 
  } 
其余没有的时候  我设置的最初端口输出高电平 可是显示确实led亮,所以我怀疑是不是什么地方,一开始就进入了一次中断
回复 支持 反对

使用道具 举报

19

主题

302

帖子

2

精华

高级会员

Rank: 4

积分
727
金钱
727
注册时间
2011-11-22
在线时间
10 小时
发表于 2013-11-5 14:16:48 | 显示全部楼层
不好意思没看清楼主问题,30s,1分钟,看成了30分钟和一分钟
世界如此美好,好好珍惜每一天吧!
回复 支持 反对

使用道具 举报

19

主题

302

帖子

2

精华

高级会员

Rank: 4

积分
727
金钱
727
注册时间
2011-11-22
在线时间
10 小时
发表于 2013-11-5 14:19:10 | 显示全部楼层
回复【5楼】love1evol:
---------------------------------
其实1楼说了
初始化TIM时候清下中断标志位试试看
世界如此美好,好好珍惜每一天吧!
回复 支持 反对

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2013-10-8
在线时间
0 小时
 楼主| 发表于 2013-11-5 14:44:31 | 显示全部楼层
回复【7楼】dzng11:
---------------------------------
你好,你们说的初始化TIM时候清下中断标志位是不是这个意思
        TIM2_Int_Init(35999,59999);// 
TIM2->SR&=~(1<<0);
刚刚试过了  还是老问题  我认为假如是初始化的时候执行一次中断的话  里面已经有一次清中断的操作了 再添加一个清中断 没有意义了  你的qq号是多少啊  我想加你一下 请教一下你
回复 支持 反对

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2013-10-8
在线时间
0 小时
 楼主| 发表于 2013-11-5 14:45:18 | 显示全部楼层
回复【4楼】love1evol:
---------------------------------
不好意思,刚才没有看到你说的清中断的话  刚刚试过了  还是那样的现象
回复 支持 反对

使用道具 举报

19

主题

302

帖子

2

精华

高级会员

Rank: 4

积分
727
金钱
727
注册时间
2011-11-22
在线时间
10 小时
发表于 2013-11-5 15:07:09 | 显示全部楼层
回复【8楼】love1evol:
---------------------------------

其实你碰到这个问题我也没在意过,没看到你的初始化函数有清中断的啊TIM2->SR&=~(1<<0); 
再有就是定时器的计数器是不是应该赋初值。
世界如此美好,好好珍惜每一天吧!
回复 支持 反对

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2013-10-8
在线时间
0 小时
 楼主| 发表于 2013-11-5 15:29:35 | 显示全部楼层
回复【10楼】dzng11:
---------------------------------
不好意思 刚刚理解错了 
void TIM2_Int_Init(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<<0; //TIM2时钟使能    
  TIM2->ARR=arr;   //设定计数器自动重装值//刚好1ms    
TIM2->SC=psc;   //预分频器7200,得到10Khz的计数时钟   
TIM2->DIER|=1<<0;   //允许更新中断   
   MY_NVIC_Init(1,3,TIM2_IRQChannel,2);//抢占1,子优先级3,组2
TIM2->CR1|=0x01;    //使能定时器2
TIM2->SR&=~(1<<0);  
}
你的意思是在这添加TIM2->SR&=~(1<<0);  现在加上了 可是还是老问题
回复 支持 反对

使用道具 举报

19

主题

302

帖子

2

精华

高级会员

Rank: 4

积分
727
金钱
727
注册时间
2011-11-22
在线时间
10 小时
发表于 2013-11-5 15:37:08 | 显示全部楼层
回复【11楼】love1evol:
---------------------------------
QQ-316106419 浮云


多试试,把更新中断放在清中断后面

void TIM2_Int_Init(u16 arr,u16 psc) 

RCC->APB1ENR|=1<<0; //TIM2时钟使能     
  TIM2->ARR=arr;   //设定计数器自动重装值//刚好1ms     
TIM2->SC=psc;   //预分频器7200,得到10Khz的计数时钟    
MY_NVIC_Init(1,3,TIM2_IRQChannel,2);//抢占1,子优先级3,组2 
TIM2->CR1|=0x01;    //使能定时器2 
TIM2->SR&=~(1<<0);   
TIM2->DIER|=1<<0;   //允许更新中断
}
世界如此美好,好好珍惜每一天吧!
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-9 20:44

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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