s3c6410有187個GPIO,分為GPA,GPB,GPC .......GPQ 共有17組,每組GPIO(GPA~GPQ),都可以通過5個寄存器來控制。
GPxCON:GPIO配置寄存器
GPxDAT:GPIO數據寄存器
GPxUD:上拉/下拉電阻控制寄存器
GPxCONSLP:GPIO配置寄存器(睡眠模式)
GPxPUDSLP:上拉/下拉電阻控制寄存器(睡眠模式)
(其中x為A~Q)
下面是它的程序分析
/**********************************************************
*實驗要求: 用Tiny6410上的4個LED資源實現跑馬燈程序。
*功能描述: Tiny6410用下面4個引腳連接了LED發光二極管,分別是
* GPK4--LED1
* GPK5--LED2
* GPK6--LED3
* GPK7--LED4
* 本程序將控制這四個管腳的輸出電平,實現跑馬燈的效果
*日 期: 2011-3-10
*作 者: 國嵌
**********************************************************/
#include "def.h"
#include "gpio.h"
#define LED1_ON ~(1<<4)
#define LED2_ON ~(1<<5)
#define LED3_ON ~(1<<6)
#define LED4_ON ~(1<<7)
#define LED1_OFF (1<<4)
#define LED2_OFF (1<<5)
#define LED3_OFF (1<<6)
#define LED4_OFF (1<<7)
#define LEDALL_OFF (0xf<<4)
//GPIO
#define GPIO_BASE (0x7F008000)
//oGPIO_REGS類型在 gpio.h 中定義
#define GPIO (( volatile oGPIO_REGS *)GPIO_BASE)
//函數聲明
void delay(int times);
void LedPortInit(void);
void LedRun(void);
/*
* 程序入口
* */
int main(void)
{
LedPortInit();
LedRun();
}
/*
* 延時函數
* */
void delay(int times)
{
int i;
for(;times>0;times--)
for(i=0;i<3000;i++);
}
/*
* 初始化連接LED燈的管腳資源
* @ 通過將GPIO_BASE強制轉化為(volatile oGPIO_REGS*)型的指針可以很方便
* 的訪問各個GPIO寄存器的值,這種方法比通過使用寄存器地址的宏定義訪問
* 寄存器單元更加規范和科學。
* */
void LedPortInit(void)
{
u32 uConValue;
uConValue = GPIO->rGPIOKCON0;
uConValue &= ~(0xffff<<16);
uConValue |= 0x1111<<16;
GPIO->rGPIOKCON0 = uConValue;
}
/*
* 跑馬燈的實現函數
* @ 通過控制連接LED的管腳的輸出電平點亮和熄滅各個LED。
* @ 逐個循環點亮各個LED。在每點亮一個後保持一定時間再熄滅它,接著
* 點亮下一個LED,這樣就形成了一個跑馬燈的效果。
* @ 這是一個需要改善的跑馬燈程序,想想怎麼優化這段代碼。
* */
void LedRun(void)
{
GPIO->rGPIOKDAT |= LEDALL_OFF;
while(1)
{
GPIO->rGPIOKDAT &= LED1_ON;
delay(1000);
GPIO->rGPIOKDAT |= LEDALL_OFF;
GPIO->rGPIOKDAT &= LED2_ON;
delay(1000);
GPIO->rGPIOKDAT |= LEDALL_OFF;
GPIO->rGPIOKDAT &= LED3_ON;
delay(1000);
GPIO->rGPIOKDAT |= LEDALL_OFF;
GPIO->rGPIOKDAT &= LED4_ON;
delay(1000);
GPIO->rGPIOKDAT |= LEDALL_OFF;
}
}