📄 main_pre.c
字号:
/****************************************Copyright (c)**************************************************
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Descriptions:
**
********************************************************************************************************/
#include "config.h"
#include "stdlib.h"
void TaskStart(void *pdata);
//void Task2(void *pdata);
#define TASK_STK_SIZE 128
#define total_bit 15
#define capture_info_len 3
#define capture_info_gene 3
OS_STK TaskStartStk[TASK_STK_SIZE];
typedef struct {
INT32U irda_time[capture_info_gene];//每帧数据的间隔
INT32U irda_tc_time; //每位数据相对于TC的时间
INT16U irda_data[capture_info_gene];//一帧数据的数据码
INT16U bit_count;//每帧数据的位计数
INT16U total_frame;
INT16U frame_use;
INT32U irda_gene;
INT32U irda_mark;
}irda_struct_t;
irda_struct_t capture_info[capture_info_len];
INT16U cap;
INT8U tm[24],*tmp;
static OS_EVENT *IRDA_Mbox;
typedef struct sla {
INT32U *next;
INT32U *prev;
INT32U cnt;
}slab_t;
INT32U rece[2];
static void Timer1Exception(void);
/*********************************************************************************************************
** 函数名称: main
** 功能描述: c语言的主函数,由它启动多任务环境
********************************************************************************************************/
int main (void){
OSInit();
OSTaskCreate(TaskStart, (void *)0, &TaskStartStk[TASK_STK_SIZE - 1], 4);
//OSTaskCreate(Task2, (void *)0, &Task2Stk[TASK_STK_SIZE - 1], 5);
OSStart();
return 0;
}
/*********************************************************************************************************
** 函数名称: Task2
** 功能描述: μCOS-II的第2个任务。等待TaskUart0Revice接收一到帧数据,
** 然后将数据进行转换,再从UART0发出。
** 输 入: pdata 任务附加参数pdata = pdata;
** 输 出: 无
********************************************************************************************************
void Task2(void *pdata){
INT8U *cpx;
INT8U px;
pdata = pdata;
while (1) {
do
{
px = 0;
cpx = &px;
UART_read(1, cpx, 1, 0);
} while (*cpx != 0xfa);
//UART_write(1, cpx, 1, 2);
cpx=(INT8U *)sectors[0].addr;
UART_write(1, cpx, iap_info.total_len, 0);
}
}
/*********************************************************************************************************
** 函数名称: TaskStart
** 功能描述: μCOS-II的第一个任务。等待TaskUart0Revice接收一到帧数据,
** 然后将数据进行转换,再从UART0发出。
** 输 入: pdata 任务附加参数pdata = pdata;
** 输 出: 无
********************************************************************************************************/
void TaskStart(void *pdata){
INT8U err,i,*cpx;
INT8U cmd_byte[4],*cmd;
slab_t slab,*slabp;
INT32U **slax,stemp;
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr;
#endif
pdata = pdata;
TargetInit();
UART_Init(0);
UART_open(0, 19200, 8, 'n', 0);
UART_Init(1);
UART_open(1, 19200, 8, 'n', 0);
slabp = &slab;
stemp = 0xfe;
slabp->next = &stemp;
slabp->cnt = 0xff00ff00;
slax = &slabp->next;
*slax =rece;
PINSEL1 |= 3<<10; //Pin0.21 used as cap1.3
T1CCR = 0X0C00; //下降沿,中断
T1PR = 1459;
T1TC = 0;
T1CTCR = 0X0C;
T1IR = 0XFF;
T1TCR = 1;
VICVectAddr1 = (uint32)Timer1Exception;
VICVectCntl1 = (0x20 | 0x05);
VICIntEnable = 1<<5;
cap = 0;
memset(capture_info,0,sizeof(irda_struct_t)*4);
IRDA_Mbox=OSMboxCreate(NULL);
if (IRDA_Mbox == NULL) while(1);
while (1)
{
cpx = OSMboxPend(IRDA_Mbox,0,&err);
//UART_write(0, cpx, 6, 3);
if (cpx)
{
for (i=0;i<capture_info_len;i++)
{
switch(cpx[2*i+1])
{
case 0x40 : cmd_byte[i] = 0x0b; break;
case 0x80 : cmd_byte[i] = 0x0c; break;
case 0x08 : cmd_byte[i] = 0x01; break;
case 0x88 : cmd_byte[i] = 0x02; break;
case 0x48 : cmd_byte[i] = 0x03; break;
case 0xc8 : cmd_byte[i] = 0x04; break;
case 0x28 : cmd_byte[i] = 0x05; break;
case 0xa8 : cmd_byte[i] = 0x06; break;
case 0x68 : cmd_byte[i] = 0x07; break;
case 0xe8 : cmd_byte[i] = 0x08; break;
case 0x18 : cmd_byte[i] = 0x09; break;
case 0x98 : cmd_byte[i] = 0x00; break;
default : break;
}
}
cmd = cmd_byte;
if ((*cmd == 0x0c) || (*cmd == 0x0b))
{
UART_write(0, cmd_byte, 3, 3);
cmd_byte[0] = 0xff;
cmd_byte[1] = 0xff;
cmd_byte[2] = 0xff;
cmd_byte[3] = 0xff;
}
cpx = NULL;
}
}
}
/*********************************************************************************************************
** 函数名称: Timer1Exception
** 功能描述: timer1中断处理程序
** 输 入: 无
** 输 出: 无
********************************************************************************************************/
static void Timer1Exception(void)
{
irda_struct_t *ptr;
INT32U time1,time;
INT8U i;
T1IR = 1<<7;
ptr = &capture_info[cap];
time1 = OSTimeGet();
time = T1CR3;
if (ptr->bit_count == 16)
{
ptr->irda_mark = 0;
ptr->bit_count = 0;
//*tmp++ = 0xee;
//UART_write(1, tm, 20, 13);
if (ptr->total_frame == 2) //3中取1
{
ptr->frame_use=(ptr->irda_data[0]==ptr->irda_data[1])? 1: (capture_info_len+5);
ptr->frame_use=(ptr->irda_data[0]==ptr->irda_data[2])? 2: ptr->frame_use;
ptr->frame_use=(ptr->irda_data[1]==ptr->irda_data[2])? 2: ptr->frame_use;
if (ptr->frame_use > (capture_info_len-1))
{ //误码
ptr->total_frame = 0;
goto err;
}
cap++;
}
else
{
ptr->total_frame++;
}
if ((cap > 0) &&((capture_info[cap].irda_time[capture_info[cap].frame_use] - \
capture_info[cap-1].irda_time[capture_info[cap-1].total_frame - 1]) > 200*5))
{ //判断连续2次按键时间是否超过5s,若是则忽略该组按键
for (i=0; i<cap; i++)
{
capture_info[i].irda_mark = 0;
capture_info[i].bit_count = 0;
capture_info[i].total_frame = 0;
}
cap = 0;
}
if (cap == capture_info_len)
{ //按键完毕
INT8U temp[8],*cp;
INT16U tem;
capture_info[0].irda_gene = capture_info[capture_info_len-1].irda_gene;
cp = (INT8U *)rece;
for (i=0;i<capture_info_len;i++)
{
tem = capture_info[i].irda_data[ptr->frame_use];
*cp++ = (tem & 0xff00) >> 8;
*cp++ = tem & 0x00ff;
capture_info[i].irda_mark = 0;
capture_info[i].bit_count = 0;
capture_info[i].total_frame = 0;
}
cap = 0;
OSMboxPost(IRDA_Mbox,(void *)rece);
goto err;
}
}
if (!ptr->irda_mark)
{
if (ptr->total_frame == 0)
{
ptr->irda_data[0] = 0;
ptr->irda_data[1] = 0;
ptr->irda_data[2] = 0;
}
if ((cap==0) && (ptr->total_frame==0) && (time1-ptr->irda_gene < 600))
{
goto err;
}
ptr->irda_gene = time1;
if ((ptr->total_frame>0) && (ptr->total_frame<capture_info_gene) \
&&((ptr->irda_gene - ptr->irda_time[ptr->total_frame-1]) > 40))
{ //误触发
ptr->total_frame = 0;
goto err;
}
if ((cap > 0)&&((ptr->irda_gene - capture_info[cap-1].irda_gene) < 80))
{ //判断按键间隔
ptr->total_frame = 0;
capture_info[cap-1].irda_gene = ptr->irda_gene;
goto err;
}
ptr->irda_tc_time = time;
ptr->irda_mark = 1;
ptr->irda_time[ptr->total_frame] = ptr->irda_gene;
//tmp = tm;
//*tmp++ = 0xff;
}
else
{
INT8U x;
time1 = time;
x = time - ptr->irda_tc_time;
ptr->irda_tc_time = time1;
if ((x < 100)&&(x > 85))
{
ptr->irda_mark |= 1<<1;
//*tmp++ = x;
}
else if((x < 44)&&(x> 24))
{
ptr->irda_mark |= 1<<2;
if (ptr->bit_count != 8) ptr->bit_count=8;
//*tmp++ = x;
}
else if((x < 20)&&(x > 14))
{
ptr->irda_data[ptr->total_frame] |= 1 << (total_bit-ptr->bit_count);
ptr->bit_count++;
//*tmp++ = x;
}
else if ((x < 11) && (x>4))
{
ptr->bit_count++;
//*tmp++ = x;
}
}
err :
VICVectAddr=0x00;
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -