⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 《ARM与嵌入式系统基础教程》
💻 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_FLAG_GRP		*evtPressKey;

#define		KEY_NB	5

#define		KEY1	0x01
#define		KEY2	0x02
#define		KEY3	0x04
#define		KEY4	0x08
#define		KEY5	0x10

#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}};
                       			
#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;
	OS_FLAGS	__evtKey;
	INT32U		i, __u32Keys = 0x00000000;

	pvArg = pvArg;
	
	
	AT91F_PIO_ClearOutput(AT91C_BASE_PIOB, LED_PIO);
	OSTimeDlyHMSM(0, 0, 3, 0);
	AT91F_PIO_SetOutput(AT91C_BASE_PIOB, LED_PIO);
	
	for(i=0; i<KEY_NB; i++)
		__u32Keys |= staKeys[i].u32Key;

	while(OS_TRUE)
	{
		__evtKey = OSFlagPend(evtPressKey, __u32Keys, OS_FLAG_WAIT_SET_ANY + OS_FLAG_CONSUME, 0, &__u8Err);
		
		if(__evtKey & KEY5)
		{
			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);
		}
		
		for(i=0; i<(KEY_NB - 1); i++)
		{
			if(__evtKey & (1 << i))
			{
				AT91F_PIO_ClearOutput(AT91C_BASE_PIOB, 1 << (i + 19));
				OSTimeDlyHMSM(0, 0, 1, 0);
				AT91F_PIO_SetOutput(AT91C_BASE_PIOB, 1 << (i + 19));
				OSTimeDlyHMSM(0, 0, 1, 0);
			}
		}
	}
}
//*------------------------------------------------------------------------------------------------
//* 函数名称 : irqvKey5
//* 功能描述 : Key 5 按键触发的快速中断ISR
//* 入口参数 : 无
//* 出口参数 : 无
//*------------------------------------------------------------------------------------------------
void irqvPressKey(void)
{	
	INT8U		__u8Err, i;
	INT32U		__u32PIO;
	OS_FLAGS	__evtPressKey = 0x0;
	
	__u32PIO = AT91C_BASE_PIOA->PIO_ISR;
	while(AT91C_BASE_PIOA->PIO_ISR);
	for(i=0; i<KEY_NB; i++)
	{
		if(staKeys[i].u32PIO & __u32PIO)
		  __evtPressKey |= staKeys[i].u32Key;
	}
	
	OSFlagPost(evtPressKey, __evtPressKey, OS_FLAG_SET, &__u8Err);
}
//*------------------------------------------------------------------------------------------------
//* 函数名称 : __AppInit
//* 功能描述 : 应用层初始化函数
//* 入口参数 : 无
//* 出口参数 : 无
//*------------------------------------------------------------------------------------------------
static void __AppInit(void)
{
	INT8U	__u8Err;
	
	evtPressKey = OSFlagCreate(0x0, &__u8Err);
}
//*------------------------------------------------------------------------------------------------
//* 函数名称 : __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 + -