自學Cortex-M3(1):GPIO實驗1
void DelayMs (unsigned long tick)
{
unsigned long systickcnt;
systickcnt = SysTickCnt;
while ((SysTickCnt - systickcnt) tick);
}
/********************************************************************************
* 函數(shù)名稱:void PortInit(void)
* 函數(shù)功能: 端口初始化
* 入口參數(shù): 無
* 出口參數(shù): 無
* 備 注:無
*******************************************************************************/
void PortInit(void)
{
GPIO1->FIODIR = 0xB0000000; /* LEDs on PORT1 defined as Output */
GPIO2->FIODIR = 0x0000007C; /* LEDs on PORT2 defined as Output */
Led1Off(); /* 初始化時熄滅所有的燈*/
Led2Off();
Led3Off();
Led4Off();
Led5Off();
Led6Off();
Led7Off();
Led8Off();
}
/********************************************************************************
* 函數(shù)名稱:int main(void)
* 函數(shù)功能: 主函數(shù)
* 入口參數(shù): 無
* 出口參數(shù): 無
* 備 注:無
*******************************************************************************/
int main(void)
{
SystemInit(); /* 系統(tǒng)初始化,函數(shù)在system_LPC17xx.c文件夾中定義*/
SysTick_Config(SystemFrequency/1000 - 1); /* 配置時鐘中斷,每1ms中斷一次*/
/* 在core_cm3.h中定義*/
PortInit(); /* 端口初始化*/
while(1)
{
Led1On(); //LED1開
Led4On(); //LED4 開
DelayMs(200);
Led1Off(); //LED1關
Led4Off(); //LED4關
DelayMs(200);
}
}
因為程序是最基礎的實驗,所以不是太難,程序中延時函數(shù)用的是系統(tǒng)節(jié)拍定時器,每1m中斷一次,系統(tǒng)節(jié)拍定時器的中斷配置函數(shù)是SysTick_Config(uint32_t ticks)它在core_cm3.h中有定義,有興趣的話可以看看。GPIO是一個結構體指針,原型在LPC17XX.H這個頭文件中,其定義的原型如下所示:
typedef struct
{
__IO uint32_t FIODIR;
uint32_t RESERVED0[3];
__IO uint32_t FIOMASK;
__IO uint32_t FIOPIN;
__IO uint32_t FIOSET;
__O uint32_t FIOCLR;
} GPIO_TypeDef;
還有幾個宏定義,如下所示:
1)、#define GPIO1 (( GPIO_TypeDef *) GPIO1_BASE)
上面這個宏是把GPIO1指向芯片GPIO1的基址上,
2)、#define GPIO1_BASE (GPIO_BASE + 0x00020)
3)、#define GPIO_BASE (0x2009C000UL)
這三個宏就把GPIO的基址定義了出來,關于LPV1768內(nèi)部地址的分配情況,可以參看它的數(shù)據(jù)手冊,也可參考一下《ARM Cortex-M3 權威指南》,這本書在網(wǎng)上有電子書,好像宋巖寧牛人早已把它翻譯成中文了,懶貓現(xiàn)在也正在參考這本書,另外一定要多去NXP網(wǎng)站看一下它的handbook,whitepaper等資料,還可多到論壇轉轉,有些壇子里深藏了好多老鳥,好多大蝦,好多大牛,有你學的,有你問的,只要肯用心,一根網(wǎng)線,能解決很多問題。
評論