|
发表于 2011-4-29 08:56:47
|
显示全部楼层
我这边有写好的架构代码经常用的你可以参考一下,基本上8bit的所有单片机都可以使用:
(原文件名:新建位图图像.jpg)
os.c:
----------
#include "all.h"
void main()
{
__disable_interrupt();
BOIS_Init();
__enable_interrupt();
while(1)
{
//Addr_Scan_Task();
while( Task_Event == No_Event ){}
// if( Key_Scan_Event == true )
// Key_Scan_Task();
// if(LED_Scan_Event == true)
//LED_Scan_Task();
// if(ACK_SIMKey_Event)
// {
/// R_SIMKEY_DriverACKToHost_Code();
// ACK_SIMKey_Event = false;
// }
if(Send_SIMKey_Event&&PS2_Send_End)
{
W_SIMKEY_DriverSendToHost_Code();
Send_SIMKey_Event = false;
}
if(UART_Pakeg_Event)
UART_DePakeg_Task();
if(Time100ms_Event)
{
EvQuePut(Ev100ms_ID,NULL);//each 100ms put event id to queue
Switch_Status_Scan_Task();
Time100ms_Event = false;
}
if( I2C_Write_OK_FG)
{
EvQuePut(EvI2C_Write_OK_ID,NULL);
I2C_Write_OK_FG =false;
}
if( I2C_Read_OK_FG)
{
EvQuePut(EvI2C_Read_OK_ID,EEPROM_buf);
I2C_Read_OK_FG =false;
}
if(Key_Scan_Event )
Key_Scan_Task();
if( System_Delay_FG && System_Delay==0)
{
EvQuePut(EvDelay_Time_END_ID,NULL);
System_Delay_FG = false;
}
if(Dispatch_Event == true)
Dispatch_Task();
}
}/************************** OS ****************************************/
void Dispatch_Task()
{
unsigned char Msg;
pSYS_MS Now_Que_Ms= GetEvQue();
if(Now_Que_Ms==NULL)
return;
RunAnyTime_FG = true;
Msg = (Mode_Tab[Now_Mode_ID].pFunc)(Now_Que_Ms->MS_ID,Now_Que_Ms->MS_Data); //run function
if(RunAnyTime_FG)
AnyTime_Task(Now_Que_Ms->MS_ID,Now_Que_Ms->MS_Data);
}
void EvQuePut(unsigned char Even_ID,void *MS) //put event to queue
{
Now_Que_Counter++;
if( Now_Que_Counter > Max_QueSize )
{
Task_Event = No_Event;
// Show_Error(MSErr_QueFull_ID);
return;
}
else
{
Que_R = ((Que_R+1)%Max_QueSize);
Que_MS[Que_R].MS_ID = Even_ID;
Que_MS[Que_R].MS_Data = MS;
}
Dispatch_Event = true;
}
pSYS_MS GetEvQue() //get event from queue
{
pSYS_MS Temp=NULL;
Now_Que_Counter--;
if( Now_Que_Counter < 0 )
{
Dispatch_Event = false;
Now_Que_Counter = 0;
Temp = NULL;
}
else
{
Que_F = ((Que_F+1)%Max_QueSize);
Dispatch_Event = true;
Temp = &Que_MS[Que_F];
}
return Temp;
}
/********** switch mode **************************************/
void Into_Mode(unsigned char Mode_ID)
{
(Init_Mode_Tab[Mode_ID].pFunc_Init)(Mode_ID); //change mode
Now_Mode_ID = Mode_ID;
}
/********** Clear Buffer **************************************/
void Clear_Buffer(unsigned char *Buf,unsigned int Size)
{
register unsigned int i;
for(i=0;i< Size ; i++)
Buf=0x00;
}
ISR.c
--------------
#include "all.h"
//----------------------------------------------------------
//********************************************************
//*********************ISR_Init***************************
void ISR_Init()
{
//stop errant interrupts until set up
// _CLI(); //disable all interrupts
XDIV = 0x00; //xtal divider
XMCRA = 0x00; //external memory
MCUCR = 0x00;
EICRA = 0x00; //extended ext ints
EICRB = 0x00; //extended ext ints
EIMSK = 0x00;
TIMSK = 0x00; //timer interrupt sources
ETIMSK = 0x00; //extended timer interrupt sources
//all peripherals are now initialized
// Time Connter
timer1_init();
timer2_init();
TIMSK = 0x44; //timer interrupt sources
// _SEI(); //re-enable interrupts
}
//**********************************************************
//*************TIMER1 initialize - prescale:1***************
//**********************************************************
// WGM: 0) Normal, TOP=0xFFFF
// desired value: 1mSec
// actual value: 1.000mSec (0.0%)
// CSn2 CSn1 CSn0 说明
// 0 0 0 无时钟源 (T/C 停止)
// 0 0 1 clkI/O/1 ( 无预分频)
// 0 1 0 clkI/O/8 ( 来自预分频器)
// 0 1 1 clkI/O/64 ( 来自预分频器)
// 1 0 0 clkI/O/256 ( 来自预分频器)
// 1 0 1 clkI/O/1024 ( 来自预分频器)
// 1 1 0 外部Tn 引脚,下降沿驱动
// 1 1 1 外部Tn 引脚,上升沿驱动
//**********************************************************
void timer1_init(void)
{
TCCR1B = 0x00; //stop
TCNT1H = 0xD1; //setup
TCNT1L = 0x20;
OCR1AH = 0x2E;
OCR1AL = 0xE0;
OCR1BH = 0x2E;
OCR1BL = 0xE0;
OCR1CH = 0x2E;
OCR1CL = 0xE0;
ICR1H = 0x2E;
ICR1L = 0xE0;
TCCR1A = 0x00;
TCCR1B = 0x01; //start Timer
}
//**********************************************************
//*************TIMER0 initialize - prescale:64**************
//**********************************************************
// WGM: Normal
// desired value: 1mSec
// actual value: 0.997mSec (0.3%)
void timer0_init(void)
{
TCCR0 = 0x00; //stop
ASSR = 0x00; //set async mode
TCNT0 = 0x45; //set count
OCR0 = 0xBB;
TCCR0 = 0x04; //start timer
}
//**********************************************************
//*************TIMER2 initialize - prescale:64**************
//**********************************************************
//TIMER2 initialize - prescale:8
// WGM: Normal
// desired value: 38uSec
// actual value: 38.000uSec (0.0%)
void timer2_init()
{
TCCR2 = 0x00; //stop
TCNT2 = 0xC7; //setup
OCR2 = 0x39;
TCCR2 = 0x02; //start
}
//**********************************************************
//*******interrupt_handler timer0_ovf_isr:iv_TIM0_OVF*******
//**********************************************************
#pragma vector = TIMER0_OVF_vect
__interrupt void timer0_ovf_isr(void)
{
TCNT0 = 0x45; //reload counter value
}
#pragma vector = TIMER1_OVF_vect //interrupt_handler timer1_ovf_isr:iv_TIM1_OVF
__interrupt void timer1_ovf_isr(void)
{
TCNT1H = 0xD1; //reload counter high value
TCNT1L = 0x20; //reload counter low value
TimeBase_1ms++;
if(TimeBase_Key_Push>0)
TimeBase_Key_Push--;
if((TimeBase_1ms%5)==0)
{
if(RST) _WDR();
TimeBase_5ms++;
TimeBase_for_Key_Scan_Time++;
if(TimeBase_for_Key_Scan_Time>=5)
{
TimeBase_for_Key_Scan_Time =0 ;
Key_Scan_Event = true;
}
if(TimeBase_5ms >=20)
{
TimeBase_5ms = 0;
Time100ms_Event = true;
}
}
if(TimeBase_RxCharOverTime > 0 )
TimeBase_RxCharOverTime --;
else
{
if( Rx_Point != -1 && UART_Pakeg_Event == false)
{
UART_Pakeg_Event = true;
RXMST = Rx_Waiting;
}
}
if( Wait_TxWait > 0 )
Wait_TxWait--;
if(System_Delay>0)
System_Delay --;
}
//**********************************************************
//*******interrupt_handler timer2_ovf_isr:iv_TIM0_OVF*******
//**********************************************************
#pragma vector = TIMER2_OVF_vect
__interrupt void timer2_ovf_isr(void)
{
TCNT2 = 0xC7; //reload counter value
}
function.c
----------------------
#include "All.h"
__flash INIT_MAPPER Init_Mode_Tab[]=
{
Init_Start_Mode,
Init_Study_Mode,
Init_Setting_Mode,
Init_Run_Mode,
Init_Retention_Mode,
Init_ExtKey_Play_Mode,
};
__flash MAPPER Mode_Tab[]=
{
Start_Mode,
Study_Mode,
Setting_Mode,
Run_Mode,
Retention_Mode,
ExtKey_Play_Mode,
};
__flash UART_CMD_MAPPER UART_CMD_Tab[]=
{
UART_MB_CMD_Group, // 小卡通用命令群
UART_MBIO_CMD_Group, // 小卡IO 控制群
UART_MBINFO_CMD_Group, // 小卡INFO 命令群
UART_EEPROM_CMD_Group, // EEPROM 操作命令群
UART_SIMKEY_CMD_Group, // 按鍵命令直接操做命令群
};
init_app.c
--------------------------------
#include "all.h"
void Init_Start_Mode(unsigned char NewMode_ID)
{
// unsigned char cnt=0;
// unsigned char Temp[4]={0};
/*
unsigned char Buf[64]={0};
Fill_Char_To_Buffer(Buf,0x00,64);
UART_Reply_Buf(0x01,Buf,64,true);
*/
// unsigned char Buf[64]={0};
// Fill_Char_To_Buffer(Buf,0x00,64);
// eeprom_TWI_Master_RW(0x5A,0x01,Buf, 64 );
// eeprom_write(0x01,'J');
// eeprom_write(0x02,'K');
/* FIFO */
//SIMKey_FIFO_Put(eeprom_read(0x01)) ;
//SIMKey_FIFO_Put(eeprom_read(0x02)) ;
//Temp[cnt++] = (SIMKey_FIFO_Get())[0];
// HW_UART_RX_BUF = (SIMKey_FIFO_Get())[0];
//Temp[cnt++] = (SIMKey_FIFO_Get())[0];
//HW_UART_RX_BUF = Temp[(cnt-1)];
SystemDelay_ms(5);
}
void Init_Study_Mode(unsigned char NewMode_ID)
{
}
void Init_Setting_Mode(unsigned char NewMode_ID)
{
APP_OP_Index=0;
APP_OP_Size=0;
LED_D5(true);
LED_D6(true);
LED_D7(true);
LED_D8(true);
PC_Command=PCCommand_IDEL;
}
void Init_Retention_Mode(unsigned char NewMode_ID)
{
}
void Init_Run_Mode(unsigned char NewMode_ID)
{
//指令歸零
Run_Commnd_Counter = 0;
Total_Command=0;
Commnd_Run_Index=0;
// 讀出前面的2 BYTE
// 兩BYTE 為指令全部數量
COMMAND_Buf[0] = Cmd_Read_Total_instruction;
COMMAND_Buf[1] = 0;
COMMAND_Buf[2] = 0;
//Read_Get_Total_COMD();
}
void Init_ExtKey_Play_Mode(unsigned char NewMode_ID)
{
AutoRun_END = false;
I2C_ReadNByte (0xA0, 2,0x0000, &KeyCode_buf[0], 32);
KEY_AutoRun.KEY_RUN_Counter= KeyCode_buf[0];
KEY_AutoRun.PowerOn_KEY1_TIME= KeyCode_buf[1];
KEY_AutoRun.KEY1_KEY2_TIME= KeyCode_buf[2];
}
anytime.c
---------------------------
#include "All.h"
unsigned int AnyTime_Task(unsigned char MS_ID,void *MS)
{
//unsigned char Temp,KeyTime,Key_Now_ST;
switch(MS_ID)
{
case EvKey_ID:
//Temp = ((pKEY_MESSAGE)MS)->KEY_CODE;
//KeyTime = ((pKEY_MESSAGE)MS)->Push_Time;
//Key_Now_ST = ((pKEY_MESSAGE)MS)->Key_Now_ST;
break;
case Ev100ms_ID:
break;
}
return true;
}
all.h
-------------------------------
//#define TEST
#define FW_Version 0x00000026 // V0.26
// AVR_64 Base
//\inc
#include <iom64.h>
#include <avr_macros.h>
#include <intrinsics.h>
#include <stdbool.h>
#include <comp_a90.h>
#include <inavr.h>
//\inc\clib
#include <stdio.h>
#include <limits.h>
#include <iso646.h>
#include "Typedef.h"
#include "IOMap.h"
#include "Var.h"
#include "CommandRun.h"
#include "eeprom24CXX.h"
//Iint
#include "Init.h"
#include "OS.h"
#include "functab.h"
#include "ISR.h"
#include "UARTCmd.h"
// Apps
#include "App.h"
#include "Anytime.h"
#include "Init_App.h"
//Driver
#include "DV_Key.h"
//#include "DV_EEPROM.h"
#include "DV_comm.h"
#include "DV_input.h"
#include "DV_ps2.h"
#include "DV_I2C.h"
#include "DV_WatchDog.h"
#include "DV_KeyRun.h"
os.h
------------------
typedef struct {
unsigned char Bit0:1;
unsigned char Bit1:1;
unsigned char Bit2:1;
unsigned char Bit3:1;
unsigned char Bit4:1;
unsigned char Bit5:1;
unsigned char Bit6:1;
unsigned char Bit7:1;
}Byte_Of_bit,*pByte_Of_bit;
typedef struct { /* WORD Access*/
unsigned int Bit0:1;
unsigned int Bit1:1;
unsigned int Bit2:1;
unsigned int Bit3:1;
unsigned int Bit4:1;
unsigned int Bit5:1;
unsigned int Bit6:1;
unsigned int Bit7:1;
unsigned int Bit8:1;
unsigned int Bit9:1;
unsigned int Bit10:1;
unsigned int Bit11:1;
unsigned int Bit12:1;
unsigned int Bit13:1;
unsigned int Bit14:1;
unsigned int Bit15:1;
}Word_Of_bit,*pWord_Of_bit;
typedef struct SYS_MS
{
unsigned int MS_ID;
void *MS_Data;
}SYS_MS,*pSYS_MS;
/* MyDefInit_AppFuncType */
typedef struct {
void (*pFunc_Init)(unsigned char NewMode_ID); /* Pointer to fnt which processes msg */
} INIT_MAPPER, *PINIT_MAPPER;
/* MyDefFuncType */
typedef struct {
unsigned int (*pFunc)(unsigned char MS_ID,void *MS); /* Pointer to fnt which processes msg */
} MAPPER, *PMAPPER;
/* MyDefUARTCmd TYPE */
typedef struct {
unsigned int (*pUART_Cmd_Func)(unsigned char CmdSub_ID,void *MS); /* Pointer to fnt which processes msg */
} UART_CMD_MAPPER, *PUART_CMD_MAPPER;
/***************************************************************************/
/* Runing App Mode */
/***************************************************************************/
extern unsigned char Now_Mode_ID;
/***************************************************************************/
/* Que Message */
/***************************************************************************/
#define Max_QueSize 15
extern char Que_R;
extern char Que_F;
extern unsigned char Now_Que_Counter; /*Que Message*/
extern SYS_MS Que_MS[Max_QueSize];
extern unsigned char Err_Code_Umb;
/***************************************************************************/
/* Event FG */
/***************************************************************************/
extern volatile unsigned char Task_Event;
#define Key_Scan_Event ((pByte_Of_bit)&Task_Event)->Bit0 /* Key Driver Task*/
#define Dispatch_Event ((pByte_Of_bit)&Task_Event)->Bit1 /* Run App */
#define UART_Pakeg_Event ((pByte_Of_bit)&Task_Event)->Bit2
#define Time100ms_Event ((pByte_Of_bit)&Task_Event)->Bit3
#define Send_SIMKey_Event ((pByte_Of_bit)&Task_Event)->Bit4
#define ACK_SIMKey_Event ((pByte_Of_bit)&Task_Event)->Bit5
#define No_Event 0
/***************************************************************************/
/* System reg fg */
/***************************************************************************/
extern volatile unsigned int System_Fg;
typedef struct System_FG_ST
{
unsigned int Key_ST_FG:2; /* Key ME ST*/
unsigned int RunAnyTimeTask_FG:1;
unsigned int LEDSpk_FG:1;
unsigned int I2C_Write_OK_FG:1;
unsigned int I2C_Read_OK_FG:1;
unsigned int I2C_WriteTimeOut_FG:1;
unsigned int I2C_ReadTimeOut_FG:1;
unsigned int System_Delay_FG:1;
unsigned int PC_SMIKey_Save_FG:1;
unsigned int PC_SMI_Play_FG:1;
unsigned int Ex_Key_Save_FG:1;
}System_FG_ST,*pSystem_FG_ST;
/* System */
#define KEY_SCREAN_KEY_ST ((pSystem_FG_ST)&System_Fg)->Key_ST_FG
#define RunAnyTime_FG ((pSystem_FG_ST)&System_Fg)->RunAnyTimeTask_FG
#define LEDSpk_FG_FG ((pSystem_FG_ST)&System_Fg)->LEDSpk_FG
#define I2C_Write_OK_FG ((pSystem_FG_ST)&System_Fg)->I2C_Write_OK_FG
#define I2C_Read_OK_FG ((pSystem_FG_ST)&System_Fg)->I2C_Read_OK_FG
#define I2C_WriteTimeOut_FG ((pSystem_FG_ST)&System_Fg)->I2C_WriteTimeOut_FG
#define I2C_ReadTimeOut_FG ((pSystem_FG_ST)&System_Fg)->I2C_ReadTimeOut_FG
#define System_Delay_FG ((pSystem_FG_ST)&System_Fg)->System_Delay_FG
#define PC_SMIKey_Save_FG ((pSystem_FG_ST)&System_Fg)->PC_SMIKey_Save_FG
// PC 模擬撥放模式
#define PC_SMI_Play_FG ((pSystem_FG_ST)&System_Fg)->PC_SMI_Play_FG
// 外接鍵盤儲存式
#define Ex_Key_Save_FG ((pSystem_FG_ST)&System_Fg)->Ex_Key_Save_FG
/***************************************************************************/
/* Time Base ReLoad Counter */
/***************************************************************************/
/* Time Base */
/*CPU_FZ*/
#define OSCSPEED 16000000 /* in Hz */
#define CPU_FZ OSCSPEED
/***************************************************************************/
/* Event ID */
/***************************************************************************/
#define EvCheckAppMode_ID 0
#define EvKey_ID 1
#define EvSwitchCheng_ID 2
#define Ev100ms_ID 3 /* 0.1S */
#define EvI2C_Read_OK_ID 4 // ID , MS = Buf Addr
#define EvI2C_Read_TimeOut_ID 5 //
#define EvI2C_Write_OK_ID 6 // ID , MS = NULL
#define EvI2C_Write_TimeOut_ID 7 //
#define EvRunCommand_ID 8
#define EvRunCommand_END_ID 9
#define EvDelay_Time_END_ID 10 // 延池的時間到了
#define EvError_ID 0xFFFF /*Clear */
// function def
void Dispatch_Task();
void EvQuePut(unsigned char Even_ID,void *MS);
pSYS_MS GetEvQue();
void Into_Mode( unsigned char Mode_ID);
void Clear_Buffer(unsigned char *Buf,unsigned int Size);
void Fill_Char_To_Buffer(unsigned char *Buf,unsigned char CHAR,unsigned int Size);
void SystemDelay_ms(unsigned long ms);
void Copy_Buf2ToBuf1(unsigned char *Buf1,unsigned char *Buf2, unsigned int Size);
//SIMKey_FIFO
/***************************************************************************/
/* Que Message */
/***************************************************************************/
#define W_Max_KEYFIFO_Size 15
extern char W_SIMKEY_FIFO_R;
extern char W_SIMKEY_FIFO_F;
extern unsigned char W_Now_KEY_FIFO_Counter; /*Que Message*/
extern unsigned char W_SIMKEY_FIFO_BUF[W_Max_KEYFIFO_Size];
#define R_Max_KEYFIFO_Size 15
extern char R_SIMKEY_FIFO_F;
extern char R_SIMKEY_FIFO_R; /*Que Message*/
extern unsigned char R_Now_KEY_FIFO_Counter;
extern unsigned char R_SIMKEY_FIFO_BUF[R_Max_KEYFIFO_Size];
void W_SIMKey_FIFO_Put(unsigned char KEYCODE); //put event to queue
unsigned char* W_SIMKey_FIFO_Get(); //put event to queue
void R_SIMKey_FIFO_Put(unsigned char KEYCODE); //put event to queue
unsigned char* R_SIMKey_FIFO_Get(); //put event to queue
按照这种分层的写法,app和deriver层分开,同时整个程序不要用delay,最好都用状态机来实现;
修改原因:增加头文件 |
|