====================================================================================================================================
一、硬件引脚说明
tiny6410开发板具有4个用户可编程LED,它们位于核心板上,直接与CPU的GPIO相连接。
LED详细的资源占用如下表:
LED4 | LED3 | LED2 | LED1 | |
GPIO | GPK7 | GPK6 | GPK5 | GPK4 |
二、裸机程序说明
Tiny6410用下面4个引脚连接了LED发光二极管,分别是GPK4--LED1 GPK5--LED2 GPK6--LED3 GPK7--LED4。本程序将控制这四个管脚的输出电平,实现跑马灯的效果。
以下程序设置两个寄存器rGPIOKCON0是GPK0~GPK7的控制寄存器(每4位控制一个,GPK0~GPK7的工作模式设置)、用于设置GPK的工作模式(主要是输入或输出),rGPIOKDAT寄存器(每1位控制一个,GPK0~GPK31的电平值设置\读取)是GPK的数据寄存器、就是给GPK口输入\输出什么电平。
说明:rGPIOKCON0控制GPKCON7~GPKCON0的工作模式,rGPIOKCON控制GPKCON15~GPKCON8的工作模式;rGPIOKDAT控制GPKDAT31~GPKDAT0的输出电平值。以上都是32位寄存器。ARM都是32位寄存器!
每4位决定一个GPIO的工作模式,每1位决定输出电平值。
1.main.c
#include "def.h"
#include "gpio.h"
//如上边硬件介绍部分,为相应GPIO引脚位。置为0、低电平,是点亮。设置rGPIOKDAT寄存器的值,每一位决定一个GPIO口的值、GPIOK0~GPIOK31
#define LED1_ON ~(1<<4) //1111 1111 1111 1111 1111 1111 1110 1111 GPKDAT4置0,即输出低电平
#define LED2_ON ~(1<<5) //1111 1111 1111 1111 1111 1111 1101 1111 GPKDAT5置0
#define LED3_ON ~(1<<6) //1111 1111 1111 1111 1111 1111 1011 1111 GPKDAT6置0
#define LED4_ON ~(1<<7) //1111 1111 1111 1111 1111 1111 0111 1111 GPKDAT7置0
//如上边硬件介绍部分,为相应GPIO引脚位。置为1、低电平,是熄灭。设置rGPIOKDAT寄存器的值
#define LED1_OFF (1<<4) //0000 0000 0000 0000 0000 0000 0001 0000 GPKDAT4置1,即输出高电平
#define LED2_OFF (1<<5) //0000 0000 0000 0000 0000 0000 0010 0000 GPKDAT5置1
#define LED3_OFF (1<<6) //0100 0000 0000 0000 0000 0000 0100 0000 GPKDAT6置1
#define LED4_OFF (1<<7) //1000 0000 0000 0000 0000 0000 1000 0000 GPKDAT7置1
#define LEDALL_OFF (0xf<<4) //0000 0000 0000 0000 0000 0000 1111 0000 GPKDAT4~7置1
//对应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++);
}
void LedPortInit(void){
u32 uConValue;
uConValue = GPIO->rGPIOKCON0;
uConValue &= ~(0xffff<<16); //0000 0000 0000 0000 1111 1111 1111 1111 设置rGPIOKCON0寄存器的置,每4位决定一个GPIO引脚工作模式
uConValue |= 0x1111<<16; //0001 0001 0001 0001 0000 0000 0000 0000 GPKCON7~0工作模式
GPIO->rGPIOKCON0 = uConValue; //设置GPKCON7~4都为0001,即为Output模式
}
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;
}
}
2.oGPIO_REGS定义如下:gpio.h,该文件定义了GPIO的A到N口结构体、目的是方便以后设置,我们只用其中的GPIOK相关。
#include "def.h"
typedef struct tag_GPIO_REGS{
u32 rGPIOACON; //0x7F00 8000
......
u32 rGPIOKCON0; //0x7f00 8800 说明:ARM是按字节寻址的、即每一个字节大小有一个地址
u32 rGPIOKCON1; //0x7f00 8804
u32 rGPIOKDAT; //0x7f00 8808
u32 rGPIOKPUD; //0x7f00 880C
....
}oGPIO_REGS;
3.3.u32定义如下:def.h
......
typedef unsigned long u32; //u32大小是32bit、4Byte即4字节
......