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

📄 main.c

📁 在UCOS-II操作系统成功移植到AT91SAM7S64的基础上
💻 C
字号:
//app.c

#include <includes.h>

#define TASK_STK_SIZE   128
#define TASK_START_PRIO   5
#define IRQ1_PIO_INTERRUPT_LEVEL 3

OS_STK  AppStartTaskStk[TASK_STK_SIZE];
AT91PS_USART COM0 = AT91C_BASE_US0;
AT91PS_USART COM1 = AT91C_BASE_US1;

unsigned char receiverdata_portA;
unsigned char receiverdata_portB;
unsigned char receiver_porta_state;
unsigned char receiver_portb_state;
unsigned char ReceiverStr1[100];
unsigned char ReceiverStr2[100];
unsigned char isReceiverData;
unsigned char IsStartCommand;

struct {
    float time;
    double latitude;
    double longitude;
    int GPSquality;
    int GPSNum;
    double GPSprecision;
    double GPSHight;
}GPSData;

//罗盘变量
unsigned char str_compass[10] = "99";
unsigned char str_pitch[10] = "99";
unsigned char str_roll[10] = "99";
unsigned char Temperater[10];

float compass = 999;
float pitch = 999;
float roll = 999;
int posflag = 0;  //罗盘数据全部收齐
int poscount = 0; //罗盘没有进入中断标志

//发送数据变量
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;
float V = 99;

//指示灯变量
int Light = 1;

static void AppStartTask(void *p_arg);
static void AT91initIRQ1();

/****************************************************************************************
说明:至少延时1.2uS,根据单片机主频调整 
****************************************************************************************/
void mDelay1_2uS( ) 
{
    unsigned long ms;
    ms = 2;
    while ( ms -- ) ;
}

/*****************************************************************************************
说明:延时指定毫秒时间,根据单片机主频调整,不精确 
*****************************************************************************************/
void mDelaymS( unsigned long ms )
{
    unsigned long i;
     
    while ( ms -- )
    {
        i=8000;
        while ( i -- );
    }
}

/*****************************************************************************************
说明: 延时 MCK/100 (47923200/100)
*****************************************************************************************/
void delay ( void )
{
    INT32U i ;
    for(i = 0; i < MCK/100; i++) ;
}

/*********************************************************************************************************
 * 说明:main函数,主函数。
 * 参数:无
 * 返回值:无
********************************************************************************************************/
void  main (void) {
    BSP_IntDisAll();   // 禁止所有中断

    OSInit();          // 初始化 uC/OS-II
    
    OSTaskCreateExt(AppStartTask,       // 创建任务
                    (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);   //任务堆栈检查,清空

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

/*********************************************************************************************************
 * 说明:AppStartTask函数,用于任务。
 * 参数:void *p_arg (参数由OSTaskCreate()传递给AppStartTask())
 * 返回值:无
********************************************************************************************************/
static void AppStartTask (void *p_arg) {
    int Length;                // 数据包当前长度
    unsigned char checksum;    // 校验和
    int i;      
    int Vtemp = 0;
    (void)p_arg;
  
    CPU_Init();                // 初始化处理器指定块
    BSP_Init();                // 初始化 BSP
    
    AT91initIRQ1();            // 初始化IRQ中断 罗盘
    InitUSART0();              // 初始化USART0
    InitUSART1();              // 初始化USART1
  
    while (1) {   
        //if(measure_data_flag == 1) {    // GPS模块已经更新
         //   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;
            
            // AD模块数据
            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; 
            
#if OS_CRITICAL_METHOD == 3                   
    OS_CPU_SR  cpu_sr = 0;
#endif        
           OS_ENTER_CRITICAL();
           AT91F_US_SendFrame(COM0, (char *)measure_data, strlen(measure_data), 0, 0);
           OS_EXIT_CRITICAL(); 
   //     }
    }
}

static void AT91initIRQ1()
{
    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为高

    //设置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;
    *AT91C_AIC_IECR = (unsigned int)0x1 << AT91C_ID_IRQ1;  
    
    *AT91C_PIOA_CODR |= LED1;                      
    *AT91C_PIOA_CODR |= RESET;    //st16c2550复位为低   
    *AT91C_PIOA_SODR |= (powerswithTV1 | powerswithTV2 | powerswithCommunication1 | powerswithCommunication2);   
   
 
    Delay(50000); 
    InitST16C2550(); 
    InitADC(); 
  
    Delay(50000); 
    int i;
    for(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(); 

}

⌨️ 快捷键说明

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