⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 os_ostimerl.c

📁 嵌入式时钟中断驱动程序的实例
💻 C
字号:
#include "register_variant.h"
#define LED_CS2   (*((volatile unsigned short *)(0x08300000)))
#define KEY_VALUE (*(volatile unsigned char*)(switch_dummyAddress))
//#define LAST_KEY_VAL  (*(volatile unsigned char *)(buttonStatus))	
//#define LAST_LED_VAL   (*(volatile unsigned char *)(ledStatusBuffer))
#define REG_OSCR (*(volatile unsigned long *)(osTimer_OSCR))
#define REG_OSSR (*(volatile unsigned long *)(osTimer_OSSR))
#define REG_OIER (*(volatile unsigned long *)(osTimer_OIER))
#define REG_ICPR (*(volatile unsigned long *)(int_ICPR))


#define REG_MDREFR (*(volatile unsigned long *)(mem_MDREFR))
#define REG_MDCNFG (*(volatile unsigned long *)(mem_MDCNFG))
#define REG_PSSR (*(volatile unsigned long *)(pwm_PSSR))
int LAST_KEY_VAL=0,LAST_LED_VAL=0,count;

    volatile unsigned long temp;
    unsigned long * addr;

void led_statusSet()
{
  LED_CS2 = LAST_LED_VAL;
}



int button_statusFetch(void)
{
   char i=0,j=8,left_move=1;   

   i = ~KEY_VALUE;
   if (i!=00)
     {
       for(;j>0;j--)
         if (i & 0x1) 
             break;
         else 
         {
            i=i>>1; 
            left_move ++;          
         }
     }
    else 
       left_move =0;    

 return left_move;

}


void identify()
{
  unsigned long enable_bit=0x20000000;
  char right_move=4;
  char new_led_bit = 0x08;
  for(; right_move>0; right_move--)
       if (REG_ICPR & enable_bit)
            {                
                new_led_bit = ~new_led_bit;
                LAST_LED_VAL = LAST_LED_VAL & new_led_bit;
                led_statusSet( );

                
                REG_OIER = REG_OIER & new_led_bit;
                REG_OSSR = REG_OSSR | (~new_led_bit);
               
                

                break;

            }
       else 
           { 
             enable_bit = enable_bit >> 1;
             new_led_bit = new_led_bit >> 1;
           }
}


void applicationmode()
{

   unsigned long reg_osmr ;
   char irq_en_bit=0;    
   int key_val = 0;   
 
   LAST_LED_VAL = 0x0ff;
   led_statusSet() ;
 

   while(1)
   {
     key_val = button_statusFetch();
     if (key_val != 0)
     {
       switch(key_val)
        { 
          case 1 :
             reg_osmr =  osTimer_OSMR0;
             irq_en_bit = 0x01;
             break;

          case 2 :
             reg_osmr = osTimer_OSMR1;
             irq_en_bit = 0x02;
             break;
          case 3 :
             reg_osmr = osTimer_OSMR2;
             irq_en_bit = 0x04;
             break;
          case 4 :
             reg_osmr = osTimer_OSMR3;
             irq_en_bit = 0x08;
             break;
          case 8:

             REG_OIER = 0;
             REG_OSSR = REG_OSSR;
             LAST_LED_VAL = 0x0ff;
             led_statusSet() ;
             return;
          default:
          
             ;
        }
      
       *(volatile unsigned long *)( reg_osmr) = REG_OSCR + osTimerPreDelay;
       REG_OIER = REG_OIER | irq_en_bit ; 
     }
       
        identify();
   }

}



void dummyOs()
{
 int led_sharp;
 char button_val=0;

 while(1) 
   {

   led_sharp=ledShareInterval;
   for(; led_sharp>0; led_sharp--)
      {
         button_val = button_statusFetch();         
         if (button_val != 0)
               break;
      }


    if (LAST_KEY_VAL != button_val && button_val!=0) /*if the laster is same as the current value and key are pressed */
       {
        LAST_KEY_VAL =  button_val;

        applicationmode();

       }   
    else 
        LAST_LED_VAL = ~LAST_LED_VAL;
    

    led_statusSet();

   }

}

void post_initGpio()
{
    *((volatile unsigned long *)(gpio_GPDR2))=initGpio_GPDR2;
    *((volatile unsigned long *)(gpio_GAFR2L))=initGpio_GAFR2L;      
}

void post_initMem()
{
    *((volatile unsigned long *)(osTimer_OSMR3))=REG_OSCR+0x100000;
    REG_OIER=0x8;
    
    while((REG_OSSR&0x8)==0)
               ;
    
    REG_OIER=0;
    REG_OSSR=REG_OSSR;  //clear ostimer3 int status
    
    temp=REG_MDREFR;
    
    temp=temp|(0x10000);
    REG_MDREFR=temp;
    
    temp=temp^(0x400000);
    REG_MDREFR=temp;
    
    temp=temp|(0x8000);
    REG_MDREFR=temp;
    
    REG_MDREFR=initMem_MDREFR;
    
    REG_MDCNFG=(~initMem_MDCNFG)&(0x1);
    
    REG_PSSR=REG_PSSR;
    
//    unsigned long * addr=(unsigned long *)(0x0a0000000);
  addr=(unsigned long *)(0x0a0000000);
    count=0x8;
    while(count!=0)
    {
       temp=*addr;
       count--;
    }
    
    REG_MDCNFG=initMem_MDCNFG;
    *((volatile unsigned long *)(mem_MDMRS))=initMem_MDMRS;
    
    *((volatile unsigned long *)(mem_MSC0))=initMem_MSC0;
    *((volatile unsigned long *)(mem_MSC1))=initMem_MSC1;
    *((volatile unsigned long *)(mem_MSC2))=initMem_MSC2;
    
    
    
}

void post_initVariant()
{
    *((volatile unsigned long *)(pwmEmulatorStatus))=0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -