OpenEdv-开源电子网

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

作定时器遇到的问题

[复制链接]

13

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2014-2-22
在线时间
1 小时
发表于 2014-7-12 18:08:10 | 显示全部楼层 |阅读模式
5金钱
 

原子哥:

您好:

我把MINI试验16库函数版程序作了小修改。其余程序不变,只做以下两处修改。

目的是想做个TIM定时器。我的理解是,定时器溢出中断后让sec自加。这样就可以扩展到秒,分,时。但是做了如下修改后,计数sec在中断后就是不自加。不知什么原因?串口观察sec也是0。

位于timer.c的程序。

void TIM3_IRQHandler(void)   //TIM3中断

{

       if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源

              {

              TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx的中断待处理位:TIM 中断源

              /* Pin PD.02 toggling with frequency = 10KHz */

              //GPIO_WriteBit(GPIOD, GPIO_Pin_2, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOD, GPIO_Pin_2)));

               sec++;

               }

  }

主程序:

       while(1)

               {

                            

                    LCD_ShowNum(60,190,sec,3,12);

                                                printf("sec=%d\n",sec);                             //输出结果    

            }

 }

最佳答案

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

我测试了没有问题。。。 方法是: 1)timer.h里面增加:extern u32 sec; 2)timer.c里面修改中断: void TIM3_IRQHandler(void)   //TIM3中断 { if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源  { TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx的中断待处理位:TIM 中断源  LED1=!LED1; sec++; } } 3)main.c里面 #includ ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

230

主题

1950

帖子

10

精华

论坛元老

Rank: 8Rank: 8

积分
4562
金钱
4562
注册时间
2010-12-14
在线时间
32 小时
发表于 2014-7-12 18:08:11 | 显示全部楼层
我测试了没有问题。。。
方法是:
1)timer.h里面增加:extern u32 sec;
2)timer.c里面修改中断:
void TIM3_IRQHandler(void)   //TIM3中断
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx的中断待处理位:TIM 中断源 
LED1=!LED1;
sec++;
}
}

3)main.c里面
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "timer.h"
#include "usart.h"
//ALIENTEK Mini STM32开发板范例代码7
//定时器中断实验   
//技术支持:www.openedv.com
//广州市星翼电子科技有限公司\

u32 sec=0;
 int main(void)
 {
delay_init();     //延时函数初始化
NVIC_Configuration();//设置NVIC中断分组2:2位抢占优先级,2位响应优先级
LED_Init();   //初始化与LED连接的硬件接口
uart_init(9600);
TIM3_Int_Init(4999,7199);//10Khz的计数频率,计数到5000为500ms  
    while(1)
{
LED0=!LED0;
delay_ms(200);
  printf("sec=%d\n",sec);
}
}

}



ALIENTEK MINISTM32 实验7定时器中断实验.zip

321.4 KB, 下载次数: 130

我是开源电子网?网站管理员,对网站有任何问题,请与我联系!QQ:389063473Email:389063473@qq.com
回复

使用道具 举报

13

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2014-2-22
在线时间
1 小时
 楼主| 发表于 2014-7-13 10:01:40 | 显示全部楼层
回复【2楼】Admin:
---------------------------------
非常感谢!库函数的这个按照您的方法我做出来了。我想再问一下。用不是库函数的MINI版的那种怎么改动程序。他的tim.c是这样的。
void TIM3_IRQHandler(void)
{              
if(TIM3->SR&0X0001)//溢出中断
{
LED1=!LED1;          sec++;          
}    
TIM3->SR&=~(1<<0);//清除中断标志位      
}

其余部分怎么变?这个我做了。也是不计数。显示也是0。
回复

使用道具 举报

13

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2014-2-22
在线时间
1 小时
 楼主| 发表于 2014-7-13 10:48:05 | 显示全部楼层
回复【2楼】Admin:
---------------------------------
使用不完全手册的那种编成方法。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-6 06:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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