📄 main.c
字号:
//*------------------------------------------------------------------------------------------------
//* 文件名 : main.c
//* 功能描述 : 系统入口函数文件
//* 作者 : 焦海波
//* 版本 : 0.1
//* 建立日期、时间 : 2006/05/31 13:10
//* 最近修改日期、时间 :
//* 修改原因 :
//*------------------------------------------------------------------------------------------------
//*------------------------------------------ 头文件 -----------------------------------------------
#include "/uCOS-II/ucos_ii.h"
#include "/at91sam7x256/include/AT91SAM7X256.h"
#include "/at91sam7x256/include/lib_AT91SAM7X256.h"
//*-------------------------------------- 常量及宏定义 ---------------------------------------------
OS_EVENT *hPressKey;
#define KEY_NB 5
#define KEYPIO_START_IDX 19
#define KEY1 0x00
#define KEY2 0x01
#define KEY3 0x02
#define KEY4 0x03
#define KEY5 0x04
#define KEY_PIO (AT91C_PIO_PA21 | AT91C_PIO_PA22 | AT91C_PIO_PA27 | AT91C_PIO_PA28 | AT91C_PIO_PA29)
#define LED_PIO (AT91C_PIO_PB19 | AT91C_PIO_PB20 | AT91C_PIO_PB21 | AT91C_PIO_PB22)
typedef struct {
INT32U u32PIO;
INT32U u32Key;
} ST_KEY;
const ST_KEY staKeys[KEY_NB] = {{AT91C_PIO_PA21, KEY1},
{AT91C_PIO_PA22, KEY2},
{AT91C_PIO_PA27, KEY3},
{AT91C_PIO_PA28, KEY4},
{AT91C_PIO_PA29, KEY5}};
void * pvaQPressKey[KEY_NB - 1];
#define T_LED_STKSIZE 64
OS_STK T_LED_STK[T_LED_STKSIZE];
//*================================================================================================
//* 函 数 区
//*================================================================================================
//*------------------------------------------------------------------------------------------------
//* 函数名称 : T_LED
//* 功能描述 : 处理相应的按键事件,驱动LED闪烁
//* 入口参数 : <pvArg>[in] 保留
//* 出口参数 : 无
//*------------------------------------------------------------------------------------------------
void T_LED(void *pvArg)
{
INT8U __u8Err;
ST_KEY *__pstKey;
pvArg = pvArg;
AT91F_PIO_ClearOutput(AT91C_BASE_PIOB, LED_PIO);
OSTimeDlyHMSM(0, 0, 3, 0);
AT91F_PIO_SetOutput(AT91C_BASE_PIOB, LED_PIO);
while(OS_TRUE)
{
__pstKey = OSQPend(hPressKey, 0, &__u8Err);
if(KEY5 == __pstKey->u32Key)
{
AT91F_PIO_ClearOutput(AT91C_BASE_PIOB, LED_PIO);
OSTimeDlyHMSM(0, 0, 1, 0);
AT91F_PIO_SetOutput(AT91C_BASE_PIOB, LED_PIO);
OSTimeDlyHMSM(0, 0, 1, 0);
}
else
{
AT91F_PIO_ClearOutput(AT91C_BASE_PIOB, 1 << (__pstKey->u32Key + KEYPIO_START_IDX));
OSTimeDlyHMSM(0, 0, 1, 0);
AT91F_PIO_SetOutput(AT91C_BASE_PIOB, 1 << (__pstKey->u32Key + KEYPIO_START_IDX));
OSTimeDlyHMSM(0, 0, 1, 0);
}
}
}
//*------------------------------------------------------------------------------------------------
//* 函数名称 : irqvPressKey
//* 功能描述 : 按键中断ISR
//* 入口参数 : 无
//* 出口参数 : 无
//*------------------------------------------------------------------------------------------------
void irqvPressKey(void)
{
INT8U i;
INT32U __u32PIO;
__u32PIO = AT91C_BASE_PIOA->PIO_ISR;
while(AT91C_BASE_PIOA->PIO_ISR);
for(i=0; i<KEY_NB; i++)
{
if(staKeys[i].u32PIO & __u32PIO)
OSQPost(hPressKey, &staKeys[i]);
}
}
//*------------------------------------------------------------------------------------------------
//* 函数名称 : __AppInit
//* 功能描述 : 应用层初始化函数
//* 入口参数 : 无
//* 出口参数 : 无
//*------------------------------------------------------------------------------------------------
static void __AppInit(void)
{
memset(pvaQPressKey, 0, sizeof(pvaQPressKey));
hPressKey = OSQCreate(pvaQPressKey, KEY_NB - 1);
}
//*------------------------------------------------------------------------------------------------
//* 函数名称 : __SystemInitialization
//* 功能描述 : 初始化内核调度定时器并加载动态函数库到指定RAM
//* 入口参数 : 无
//* 出口参数 : 无
//*------------------------------------------------------------------------------------------------
static void __SystemInitialization(void)
{
AT91F_AIC_ConfigureIt(AT91C_BASE_AIC, AT91C_ID_PIOA, AT91C_AIC_PRIOR_HIGHEST - 1, AT91C_AIC_SRCTYPE_POSITIVE_EDGE, irqvPressKey);
AT91F_AIC_ConfigureIt(AT91C_BASE_AIC, AT91C_ID_SYS, AT91C_AIC_PRIOR_HIGHEST, AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, OSTickISR);
AT91C_BASE_AIC->AIC_IECR = 0x01 << AT91C_ID_SYS | 0x01 << AT91C_ID_PIOA;
//* 避免设置完后即发生中断,所以再一次读PIO_ISR寄存器以对其清零
while(AT91C_BASE_PIOA->PIO_ISR);
AT91F_PIO_InterruptEnable(AT91C_BASE_PIOA, KEY_PIO);
}
//*------------------------------------------------------------------------------------------------
//* 函数名称 : __SetupHardware
//* 功能描述 : 根据应用目的,对系统硬件进行初始化设置,主要是针对系统外围,AIC等的设置。上电复位期间使系统
//* : 能够正常运行的最基本硬件设置在AT91F_LowLevelInit()函数完成。
//* 入口参数 : 无
//* 出口参数 : 无
//*------------------------------------------------------------------------------------------------
static void __SetupHardware(void)
{
AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC, 1 << AT91C_ID_PIOA | 1 << AT91C_ID_PIOB);
AT91F_PIO_CfgInput(AT91C_BASE_PIOA, KEY_PIO);
AT91F_PIO_CfgOutput(AT91C_BASE_PIOB, LED_PIO);
}
//*------------------------------------------------------------------------------------------------
//* 函数名称 : main
//* 功能描述 : 系统入口
//* 入口参数 : 无
//* 出口参数 : 无
//*------------------------------------------------------------------------------------------------
int CMain(void)
{
__SetupHardware();
OSInit();
__SystemInitialization();
__AppInit();
OSTaskCreate(T_LED, NULL, &T_LED_STK[T_LED_STKSIZE-1], 4);
OSStart();
return(0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -