《tiny6410裸机程序》第一章:LED跑马灯RVDS调试初探

====================================================================================================================================

一、硬件引脚说明

  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字节
......


你可能感兴趣的:(《tiny6410裸机程序》第一章:LED跑马灯RVDS调试初探)