📄 main_entry.c
字号:
/***********************************************************************/
#include "ucos_ii.h"
#include "AT91RM9200.h"
#include "lcd.h"
/***********************************************************************/
#define N_TASKS 3 // Number of tasks
#define TASK_STK_SIZE 1024 // Stack size, in sizeof OS_STK, or int 32bit
#define LCD_ACCESS_BASE (int *)0x40000000 //nGS3
OS_STK TaskStk[N_TASKS][TASK_STK_SIZE]; // Tasks stacks
char key_matrix[4][5]=
{
{'a','+','1','2','3'},
{'b','-','4','5','6'},
{'c','*','7','8','9'},
{'=','/','(',')','0'}
};
OS_EVENT *mybox;
/***********************************************************************/
extern void Enable_CPU_Inter(void);
extern void OSTickISR(void);
extern void AT91F_DBGU_Printk(char *buffer);
extern unsigned int AT91F_AIC_ConfigureIt(AT91PS_AIC pAic,unsigned int irq_id,
unsigned int priority,unsigned int src_type,void (*newHandler) (void) );
extern void AT91F_AIC_EnableIt(AT91PS_AIC pAic, unsigned int irq_id );
extern unsigned int AT91F_PIO_GetInput(AT91PS_PIO pPio);
extern void AT91F_PIO_CfgInput(AT91PS_PIO pPio,unsigned int inputEnable);
extern void AT91F_PIO_CfgInputFilter(AT91PS_PIO pPio,unsigned int inputFilter);
extern void AT91F_PIO_InterruptDisable(AT91PS_PIO pPio,unsigned int flag);
extern void AT91F_PIO_CfgPullup(AT91PS_PIO pPio,unsigned int pullupEnable);
extern void AT91F_PIO_CfgOutput(AT91PS_PIO pPio,unsigned int pioEnable);
extern void AT91F_PIO_SetOutput(AT91PS_PIO pPio,unsigned int flag);
extern void AT91F_PIO_ClearOutput(AT91PS_PIO pPio,unsigned int flag);
/*
extern void Clear_Display(int* base_address);
extern void Set_Command_Mode(AT91PS_PIO pPio ,int position);
extern void Set_Write_Mode(AT91PS_PIO pPio, int position);
extern void Set_Display_Row(int* base_address, AT91PS_PIO pPio ,int position ,int row);
extern void Config_LCD(int* base_address, int set_entry_mode, int set_display,
int set_function, int position, AT91PS_PIO pPio, int row);
extern void Write_To_LCD(int* base_address, char written);
extern void Configure_LCD(AT91PS_PIO pPio ,int position);
*/
//extern int key_matrix_scan(int para);
void TC1_Enable(void);
void timer1_c_irq_handler(void);
/**************************************************************************/
void Task1(void * pParam)
{
int i;
unsigned char err;
void *msg;
TC1_Enable();
for(i=0;i<500;i++);
Config_LCD(LCD_ACCESS_BASE,0x06,0x0f,0x3c,14,AT91C_BASE_PIOC,0x80);
AT91F_DBGU_Printk(" Task 1 running! configure and scan\n\r");
i=0;
while(1)
{
if(i==16) Set_Display_Row(LCD_ACCESS_BASE, AT91C_BASE_PIOC, 14, 0xc0);
if(i==32) Set_Display_Row(LCD_ACCESS_BASE, AT91C_BASE_PIOC, 14, 0x90);
if(i==48) Set_Display_Row(LCD_ACCESS_BASE, AT91C_BASE_PIOC, 14, 0xd0);
msg =OSMboxPend(mybox,0,&err);
Write_To_LCD(LCD_ACCESS_BASE, *(char *)msg);
i++;
if(*(char *)msg == 'a') i=65;
if(i==65)
{
i=0;
Set_Command_Mode(AT91C_BASE_PIOC,14);
Clear_Display(LCD_ACCESS_BASE);
Set_Display_Row(LCD_ACCESS_BASE, AT91C_BASE_PIOC, 14, 0x80);
}
//OSTimeDly(1);
}
}
/**************************************************************************/
void Task2(void * pParam)
{
unsigned int i,key_down=5,Input_Value,ispress=0,new_input_value;
TC1_Enable();
for(i=0;i<500;i++);
AT91F_DBGU_Printk(" Task 1 running! configure and scan\n\r");
while(1)
{
Input_Value =(AT91F_PIO_GetInput(AT91C_BASE_PIOB)>>3) & 0x0f;
AT91F_PIO_ClearOutput(AT91C_BASE_PIOB,0x1f<<7);
if((Input_Value != 0x0f) && (ispress == 0))
{
ispress=1;
new_input_value =(AT91F_PIO_GetInput(AT91C_BASE_PIOB)>>3) & 0x0f;
switch(new_input_value)
{
case 0x0e: AT91F_DBGU_Printk("a key down 3");
key_down=key_matrix_scan(0x0e);
new_input_value=3;
break;
case 0x0d: AT91F_DBGU_Printk("a key down 2");
key_down=key_matrix_scan(0x0d);
new_input_value=2;
break;
case 0x0b: AT91F_DBGU_Printk("a key down 1");
key_down=key_matrix_scan(0x0b);
new_input_value=1;
break;
case 0x07: AT91F_DBGU_Printk("a key down 0");
key_down=key_matrix_scan(0x07);
new_input_value=0;
break;
case 0x0f: key_down=5;
break;
default : break;
}
}
if((ispress == 1) && (Input_Value == 0x0f))
{
ispress=0;
//adding keys service routine, for example:
if(key_down==0) AT91F_DBGU_Printk(" 0 =");
if(key_down==1) AT91F_DBGU_Printk(" 1 =");
if(key_down==2) AT91F_DBGU_Printk(" 2 =");
if(key_down==3) AT91F_DBGU_Printk(" 3 =");
if(key_down==4) AT91F_DBGU_Printk(" 4 =");
if(key_matrix[new_input_value][key_down]=='a')
AT91F_DBGU_Printk("a\n\r");
if(key_matrix[new_input_value][key_down]=='b')
AT91F_DBGU_Printk("b\n\r");
if(key_matrix[new_input_value][key_down]=='c')
AT91F_DBGU_Printk("c\n\r");
if(key_matrix[new_input_value][key_down]=='=')
AT91F_DBGU_Printk("=\n\r");
if(key_matrix[new_input_value][key_down]=='1')
AT91F_DBGU_Printk("1\n\r");
if(key_matrix[new_input_value][key_down]=='2')
AT91F_DBGU_Printk("2\n\r");
if(key_matrix[new_input_value][key_down]=='3')
AT91F_DBGU_Printk("3\n\r");
if(key_matrix[new_input_value][key_down]=='4')
AT91F_DBGU_Printk("4\n\r");
if(key_matrix[new_input_value][key_down]=='5')
AT91F_DBGU_Printk("5\n\r");
if(key_matrix[new_input_value][key_down]=='6')
AT91F_DBGU_Printk("6\n\r");
if(key_matrix[new_input_value][key_down]=='7')
AT91F_DBGU_Printk("7\n\r");
if(key_matrix[new_input_value][key_down]=='8')
AT91F_DBGU_Printk("8\n\r");
if(key_matrix[new_input_value][key_down]=='9')
AT91F_DBGU_Printk("9\n\r");
if(key_matrix[new_input_value][key_down]=='0')
AT91F_DBGU_Printk("0\n\r");
if(key_matrix[new_input_value][key_down]=='+')
AT91F_DBGU_Printk("+\n\r");
if(key_matrix[new_input_value][key_down]=='-')
AT91F_DBGU_Printk("-\n\r");
if(key_matrix[new_input_value][key_down]=='*')
AT91F_DBGU_Printk("*\n\r");
if(key_matrix[new_input_value][key_down]=='/')
AT91F_DBGU_Printk("/\n\r");
if(key_matrix[new_input_value][key_down]=='(')
AT91F_DBGU_Printk("(\n\r");
if(key_matrix[new_input_value][key_down]==')')
AT91F_DBGU_Printk(")\n\r");
OSMboxPost(mybox,(void *)&key_matrix[new_input_value][key_down]);
}
OSTimeDly(1);
}
}
/**************************************************************************/
void Task3(void * pParam)
{
AT91F_AIC_EnableIt(AT91C_BASE_AIC, AT91C_ID_IRQ0);
while(1)
{
AT91F_DBGU_Printk(" Task 3 running!\n\r");
OSTimeDly(20);
}
}
/**************************************************************************/
void BSP_InitIntCtrl (void)
{
*AT91C_AIC_IDCR = 0xFFFFFFFF; /* Disable ALL interrupts */
/* 0xE51FFF20L is opcode of (ldr pc,[pc,#-0xf20]) */
*(volatile unsigned int *)0x00000018 = 0xE51FFF20; /* IRQ exception vector - install redirection to AIC */
}
/**************************************************************************/
void extern C_Entry(void)
{
int task_1 = 0;
int task_2 = 1;
int task_3 = 2;
AT91F_DBGU_Printk("start kernel ok!\n\r" );
/* enable peripheral clock */
*AT91C_PMC_PCER |= 1 << AT91C_ID_TC1;
*AT91C_AIC_IDCR = 0xffffffff;
/* 若需编译成二进制文件,请注释掉下面两行 */
//*AT91C_MC_RCR = 1;
//BSP_InitIntCtrl();
OSInit();
/* install TC1 interrupt handler */
AT91F_AIC_ConfigureIt (
AT91C_BASE_AIC, // AIC base address
AT91C_ID_TC1, // System peripheral ID
0x6, // Priority
AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE, // Level sensitive
OSTickISR);
//configure PIO for keyboard
Configure_Key();
//configure PIO for LCD
Configure_LCD(AT91C_BASE_PIOC, 14);
mybox =OSMboxCreate((void *)0);
OSTaskCreate(Task1, &task_1, &TaskStk[0][TASK_STK_SIZE-1], 0);
OSTaskCreate(Task2, &task_2, &TaskStk[1][TASK_STK_SIZE-1], 1);
OSTaskCreate(Task3, &task_3, &TaskStk[2][TASK_STK_SIZE-1], 2);
OSStart();
}
void TC1_Enable (void)
{
unsigned int dummy;
*AT91C_TC1_CCR=AT91C_TC_CLKDIS; /*Disable the Clock Counter*/
*AT91C_TC1_IDR=0xFFFFFFFF;
dummy=*AT91C_TC1_SR;
*AT91C_TC1_CMR=AT91C_TC_TIMER_DIV4_CLOCK|AT91C_TC_CPCTRG; /*SLOW CLOCK*/
*AT91C_TC1_CCR=AT91C_TC_CLKEN; /*Enable the Clock Counter*/
*AT91C_TC1_IER=AT91C_TC_CPCS; /*Validate the RC compare interrupt*/
*AT91C_TC1_RC=0xb71a; /*Timer tick=10Hz*/
*AT91C_TC1_CCR=AT91C_TC_SWTRG;
/* Enable TC1 interrupt */
AT91F_AIC_EnableIt(AT91C_BASE_AIC, AT91C_ID_TC1);
}
void timer1_c_irq_handler(void)
{
unsigned int dummy;
*AT91C_AIC_ICCR=(1<<AT91C_ID_TC1); /*Clear the TC1 interrupt*/
Enable_CPU_Inter();
//AT91F_DBGU_Printk("This is the time interrupt\n\r");
dummy=*AT91C_TC1_SR; /*Read TC1 Status Register to clear it */
OSTimeTick();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -