📄 main.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 + -