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