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

📄 main.c

📁 ucos 在ARM7下的移植代码
💻 C
字号:
//app.c

#include <includes.h>

#define IRQ0_PIO_INTERRUPT_LEVEL	5
#define IRQ1_PIO_INTERRUPT_LEVEL	4

#define  TASK_STK_SIZE    128
#define  TASK_START_PRIO    5

OS_STK        AppStartTaskStk[TASK_STK_SIZE];
static  void  AppStartTask();
static  void  AT91_init(void);

void InitUSART0(void);
void InitUSART1(void);
void timer0_init ( void );
 //unsigned char receiverdata;
 //unsigned char receiverstate;
unsigned char receiverdata_portA;
unsigned char receiverdata_portB;
unsigned char receiver_porta_state;
unsigned char receiver_portb_state;
unsigned char ReceiverStr1[100];
unsigned char isReceiverData;
unsigned char IsStartCommand;
struct {
  float time;
  double latitude;
  double longitude;
  int GPSquality;
  int GPSNum;
  double GPSprecision;
  double GPSHight;
}GPSData;
float  V=99;
//罗盘变量
unsigned char str_compass[10]="99";
unsigned char str_pitch[10]="99";
unsigned char str_roll[10]="99";
unsigned char Temperater[10];
extern unsigned char Gyrodata[100];
float compass=999;
float pitch=999;
float roll=999;
int posflag=0;  //罗盘数据全部收齐
int poscount=0;//罗盘没有进入中断标志
extern int gyro_pos;
extern int IsGyrohead;
//发送数据变量
char measure_data[200];
int send_pos=0;
int measure_data_flag=0;

//接收命令变量
unsigned char Receiver_CTL[15];
int ctl_Pos=0;
int Isctlhead=0;
//电压变量
double voltage=0.0;
char PowerState=0x3f;
int V_count=0;
//定时器
//指示灯变量
int Light=1;

AT91PS_USART COM0 = AT91C_BASE_US0;
AT91PS_USART COM1 = AT91C_BASE_US1;
extern unsigned int count_timer0_interrupt;
void mDelay1_2uS( )  /* 至少延时1.2uS,根据单片机主频调整 */
{
	
    unsigned long	 ms;
    ms=2;
    while ( ms -- ) ;
}
/* 延时指定毫秒时间,根据单片机主频调整,不精确 */
void	mDelaymS( unsigned long	 ms )
{
    unsigned long i;
     
    while ( ms -- )
    {
           i=8000;
          while ( i -- );
    }
}



/*********************************************************************************************************
 *说明:main函数,主函数。
 * 参数:无
 * 返回值:无
********************************************************************************************************/
void  main (void) {
   // INT8U  err;
    // #define AT91C_BASE_AIC       ((AT91PS_AIC) 	0xFFFFF000) // (AIC) Base Address
    //AT91C_BASE_AIC->AIC_IDCR = 0xffffffff;  // 禁止所有中断, ???
    
    //OSInit();                               // 初始化 uC/OS-II,先于OSStart().
    
    AT91_init();
    while (1) {
       AppStartTask();
    }
     /* OSTaskCreateExt(AppStartTask,           //OSTaskCreateExt(...) args 意义???
                    (void *)0,
                    (OS_STK *)&AppStartTaskStk[TASK_STK_SIZE-1],
                    TASK_START_PRIO,
                    TASK_START_PRIO,
                    (OS_STK *)&AppStartTaskStk[0],
                    TASK_STK_SIZE,
                    (void *)0,
                    OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
    */
  //  OSTaskNameSet(TASK_START_PRIO, "Start Task", &err); 


  //  OSStart();                              // 启动多任务
    
}


//=============================================================================================
static void  AT91_init(void) {

   //int Vtemp = 0; 
  // AT91C_BASE_RSTC->RSTC_RMR = AT91C_RSTC_URSTEN | (0x4<<8) | (unsigned int)(0xA5<<24); // 允许复位,最小复位时间960 us
   AT91C_BASE_RSTC->RSTC_RMR = AT91C_RSTC_URSTEN | (0x4<<8) | (unsigned int)(0xA5<<24); // 允许复位,最小复位时间960 us  
   AT91C_BASE_WDTC->WDTC_WDMR|= 0x3<<13 |0xFFF<<0 |0xfff<<16;   // 看门狗(注意要关Cstartup_SAM7.c中AT91C_BASE_WDTC->WDTC_WDMR= AT91C_WDTC_WDDIS这句)
   AT91C_BASE_WDTC->WDTC_WDCR|=0xA5<<24 |0x1<<0;   //不被置位则看门狗重启系统
   AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_PIOA ) ;
   
   //*AT91C_PMC_PCER=1 << AT91C_ID_PIOA;   // 允许PIOA时钟
   AT91F_PIO_CfgOutput( AT91C_BASE_PIOA, LED1|RESET ) ;  // PIOA配置为输出,用于LED
   AT91F_PIO_CfgOutput(AT91C_BASE_PIOA, A0|A1|A2|CSA|CSB|IOW|IOR);
   
   AT91F_PIO_CfgOutput(AT91C_BASE_PIOA, powerswithTV1|powerswithTV2|powerswithCommunication1|powerswithCommunication2);  
   
   *AT91C_PIOA_SODR|=LED1;
   *AT91C_PIOA_SODR|=RESET;    //st16c2550复位
   *AT91C_PIOA_SODR|=(CSA|CSB|IOW|IOR); //置csa、csb、iow、ior为高
  // AT91F_PIO_CfgInput(AT91C_BASE_PIOA,INTA|INTB);   //设置inta 和intb作为输入

   //设置inta中断 RX3 TX3 中断  接罗盘

  AT91F_PIO_CfgPeriph(AT91C_BASE_PIOA,INTA,0);
  *AT91C_AIC_IDCR= (unsigned int)0x1 <<AT91C_ID_IRQ1;
  AT91C_BASE_AIC->AIC_SVR[AT91C_ID_IRQ1]=(unsigned int)IRQ1_pio_c_irq_handler;
  AT91C_BASE_AIC->AIC_SMR[AT91C_ID_IRQ1]=AT91C_AIC_SRCTYPE_POSITIVE_EDGE|IRQ1_PIO_INTERRUPT_LEVEL;
  *AT91C_AIC_ICCR= (unsigned int)0x1 <<AT91C_ID_IRQ1;
// AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_IRQ1);
  *AT91C_AIC_IECR= (unsigned int)0x1 <<AT91C_ID_IRQ1;  

 
   /*   
    //设置intb中断 RX4 TX4 中断
    AT91F_PIO_CfgPeriph(AT91C_BASE_PIOA,INTB,0);
   *AT91C_AIC_IDCR= (unsigned int)0x1 <<AT91C_ID_IRQ0;
   AT91C_BASE_AIC->AIC_SVR[AT91C_ID_IRQ0]=(unsigned int)IRQ0_pio_c_irq_handler;
   AT91C_BASE_AIC->AIC_SMR[AT91C_ID_IRQ0]=AT91C_AIC_SRCTYPE_POSITIVE_EDGE|IRQ0_PIO_INTERRUPT_LEVEL;
  
   *AT91C_AIC_ICCR= (unsigned int)0x1 <<AT91C_ID_IRQ0;
   AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_IRQ0);
   */    
   *AT91C_PIOA_CODR|=LED1;                       //light LED1
   *AT91C_PIOA_CODR|=RESET;                      //st16c2550复位为低   
    
   *AT91C_PIOA_SODR|=(powerswithTV1|powerswithTV2|powerswithCommunication1|powerswithCommunication2);                      //
   
   Delay(50000); 
   InitST16C2550(); 
   InitUSART0();
   InitUSART1();
   InitADC(); 
  // timer0_init();
   
   Delay(50000); 
   
   for(int i=0;i<1000;++i)
   {
     Delay(50000); 
   }
    send_portA_char(0x67);
    Delay(20000);
    send_portA_char(0x6f);   
    Delay(20000);
    send_portA_char(0x0d);   
    GetValue_chanel5();   
 

}
//=============================================================================================
/*********************************************************************************************************
 *说明:AppStartTask函数,用于任务。
 * 参数:void *p_arg (参数由OSTaskCreate()传递给AppStartTask())
 * 返回值:无
********************************************************************************************************/
static  void  AppStartTask () {
  //  unsigned long i;
  int Length;
  unsigned char checksum;
  int i;      
  int Vtemp=0;
  while(1)
  {
   AT91C_BASE_WDTC->WDTC_WDCR|=0xA5<<24 |0x1<<0; 
   if(measure_data_flag==1)
   {
        if(posflag==0) poscount++;             //监测罗盘状态
         if(poscount>=10)
         {
           send_portA_char(0x67);
           Delay(20000);
           send_portA_char(0x6f);   
           Delay(20000);
           send_portA_char(0x0d);  
         }
         posflag=0;//等待下一次罗盘中断
         measure_data_flag=0;
         strcat(measure_data,(char *)str_compass);
         Length=strlen(measure_data);
         measure_data[Length]=',';
         measure_data[Length+1]=0;
         strcat(measure_data,(char *)str_pitch);
         Length=strlen(measure_data);
         measure_data[Length]=',';
         measure_data[Length+1]=0;
         strcat(measure_data,(char *)str_roll);
         Length=strlen(measure_data);
         measure_data[Length]=0;
         GetValue_chanel5();
         Vtemp=(int)(V*10.0);
         sprintf(measure_data,"%s,%d,%c,",measure_data,Vtemp,PowerState);
         Length=strlen(measure_data);
         
         
         checksum=0;
         for(i=0;i<Length;++i)
         {
              checksum^=measure_data[i];
                   
         }
         checksum=checksum&0xff;
         measure_data[Length]=(checksum>>4)|0x0030;
         measure_data[Length+1]=(checksum & 0x000f)|0x0030;
         measure_data[Length+2]=0x0d;
         measure_data[Length+3]=0x0a;
         measure_data[Length+4]=0x00;        
         AT91F_US_SendFrame(COM0,(char *)measure_data,strlen(measure_data),0,0);
              if(Light==1)
             {
                *AT91C_PIOA_SODR|=LED1;                      //light LED1
                Light=0;
             }
             else
             {
                *AT91C_PIOA_CODR|=LED1;                      //close LED1
                Light=1;
             }             
        // write_char_USART0(measure_data[0]);
  
     }
  
 
  }
}

⌨️ 快捷键说明

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