====================================================================================================================================
一、硬件引脚说明
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字节 ......