[STM32F1] 外部按键开启定时器

[复制链接]
1475|8
 楼主| 复仇之矛 发表于 2015-4-8 16:38 | 显示全部楼层 |阅读模式
想用一个定时器做一个倒计时,可是总是失败,觉是配置的问题,可是根据中文开发手册找不出问题,请大神指点一下。
  1. u8 count=0;
  2. u8 closetime=0;
  3. void GPIO_Init()
  4. {
  5.         RCC->APB2ENR|=1<<2;     //ʹÄÜPORTAʱÖÓ
  6.         GPIOA->CRL&=0X0FFFFFFF;        //PA7ÉèÖóÉÊäÈ룬ĬÈÏÏÂÀ­          
  7.         GPIOA->CRL|=0X80000000;
  8.         GPIOA->ODR|=1<<7;        //ÉèÖÃΪÉÏÀ­ÊäÈë
  9. }

  10. void TIM3_Int_Init(u16 arr,u16 psc)
  11. {
  12.         RCC->APB1ENR|=1<<1;         //TIM3ʱÖÓʹÄÜ   
  13.         TIM3->ARR=arr;             //É趨¼ÆÊýÆ÷×Ô¶¯ÖØ×°Öµ//¸ÕºÃ1ms   
  14.         TIM3->PSC=psc;             //Ô¤·ÖƵÆ÷7200,µÃµ½10KhzµÄ¼ÆÊýʱÖÓ       

  15.         TIM3->CR1&=0<<4;        //¼ÆÊýÆ÷ÏòÉϼÆÊý
  16.        
  17.         TIM3->CCMR1&=0<<12;     //ͨµÀ2²»ÉèÖò¶»ñÂ˲¨Æ÷
  18.         TIM3->CCMR1|=1<<8;      //Ñ¡ÔñÊäÈë²¶»ñÔ´£¬CC2ͨµÀ±»ÅäÖÃΪÊäÈ룬IC2Ó³ÉäÔÚTI2ÉÏ£»
  19.         TIM3->CCER|=1<<5;       //È·¶¨¼«ÐÔ
  20.         TIM3->SMCR|=6<<0;       //ÅäÖö¨Ê±Æ÷Ϊ´¥·¢Ä£Ê½
  21.         TIM3->SMCR|=6<<4;       //ÅäÖÃÑ¡ÔñTI2×÷ΪÊäÈëÔ´¡£µ±TI2³öÏÖÒ»¸öÉÏÉýÑØÊ±£¬¼ÆÊýÆ÷¿ªÊ¼ÔÚÄÚ²¿Ê±ÖÓÇý¶¯Ï¼ÆÊý£¬Í¬Ê±ÉèÖÃTIF±ê־루´¥·¢±ê־룩£»
  22.        
  23.   TIM3->DIER|=1<<6;   // ÔÊÐí´¥·¢ÖжϠ      
  24.         //TIM3->DIER|=1<<0;   //ÔÊÐí¸üÐÂÖжϠ         
  25.         TIM3->CR1|=0x01;        //ʹÄܶ¨Ê±Æ÷3
  26.        
  27.           MY_NVIC_Init(1,3,TIM3_IRQn,2);//ÇÀÕ¼1£¬×ÓÓÅÏȼ¶3£¬×é2                                                                         
  28. }


  29. //¶¨Ê±Æ÷3ÖжϷþÎñ³ÌÐò         
  30. void TIM3_IRQHandler(void)
  31. {                
  32.        
  33.         if(TIM3->SR&0X0020)//´¥·¢ÖжÏ
  34.         {
  35.                 closetime=1;
  36.                 LED1=!LED1;       
  37.     TIM3->DIER|=1<<0;   //ÔÊÐí¸üÐÂÖжÏ
  38.     if(TIM3->SR&0x0001)               
  39.                 {
  40.                         TIM3->SR&=~(1<<0);
  41.       count=count+1;
  42.       if(count==30)
  43.                         {
  44.         closetime=0;  //Çл»½çÃæ±êÖ¾
  45.                                 TIM3->SR=0;
  46.        }
  47.      }
  48.         }                                  
  49. }
mmuuss586 发表于 2015-4-8 18:33 | 显示全部楼层
参考ST的官方例程就可以了,在此基础上改;
mmuuss586 发表于 2015-4-8 18:34 | 显示全部楼层
都用寄存器写,看的别人的例程吧;

我喜欢用库函数;
戈卫东 发表于 2015-4-8 18:46 | 显示全部楼层
TIM3->CR1&=0<<4;        //¼ÆÊýÆ÷ÏòÉϼÆÊý
看不懂你的注解,不过,你把0进行移位是想怎么样?不管怎么移位它总是0啊
戈卫东 发表于 2015-4-8 18:53 | 显示全部楼层
  if(TIM3->SR&0X0020)//´¥·¢ÖжÏ
/*0X0020 这是保留位啊,你检查这一位是想干什么?它总是读到0啊 ??????????????????*/
        {
                closetime=1;
                LED1=!LED1;      
    TIM3->DIER|=1<<0;   //ÔÊÐí¸üÐÂÖжÏ
    if(TIM3->SR&0x0001)
。。。。。。。。。。。
 楼主| 复仇之矛 发表于 2015-4-8 18:59 | 显示全部楼层
戈卫东 发表于 2015-4-8 18:53
if(TIM3->SR&0X0020)//´¥·¢ÖжÏ
/*0X0020 这是保留位啊,你检查这一位是想干什么?它总是读到0啊 ...

寄存器写程序是刚刚学的,我的意思是想判断触发中断标志位的。
 楼主| 复仇之矛 发表于 2015-4-8 19:00 | 显示全部楼层
mmuuss586 发表于 2015-4-8 18:34
都用寄存器写,看的别人的例程吧;

我喜欢用库函数;

定时器的寄存器太多,用库函数看不到寄存器值的变化,所以学着用的:P
戈卫东 发表于 2015-4-8 21:44 | 显示全部楼层
你可以先说说你想要做什么。。。。
 楼主| 复仇之矛 发表于 2015-4-9 09:12 | 显示全部楼层
戈卫东 发表于 2015-4-8 21:44
你可以先说说你想要做什么。。。。

我想用外部按钮启动定时器,然后借助更新中断来实验秒中断,最后实现倒计时。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

23

主题

185

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部