这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » ARTX,LPC2131 ARTX水鸟LPC2131板实验笔记

共2条 1/1 1 跳转至

ARTX,LPC2131 ARTX水鸟LPC2131板实验笔记

院士
2006-09-17 18:14:16     打赏
ARTX,LPC2131 ARTX水鸟LPC2131板实验笔记



关键词: LPC2131     水鸟     实验     笔记    

院士
2006-12-22 22:43:00     打赏
2楼
问 /*--------------------------------------------------------
            ARTX水鸟LPC2131板实验笔记
HotPower@126.com       2006.1.15  03:18 于西安大雁塔村队部
---------------------------------------------------------*/
#include <ARTX.h>
#include <LPC213x.H>    // Philips Peripheral Registers
#include <LPC213xDEF.H>    //ARM菜鸟HotPower创建定义文件(新版)

/*-----------------------------------------
         LED数码字符定义
-------------------------------------------*/

//共阳极数码管(左移)

#define LedSegA  0x01
#define LedSegB  0x02
#define LedSegC  0x04
#define LedSegD  0x08
#define LedSegE  0x10
#define LedSegF  0x20
#define LedSegG  0x40
#define LedSegH  0x80

//

//共阳极数码管(右移)
/*
#define LedSegA  0x80
#define LedSegB  0x40
#define LedSegC  0x20
#define LedSegD  0x10
#define LedSegE  0x08
#define LedSegF  0x04
#define LedSegG  0x02
#define LedSegH  0x01
*/
//

#define LedChar0 (LedSegA + LedSegB + LedSegC + LedSegD + LedSegE + LedSegF          )
#define LedChar1 (          LedSegB + LedSegC                                         )
#define LedChar2 (LedSegA + LedSegB           + LedSegD + LedSegE           + LedSegG)
#define LedChar3 (LedSegA + LedSegB + LedSegC + LedSegD                     + LedSegG)
#define LedChar4 (          LedSegB + LedSegC                     + LedSegF + LedSegG)
#define LedChar5 (LedSegA           + LedSegC + LedSegD           + LedSegF + LedSegG)
#define LedChar6 (LedSegA           + LedSegC + LedSegD + LedSegE + LedSegF + LedSegG)
#define LedChar7 (LedSegA + LedSegB + LedSegC                                         )
#define LedChar8 (LedSegA + LedSegB + LedSegC + LedSegD + LedSegE + LedSegF + LedSegG)
#define LedChar9 (LedSegA + LedSegB + LedSegC + LedSegD           + LedSegF + LedSegG)
#define LedCharA (LedSegA + LedSegB + LedSegC           + LedSegE + LedSegF + LedSegG)
#define LedCharB (                    LedSegC + LedSegD + LedSegE + LedSegF + LedSegG)
#define LedCharC (LedSegA                     + LedSegD + LedSegE + LedSegF             )
#define LedCharD (          LedSegB + LedSegC + LedSegD + LedSegE           + LedSegG)
#define LedCharE (LedSegA                     + LedSegD + LedSegE + LedSegF + LedSegG)
#define LedCharF (LedSegA                               + LedSegE + LedSegF + LedSegG)

#define RCLK    P0_29
//#define SCK0    P0_28  //<LPC213xDEF.H>已定义
//#define MOSI0    P0_25  //<LPC213xDEF.H>已定义
#define BEEP    P0_7// P0.7控制蜂鸣器,低电平蜂鸣

#define KEY1    P0_16//
#define KEY2    P0_17//
#define KEY3    P0_18//
#define KEY4    P0_19//
#define KEY5    P0_20//
#define KEY6    P0_21//



#define LED1    P1_18//
#define LED2    P1_19//
#define LED3    P1_20//
#define LED4    P1_21//
#define LED5    P1_22//
#define LED6    P1_23//
#define LED7    P1_24//
#define LED8    P1_25//



static const unsigned char LedTab[] =
{
  ~LedChar0,
  ~LedChar1,
  ~LedChar2,
  ~LedChar3,
  ~LedChar4,
  ~LedChar5,
  ~LedChar6,
  ~LedChar7,
  ~LedChar8,
  ~LedChar9,
  ~LedCharA,
  ~LedCharB,
  ~LedCharC,
  ~LedCharD,
  ~LedCharE,
  ~LedCharF
};

OS_TID Main_Task, Key_Task, Led_Task, Lednum_Task, Beep_Task;

void MainTask (void) __task;
void KeyTask (void) __task;
void LedTask (void) __task;
void LednumTask (void) __task;
void BeepTask (void) __task;

void SystemInit(void);
void KeyInit(void);
void LedInit(void);
void LednumInit(void);
void BeepInit(void);

void MSPI_Init(void);
unsigned char MSPI_SendData(unsigned char);
void LedDisplay(unsigned char);

void SystemInit(void) {
  PINSEL0 = 0x00000000;        // 设置管脚连接GPIO
  PINSEL1 = 0x00000000;        // 设置管脚连接GPIO
  IODIR0  = 0x00000000;        // 设置P0口为输入
  IODIR1  = 0x00000000;        // 设置P1口为输入
}

void KeyInit(void) {
  
}

void LedInit(void) {
  IODIR1 |= (1 << LED1) |    // 设置LED1为输出    
            (1 << LED2)    |    // 设置LED2为输出  
            (1 << LED3)    |    // 设置LED3为输出  
            (1 << LED4)    |    // 设置LED4为输出  
            (1 << LED5)    |    // 设置LED5为输出  
            (1 << LED6)    |    // 设置LED6为输出  
            (1 << LED7)    |    // 设置LED7为输出  
            (1 << LED8);      // 设置LED8为输出  
  IOSET1  = (1 << LED1) |    // 关闭LED1
            (1 << LED2) |    // 关闭LED2
            (1 << LED3) |    // 关闭LED3
            (1 << LED4) |    // 关闭LED4
            (1 << LED5) |    // 关闭LED5
            (1 << LED6) |    // 关闭LED6
            (1 << LED7) |    // 关闭LED7
            (1 << LED8);      // 关闭LED8
}

void LednumInit(void) {
  MSPI_Init();
}

void  MSPI_Init(void) {  
  PINSEL0 |= ((P0_4_SCK0 << P0_4_PINSEL) | (P0_5_MISO0 << P0_5_PINSEL) | (P0_6_MOSI0 << P0_6_PINSEL));
  IODIR0  |= (1 << RCLK);        // 设置RCLK控制口为输出    
  IOCLR0   = (1 << RCLK);
  S0SPCCR = 0x52;                    // 设置SPI时钟分频
  S0SPCR  = (1 << CPHA) |                // CPHA = 0, 数据在SCK 的第一个时钟沿采样
              (1 << CPOL) |                // CPOL = 1, SCK 为低有效
             (1 << MSTR) |                // MSTR = 1, SPI 处于主模式
             (0 << LSBF) |                // LSBF = 0, SPI 数据传输MSB (位7)在先
             (0 << SPIE);                // SPIE = 0, SPI 中断被禁止
}

unsigned char MSPI_SendData(unsigned char data) {
  S0SPDR = data;                        //发送数据(相当于51的SBUF = DATA)
  while(!(S0SPSR & (1 << SPIF)));        // 等待SPIF置位,即等待数据发送完毕
  return(S0SPDR);
}

void LedDisplay(unsigned char data) {
  MSPI_SendData(LedTab[data & 0x0f]);
  IOSET0 = (1 << RCLK);
  IOCLR0 = (1 << RCLK);
}


void BeepInit(void) {
  IODIR0 |= (1 << BEEP);// 设置BEEP控制口为输出    
  IO0SET  = (1 << BEEP);//关闭BEEP
}

void MainTask (void) __task {
  SystemInit();
  Key_Task = os_tsk_create (KeyTask, 100);//创建KeyTask任务及级别
  Led_Task = os_tsk_create (LedTask, 100);//创建LedTask任务及级别
  Lednum_Task = os_tsk_create (LednumTask, 100);//创建LednumTask任务及级别
  Beep_Task = os_tsk_create (BeepTask, 100);//创建BeepTask任务及级别
  os_tsk_delete_self ();//MainTask自毁
}

void KeyTask (void) __task {
  KeyInit();
  for (;;) {
    if ((!(IOPIN0 & (1 << KEY1))) && (IOPIN1 & (1 << LED1))) {//有KEY1键压下且LED未亮
      os_evt_set (0x0001, Led_Task);//
    }
    else if ((IOPIN0 & (1 << KEY1)) && (!(IOPIN1 & (1 << LED1)))) {//无KEY1键压下且LED在亮
      os_evt_set (0x8001, Led_Task);//
    }
    if ((!(IOPIN0 & (1 << KEY2))) && (IOPIN1 & (1 << LED2))) {//有KEY2键压下且LED未亮
      os_evt_set (0x0002, Led_Task);//
    }
    else if ((IOPIN0 & (1 << KEY2)) && (!(IOPIN1 & (1 << LED2)))){//无KEY2键压下且LED在亮
      os_evt_set (0x8002, Led_Task);//
    }
    if ((!(IOPIN0 & (1 << KEY3))) && (IOPIN1 & (1 << LED3))) {//有KEY3键压下且LED未亮
      os_evt_set (0x0003, Led_Task);//
    }
    else if ((IOPIN0 & (1 << KEY3)) && (!(IOPIN1 & (1 << LED3)))){//无KEY3键压下且LED在亮
      os_evt_set (0x8003, Led_Task);//
    }
    if ((!(IOPIN0 & (1 << KEY4))) && (IOPIN1 & (1 << LED4))) {//有KEY4键压下且LED未亮
      os_evt_set (0x0004, Led_Task);//
    }
    else if ((IOPIN0 & (1 << KEY4)) && (!(IOPIN1 & (1 << LED4)))){//无KEY4键压下且LED在亮
      os_evt_set (0x8004, Led_Task);//
    }
    if ((!(IOPIN0 & (1 << KEY5))) && (IOPIN1 & (1 << LED5))) {//有KEY5键压下且LED未亮
      os_evt_set (0x0005, Led_Task);//
    }
    else if ((IOPIN0 & (1 << KEY5)) && (!(IOPIN1 & (1 << LED5)))){//无KEY5键压下且LED在亮
      os_evt_set (0x8005, Led_Task);//
    }
    if ((!(IOPIN0 & (1 << KEY6))) && (IOPIN1 & (1 << LED6))) {//有KEY6键压下且LED未亮
      os_evt_set (0x0006, Led_Task);//
    }
    else if ((IOPIN0 & (1 << KEY6)) && (!(IOPIN1 & (1 << LED6)))){//无KEY6键压下且LED在亮
      os_evt_set (0x8006, Led_Task);//
    }
    os_dly_wait (2);//延时20mS
  }
}

void LedTask (void) __task {
OS_RESULT result;
unsigned int i;    
  LedInit();
  for (;;) {
    result = os_evt_wait_or(0xffff, 0xffff);//等待LedTask任务事件发生
    if(result == OS_R_EVT) {
      i = os_evt_get();
      switch(i) {
        case 0x0001:  IOCLR1 = (1 << LED1);//点亮LED1
                      break;
        case 0x0002:  IOCLR1 = (1 << LED2);//点亮LED2
                      break;
        case 0x0003:  IOCLR1 = (1 << LED3);//点亮LED3
                      break;
        case 0x0004:  IOCLR1 = (1 << LED4);//点亮LED4
                      break;
        case 0x0005:  IOCLR1 = (1 << LED5);//点亮LED5
                      break;
        case 0x0006:  IOCLR1 = (1 << LED6);//点亮LED6
                      break;

        case 0x8001:  IOSET1 = (1 << LED1);//关掉LED1
                      break;
        case 0x8002:  IOSET1 = (1 << LED2);//关掉LED2
                      break;
        case 0x8003:  IOSET1 = (1 << LED3);//关掉LED3
                      break;
        case 0x8004:  IOSET1 = (1 << LED4);//关掉LED4
                      break;
        case 0x8005:  IOSET1 = (1 << LED5);//关掉LED5
                      break;
        case 0x8006:  IOSET1 = (1 << LED6);//关掉LED6
                      break;
      }
      os_evt_set (i, Beep_Task);//开关BEEP
      os_evt_set (i, Lednum_Task);//开关Lednum
    }
    os_dly_wait (2);//延时20mS
  }
}

void LednumTask (void) __task {
OS_RESULT result;
unsigned int i;    
  LednumInit();
  for (;;) {
    result = os_evt_wait_or(0xffff, 0xffff);//等待LedTask任务事件发生
    if(result == OS_R_EVT) {
      i = os_evt_get();
      switch(i) {
        case 0x0001:  LedDisplay(1);//显示数码'1'
                      break;
        case 0x0002:  LedDisplay(2);//显示数码'2'
                      break;
        case 0x0003:  LedDisplay(3);//显示数码'3'
                      break;
        case 0x0004:  LedDisplay(4);//显示数码'4'
                      break;
        case 0x0005:  LedDisplay(5);//显示数码'5'
                      break;
        case 0x0006:  LedDisplay(6);//显示数码'6'
                      break;
      }
    }
    os_dly_wait (2);//延时20mS
  }
}


void BeepTask (void) __task {
OS_RESULT result;
unsigned int i;    
  BeepInit();
  for (;;) {
    result = os_evt_wait_or(0xffff, 0xffff);//等待BeepTask任务事件发生
    if(result == OS_R_EVT) {
      i = os_evt_get();
      switch(i) {
        case 0x0001:  
        case 0x0002:  
        case 0x0003:  
        case 0x0004:  
        case 0x0005:  
        case 0x0006:  
                      IOCLR0 = (1 << BEEP);//打开BEEP
                      break;
        case 0x8001:  
        case 0x8002:  
        case 0x8003:  
        case 0x8004:  
        case 0x8005:  
        case 0x8006:  
                      IOSET0 = (1 << BEEP);//关闭BEEP
                      break;
      }
    }
    os_dly_wait (10);//延时100mS

  }
}


void main (void) {
  os_sys_init (MainTask);//启动ARTX,此函数并不返回main()
}
1: LPC213XDEF.H(V1.00)/*-----------------------------------------------------------
文   件   名 :  LPC213XDEF.H
创   建   人 :  ARM水鸟  HotPower@126.com
创 建 日  期 :  2005.7.23   0:38
最近修改日期 :  2006.1.11   2:38
创 建  地 点 : 西安大雁塔村队部
版   本   号 : V1.00
说        明 : 已经过硬件调试
               由于在不断更新中,故新旧版本以修改日期为准
备        注 : 由此文件出现的问题,ARM水鸟不负任何责任
-----------------------------------------------------------*/


#ifndef __LPC213xDEF_H
#define __LPC213xDEF_H

typedef unsigned char  uint8; //无符号8位整型变量
typedef signed   char  int8;  //有符号8位整型变量
typedef unsigned short uint16;//无符号16位整型变量
typedef signed   short int16; //有符号16位整型变量
typedef unsigned int   uint32;//无符号32位整型变量
typedef signed   int   int32; //有符号32位整型变量
typedef float          fp32;  //单精度浮点数(32位长度
typedef double         fp64;  //双精度浮点数(64位长度)


#define BV(val) (1 << val)   //WINAVR中有定义

#define VICIntSel_Watchdog   0//看门狗中断(WDINT)
#define VICIntSel_SoftInt1   1//保留给软件中断
#define VICIntSel_DbgCommRx  2//ARM内核中断
#define VICIntSel_DbgCommTx  3//ARM内核中断
#define VICIntSel_Time0      4//定时器0中断
#define VICIntSel_Time1      5//定时器1中断
#define VICIntSel_UART0      6//UART0中断
#define VICIntSel_UART1      7//UART1中断
#define VICIntSel_PWM0       8//PWM0中断
#define VICIntSel_I2C0       9//I2C0中断
#define VICIntSel_SPI0      10//SPI0中断
#define VICIntSel_SSP       11//SSP中断
#define VICIntSel_SPI1      11//SPI1中断
#define VICIntSel_PLL       12//PLL中断
#define VICIntSel_RTC       13//RTC中断
#define VICIntSel_EINT0     14//系统控制外部中断0
#define VICIntSel_EINT1     15//系统控制外部中断1
#define VICIntSel_EINT2     16//系统控制外部中断2
#define VICIntSel_EINT3     17//系统控制外部中断3
#define VICIntSel_ADC0      18//A/D转换器0中断
#define VICIntSel_I2C1      19//I2C1中断
#define VICIntSel_BOD       20//掉电检测中断
#define VICIntSel_ADC1      21//A/D转换器1中断
#define VICIntSel_SoftInt22 22//保留给软件中断
#define VICIntSel_SoftInt23 23//保留给软件中断
#define VICIntSel_SoftInt24 24//保留给软件中断
#define VICIntSel_SoftInt25 25//保留给软件中断
#define VICIntSel_SoftInt26 26//保留给软件中断
#define VICIntSel_SoftInt27 27//保留给软件中断
#define VICIntSel_SoftInt28 28//保留给软件中断
#define VICIntSel_SoftInt29 29//保留给软件中断
#define VICIntSel_SoftInt30 30//保留给软件中断
#define VICIntSel_SoftInt31 31//保留给软件中断
#define VICIntSel_Enable    32//使能向量中断

/*应用示例
  VICVectCntl0   = VICIntSel_Enable//使能IRQ中断
                 | VICIntSel_EINT0;//获取EINT0的IRQ级别
  VICVectAddr0   = (long) IRQ_Eint0;//取INT0中断服务地址
  VICIntEnable   = (1 << VICIntSel_EINT0); //使能EINT0中断
*/

/*
  P0口GPIO位寻址位定义
*/

#define P0_0   0//P0.0
  #define TXD0    P0_0//UART0的发送器输出
  #define PWM1    P0_0//脉宽调制器输出1
#define P0_1   1//P0.1
  #define RXD0    P0_1//UART0的接收器输入
  #define PWM3    P0_1//脉宽调制器输出3
#define P0_2   2//P0.2
  #define SCL0    P0_2//I2C0时钟输入/输出。开漏输出(符合I2C规范)
#define P0_3   3//P0.3
  #define SDA0    P0_3//I2C0数据输入/输出。开漏输出(符合I2C规范)
#define P0_4   4//P0.4
  #define SCK0    P0_4//SPI0的串行时钟。SPI时钟从主机输出,从机输入
  #define AD0_6   P0_4//A/D转换器0输入6。该模拟输入总是连接到相应的管脚
#define P0_5   5//P0.5
  #define MISO0   P0_5//SPI0主机输入从机输出端。从机到主机的数据传输
  #define AD0_7   P0_5//A/D转换器0输入7。该模拟输入总是连接到相应的管脚
#define P0_6   6//P0.6
  #define MOSI0   P0_6//SPI0主机输出从机输入端。主机到从机的数据传输
  #define AD1_0   P0_6//A/D转换器1输入0。该模拟输入总是连接到相应的管脚(仅用于 LPC2138)
#define P0_7   7//P0.7
  #define SSEL0   P0_7//SPI0从机选择。选择SPI接口用作从机
  #define PWM2    P0_7//脉宽调制器输出2
#define P0_8   8//P0.8
  #define TXD1    P0_8//UART1的发送器输出
  #define PWM4    P0_8//脉宽调制器输出4
  #define AD1_1   P0_8//A/D转换器1输入1。该模拟输入总是连接到相应的管脚(仅用于 LPC2138)
#define P0_9   9//P0.9
  #define RXD1    P0_9//UART1的接收器输入
  #define PWM6    P0_9//脉宽调制器输出6
#define P0_10 10//P0.10
  #define RTS1    P0_10//UART1请求发送出端(仅用于LP138)
  #define CAP1_0  P0_10//定时器1的捕获输入通道0
  #define AD1_2   P0_10//A/D转换器1输入2。该模拟输入总是连接到相应的管脚(仅用于 LPC2138)
#define P0_11 11//P0.11
  #define CTS1    P0_11//UART1清除发送入端(仅用于LP138)
  #define CAP1_1  P0_11//定时器1的捕获输入通道1
  #define SCL1    P0_11//I2C1时钟输入/输。开漏输出(符合I2C规范)
#define P0_12 12//P0.12
  #define DSR1    P0_12//UART1数据设置就绪端(仅用于 LPC2138)
  #define MAT1_0  P0_12//定时器1的匹配输出通道0
  #define AD1_3   P0_12//A/D转换器1输入3。该模拟输入总是连接到相应的管脚(仅用于 LPC2138)
#define P0_13 13//P0.13
  #define DTR1    P0_13//UART1数据终端就绪
  #define MAT1_1  P0_13//定时器1的匹配输出通道1
  #define AD1_4   P0_13//A/D转换器1输入4。该模拟输入总是连接到相应的管脚(仅用于 LPC2138)
#define P0_14 14//P0.14
  #define DCD1    P0_14//UART1数据载波检测输入(仅用于 LPC2138)
  #define SDA1    P0_14//I2C1数据输入/输出。开漏输出(符合I2C规范)
#define P0_15 15//P0.15
  #define RI1     P0_15//UART1铃响指示输入(仅用于 LPC2138)
  #define AD1_5   P0_15//A/D转换器1输入5。该模拟输入总是连接到相应的管脚(仅用于 LPC2138)
#define P0_16 16//P0.16

#define P0_17 17//P0.17
  #define SCK1    P0_17//SPI1的串行时钟。SPI时钟从主机输出,从机输入
#define P0_18 18//P0.18
  #define MISO1   P0_18//SPI1主机输入从机输出端。从机到主机的数据传输
#define P0_19 19//P0.19
  #define MOSI1   P0_19//SPI1主机输出从机输入端。主机到从机的数据传输
#define P0_20 20//P0.20
  #define SSEL1   P0_20//SPI1从机选择。选择SPI接口用作从机
#define P0_21 21//P0.21
  #define PWM5    P0_21//脉宽调制器输出5
  #define AD1_6   P0_21//A/D转换器1输入6。该模拟输入总是连接到相应的管脚(仅用于 LPC2138)
#define P0_22 22//P0.22
  #define AD1_7   P0_22//A/D转换器1输入7。该模拟输入总是连接到相应的管脚(仅用于 LPC2138)
#define P0_23 23//P0.23
#define P0_24 24//P0.24
#define P0_25 25//P0.25
  #define AD0_4   P0_25//A/D转换器0输入4。该模拟输入总是连接到相应的管脚.D/A 转换器输出(仅用于 LPC2138)
#define P0_26 26//P0.26
  #define AD0_5   P0_26//A/D转换器0输入5。该模拟输入总是连接到相应的管脚
#define P0_27 27//P0.27
  #define AD0_0   P0_27//A/D转换器0输入0。该模拟输入总是连接到相应的管脚
#define P0_28 28//P0.28
  #define AD0_1   P0_28//A/D转换器0输入1。该模拟输入总是连接到相应的管脚
#define P0_29 29//P0.29
  #define AD0_2   P0_29//A/D转换器0输入2。该模拟输入总是连接到相应的管脚
  #define CAP0_3  P0_29//定时器0的捕获输入通道3
  #define MAT0_3  P0_29//定时器0的匹配输出通道3
#define P0_30 30//P0.30
  #define AD0_3   P0_30//A/D转换器0输入3。该模拟输入总是连接到相应的管脚
#define P0_31 31//P0.31

/*
  P1口GPIO位寻址位定义
*/

#define P1_0   0//P1.0
#define P1_1   1//P1.1
#define P1_2   2//P1.2
#define P1_3   3//P1.3
#define P1_4   4//P1.4
#define P1_5   5//P1.5
#define P1_6   6//P1.6
#define P1_7   7//P1.7
#define P1_8   8//P1.8
#define P1_9   9//P1.9
#define P1_10 10//P1.10
#define P1_11 11//P1.11
#define P1_12 12//P1.12
#define P1_13 13//P1.13
#define P1_14 14//P1.14
#define P1_15 15//P1.15
#define P1_16 16//P1.16
#define P1_17 17//P1.17
#define P1_18 18//P1.18
#define P1_19 19//P1.19
#define P1_20 20//P1.20
#define P1_21 21//P1.21
#define P1_22 22//P1.22
#define P1_23 23//P1.23
#define P1_24 24//P1.24
#define P1_25 25//P1.25
#define P1_26 26//P1.26
#define P1_27 27//P1.27
#define P1_28 28//P1.28
#define P1_29 29//P1.29
#define P1_30 30//P1.30
#define P1_31 31//P1.31

/*
  外部中断标志寄存器EXTINT位定义
*/
#define EINT0  0//EXTINT.0//写'1'清除EINT0中断标志
#define EINT1  1//EXTINT.1//写'1'清除EINT1中断标志
#define EINT2  2//EXTINT.2//写'1'清除EINT2中断标志
#define EINT3  3//EXTINT.3//写'1'清除EINT3中断标志

/*
  外部中断方式寄存器EXTMODE位定义
*/
#define EXTMODE0 0//EXTMODE.0//该位为0时,EINT0使用电平激活;该位为1时,EINT0使用边沿激活。
#define EXTMODE1 1//EXTMODE.1//该位为0时,EINT1使用电平激活;该位为1时,EINT1使用边沿激活。
#define EXTMODE2 2//EXTMODE.2//该位为0时,EINT2使用电平激活;该位为1时,EINT2使用边沿激活。
#define EXTMODE3 3//EXTMODE.3//该位为0时,EINT3使用电平激活;该位为1时,EINT3使用边沿激活。

/*
  外部中断极性寄存器EXTPOLAR位定义  
*/
#define EXTPOLAR0 0//EXTPOLAR.0//该位为0时,EINT0低电平或下降沿有效(由EXTMODE0决定)。
                               //该位为1时,EINT0高电平或上升沿有效(由EXTMODE0决定)。
#define EXTPOLAR1 1//EXTPOLAR.1//该位为0时,EINT1低电平或下降沿有效(由EXTMODE1决定)。
                               //该位为1时,EINT1高电平或上升沿有效(由EXTMODE1决定)。
#define EXTPOLAR2 2//EXTPOLAR.2//该位为0时,EINT2低电平或下降沿有效(由EXTMODE2决定)。
                               //该位为1时,EINT2高电平或上升沿有效(由EXTMODE2决定)。
#define EXTPOLAR3 3//EXTPOLAR.3//该位为0时,EINT3低电平或下降沿有效(由EXTMODE3决定)。
                               //该位为1时,EINT3高电平或上升沿有效(由EXTMODE3决定)。

/*
  外部中断唤醒寄存器EXTWAKE位定义  
*/
#define EXTWAKE0  0//EXTWAKE.0//该位为1时,使能EINT0将处理器从掉电模式唤醒。
#define EXTWAKE1  1//EXTWAKE.1//该位为1时,使能EINT1将处理器从掉电模式唤醒。
#define EXTWAKE2  2//EXTWAKE.2//该位为1时,使能EINT2将处理器从掉电模式唤醒。
#define EXTWAKE3  3//EXTWAKE.3//该位为1时,使能EINT3将处理器从掉电模式唤醒。
#define BODWAKE  14//EXTWAKE.14//该位为1时,BOD中断产生时可将处理器从掉电模式唤醒。
#define RTCWAKE  15//EXTWAKE.15//该位为1时,RTC中断产生时可将处理器从掉电模式唤醒。

/*
  GPIO管脚功能配置
应用示例:
  PINSEL0          |= (P0_0_TXD0 << P0_0_PINSEL) | (P0_1_RXD0 << P0_1_PINSEL); //选择P0.0和P0.1为UART0的输出输入引脚

  PINSEL0          |= (P0_3_EINT1 << P0_3_PINSEL); //选择P0.3为INT1外部中断引脚
  PINSEL0          |= (P0_14_EINT1 << P0_14_PINSEL); //选择P0.14也可为INT1外部中断引脚

  PINSEL0          |= (P0_1_EINT0 << P0_1_PINSEL)   //选择P0.1为INT0外部中断引脚
  PINSEL1          |= (P0_16_EINT0 << P0_16_PINSEL); //选择P0.16也可为INT0外部中断引脚
*/

#define P0_0_GPIO      0//通用数字输入输出管脚
  #define P0_0_TXD0    1//UART0的发送器输出
  #define P0_0_PWM1    2//脉宽调制器输出1
#define P0_0_PINSEL    2 * P0_0

#define P0_1_GPIO      0//通用数字输入输出管脚
  #define P0_1_RXD0    1//UART0的接收器输入
  #define P0_1_PWM3    2//脉宽调制器输出3
  #define P0_1_EINT0   3//**外部中断0输入
#define P0_1_PINSEL    2 * P0_1

#define P0_2_GPIO      0//通用数字输入输出管脚
  #define P0_2_SCL0    1//I2C0时钟输入/输出。开漏输出(符合I2C规范)
  #define P0_2_CAP0_0  2//***定时器0的捕获输入通道0
#define P0_2_PINSEL    2 * P0_2

#define P0_3_GPIO      0//通用数字输入输出管脚
  #define P0_3_SDA0    1//I2C0数据输入/输出。开漏输出(符合I2C规范)
  #define P0_3_MAT0_0  2//**定时器0的匹配输出通道0
  #define P0_3_EINT1   3//**外部中断1输入
#define P0_3_PINSEL    2 * P0_3

#define P0_4_GPIO      0//通用数字输入输出管脚
  #define P0_4_SCK0    1//SPI0的串行时钟。SPI时钟从主机输出,从机输入
  #define P0_4_CAP0_1  2//**定时器0的捕获输入通道1
  #define P0_4_AD0_6   3//A/D转换器0输入6。该模拟输入总是连接到相应的管脚
#define P0_4_PINSEL  2 * P0_4

#define P0_5_GPIO      0//通用数字输入输出管脚
  #define P0_5_MISO0   1//SPI0主机输入从机输出端。从机到主机的数据传输
  #define P0_5_MAT0_1  2//**定时器0的匹配输出通道1
  #define P0_5_AD0_7   3//A/D转换器0输入7。该模拟输入总是连接到相应的管脚
#define P0_5_PINSEL    2 * P0_5

#define P0_6_GPIO      0//通用数字输入输出管脚
  #define P0_6_MOSI0   1//SPI0主机输出从机输入端。主机到从机的数据传输
  #define P0_6_CAP0_2  2//***定时器0的捕获输入通道2
  #define P0_6_AD1_0   3//A/D转换器1输入0。该模拟输入总是连接到相应的管脚(仅用于 LPC2138)
#define P0_6_PINSEL    2 * P0_6

#define P0_7_GPIO      0//通用数字输入输出管脚
  #define P0_7_SSEL0   1//SPI0从机选择。选择SPI接口用作从机
  #define P0_7_PWM2    2//脉宽调制器输出2
  #define P0_7_EINT2   3//**外部中断2输入
#define P0_7_PINSEL    2 * P0_7

#define P0_8_GPIO      0//通用数字输入输出管脚
  #define P0_8_TXD1    1//UART1的发送器输出
  #define P0_8_PWM4    2//脉宽调制器输出4
  #define P0_8_AD1_1   3//A/D转换器1输入1。该模拟输入总是连接到相应的管脚(仅用于 LPC2138)
#define P0_8_PINSEL    2 * P0_8

#define P0_9_GPIO      0//通用数字输入输出管脚
  #define P0_9_RXD1    1//UART1的接收器输入
  #define P0_9_PWM6    2//脉宽调制器输出6
  #define P0_9_EINT3   3//***外部中断3输入
#define P0_9_PINSEL    2 * P0_9

#define P0_10_GPIO     0//通用数字输入输出管脚
  #define P0_10_RTS1   1//UART1请求发送出端(仅用于LP138)
  #define P0_10_CAP1_0 2//定时器1的捕获输入通道0
  #define P0_10_AD1_2  3//A/D转换器1输入2。该模拟输入总是连接到相应的管脚(仅用于 LPC2138)
#define P0_10_PINSEL   2 * P0_10

#define P0_11_GPIO     0//通用数字输入输出管脚
  #define P0_11_CTS1   1//UART1清除发送入端(仅用于LP138)
  #define P0_11_CAP1_1 2//定时器1的捕获输入通道1
  #define P0_11_SCL1   3//I2C1时钟输入/输。开漏输出(符合I2C规范)
#define P0_11_PINSEL   2 * P0_11

#define P0_12_GPIO     0//通用数字输入输出管脚
  #define P0_12_DSR1   1//UART1数据设置就绪端(仅用于 LPC2138)
  #define P0_12_MAT1_0 2//定时器1的匹配输出通道0
  #define P0_12_AD1_3  3//A/D转换器1输入3。该模拟输入总是连接到相应的管脚(仅用于 LPC2138)
#define P0_12_PINSEL   2 * P0_12

#define P0_13_GPIO     0//通用数字输入输出管脚
  #define P0_13_DTR1   1//UART1数据终端就绪
  #define P0_13_MAT1_1 2//定时器1的匹配输出通道1
  #define P0_13_AD1_4  3//A/D转换器1输入4。该模拟输入总是连接到相应的管脚(仅用于 LPC2138)
#define P0_13_PINSEL   2 * P0_13

#define P0_14_GPIO     0//通用数字输入输出管脚
  #define P0_14_DCD1   1//UART1数据载波检测输入(仅用于 LPC2138)
  #define P0_14_EINT1  2//**外部中断1输入
  #define P0_14_SDA1   3//I2C1数据输入/输出。开漏输出(符合I2C规范)
#define P0_14_PINSEL   2 * P0_14

#define P0_15_GPIO     0//通用数字输入输出管脚
  #define P0_15_RI1    1//UART1铃响指示输入(仅用于 LPC2138)
  #define P0_15_EINT2  2//**外部中断2输入
  #define P0_14_AD1_5  3//A/D转换器1输入5。该模拟输入总是连接到相应的管脚(仅用于 LPC2138)
#define P0_15_PINSEL   2 * P0_15

#define P0_16_GPIO     0//通用数字输入输出管脚
  #define P0_16_EINT0  1//**外部中断0输入
  #define P0_16_MAT0_2 2//**定时器0的匹配输出通道2
  #define P0_16_CAP0_2 3//***定时器0的捕获输入通道2
#define P0_16_PINSEL   2 * P0_0


#define P0_17_GPIO     0//通用数字输入输出管脚
  #define P0_17_CAP1_2 1//**定时器1的捕获输入通道2
  #define P0_17_SCK1   2//SPI1的串行时钟。SPI时钟从主机输出,从机输入
  #define P0_17_MAT1_2 3//**定时器1的匹配输出通道2
#define P0_17_PINSEL   2 * P0_1

#define P0_18_GPIO     0//通用数字输入输出管脚
  #define P0_18_CAP1_3 1//**定时器1的捕获输入通道3
  #define P0_18_MISO1  2//SPI1主机输入从机输出端。从机到主机的数据传输
  #define P0_18_MAT1_3 3//**定时器1的匹配输出通道3
#define P0_18_PINSEL   2 * P0_2


#define P0_19_GPIO     0//通用数字输入输出管脚
  #define P0_19_MAT1_2 1//**定时器1的匹配输出通道2
  #define P0_18_MOSI1  2//SPI1主机输出从机输入端。主机到从机的数据传输
  #define P0_19_CAP1_2 3//**定时器1的捕获输入通道2
#define P0_19_PINSEL   2 * P0_3


#define P0_20_GPIO     0//通用数字输入输出管脚
  #define P0_20_MAT1_3 1//**定时器1的匹配输出通道3
  #define P0_20_SSEL1  2//SPI1从机选择。选择SPI接口用作从机
  #define P0_20_EINT3  3//***外部中断3输入
#define P0_20_PINSEL   2 * P0_4


#define P0_21_GPIO     0//通用数字输入输出管脚
  #define P0_21_PWM5   1//脉宽调制器输出5
  #define P0_21_AD1_6  2//A/D转换器1输入6。该模拟输入总是连接到相应的管脚(仅用于 LPC2138)
  #define P0_21_CAP1_3 3//**定时器1的捕获输入通道3
#define P0_21_PINSEL   2 * P0_5


#define P0_22_GPIO     0//通用数字输入输出管脚
  #define P0_22_AD1_7  1//A/D转换器1输入7。该模拟输入总是连接到相应的管脚(仅用于 LPC2138)
  #define P0_22_CAP0_0 2//***定时器0的捕获输入通道0
  #define P0_22_MAT0_0 3//**定时器0的匹配输出通道0
#define P0_22_PINSEL   2 * P0_6


#define P0_23_GPIO     0//通用数字输入输出管脚
#define P0_23_PINSEL   2 * P0_7


//#define P0_24_GPIO     0//P0.24 脚未用
//#define P0_24_PINSEL 2 * P0_8


#define P0_25_GPIO     0//通用数字输入输出管脚
  #define P0_25_AD0_4  1//A/D转换器0输入4。该模拟输入总是连接到相应的管脚.D/A 转换器输出(仅用于 LPC2138)
#define P0_25_PINSEL   2 * P0_9


#define P0_26_GPIO     0//通用数字输入输出管脚
  #define P0_26_AD0_5  1//A/D转换器0输入5。该模拟输入总是连接到相应的管脚
#define P0_26_PINSEL   2 * P0_10


#define P0_27_GPIO     0//通用数字输入输出管脚
  #define P0_27_AD0_0  1//A/D转换器0输入0。该模拟输入总是连接到相应的管脚
  #define P0_27_CAP0_1 2//**定时器0的捕获输入通道1
  #define P0_27_MAT0_1 3//**定时器0的捕获输入通道1
#define P0_27_PINSEL   2 * P0_11


#define P0_28_GPIO     0//通用数字输入输出管脚
  #define P0_28_AD0_1  1//A/D转换器0输入1。该模拟输入总是连接到相应的管脚
  #define P0_28_CAP0_2 2//***定时器0的捕获输入通道2
  #define P0_28_MAT0_2 3//**定时器0的匹配输出通道2
#define P0_28_PINSEL   2 * P0_12


#define P0_29_GPIO     0//通用数字输入输出管脚
  #define P0_29_AD0_2  1//A/D转换器0输入2。该模拟输入总是连接到相应的管脚
  #define P0_29_CAP0_3 2//定时器0的捕获输入通道3
  #define P0_29_MAT0_3 3//定时器0的匹配输出通道3
#define P0_29_PINSEL   2 * P0_13


#define P0_30_GPIO     0//通用数字输入输出管脚
  #define P0_30_AD0_3  1//A/D转换器0输入3。该模拟输入总是连接到相应的管脚
  #define P0_30_EINT3  2//***外部中断3输入
  #define P0_30_CAP0_0 3//***定时器0的捕获输入通道0
#define P0_30_PINSEL   2 * P0_14


#define P0_31_GPO      0//通用数字输出管脚(注意:此管脚仅为输出)
#define P0_31_PINSEL   2 * P0_15


#define P0_31_GPO      0//通用数字输出管脚(注意:此管脚仅为输出)
#define P0_31_PINSEL   2 * P0_15


//RSIR
#define RSIR          (*((volatile unsigned char *) 0xE01FC180))//
  
  #define POR          0//RSIR.0//POR信号有效时该位置位,并清除RSIR寄存器的其它位
  #define EXTR         1//RSIR.1//RESET信号有效时该位置位
  #define WDTR         2//RSIR.2//当看门狗定时器溢出和看门狗方式寄存器的WDTRESET位为1时,该位置位。
                                //该位可被其它任何一个复位源清除。
  #define BODR         3//RSIR.3//当3.3V的电源降到低于2.6V时该位置位









//SPI0

//S0SPCR位定义
#define CPHA 3
#define CPOL 4
#define MSTR 5
#define LSBF 6
#define SPIE 7

//S0SPSR位定义
#define SPIF 7



//PCONP
#define PCSPI1     10//该位为1 时,SSP 接口使能。为0 时,SSP 接口被关闭以实现节电。



#endif  // __LPC213xDEF_H
2: LPC213XDEF.H之应用LPC213XDEF.H之应用



创建LPC213XDEF.H之目的---消除引脚配置头晕的郁闷



示例(所有配置都基于LPC2131开发板):



void KeyInit(void)
{
  PINSEL1 &= ~(3 << P0_16_PINSEL);//只清除P0_16原先的连接状态
  PINSEL1 |=  (P0_16_EINT0 << P0_16_PINSEL);//连接P0_16到EINT0,并保持其他连接不变



  PINSEL1 &= ~(3 << P0_20_PINSEL);//只清除P0_20原先的连接状态
  PINSEL1 |=  (P0_20_EINT3 << P0_20_PINSEL);//连接P0_20到EINT0,并保持其他连接不变



  IO0DIR &=~((1 << KEY1)  // 设置KEY1为输入
       |  (1 << KEY2)  // 设置KEY2为输入  
       |  (1 << KEY3)  // 设置KEY3为输入  
       |  (1 << KEY4)  // 设置KEY4为输入  
       |  (1 << KEY5)  // 设置KEY5为输入  
       |  (1 << KEY6));     // 设置KEY6为输入  
  
}




void VicIntSetup(void)
{
  VICIntSelect   = (1 << VICIntSel_EINT3);   // Enable a Vic Channel as FIQ



  EXTPOLAR       &= ~((1 << EXTPOLAR0)  //INT0为低电平有效
      |   (1 << EXTPOLAR3));//INT3为低电平有效
  EXTMODE        &= ~ (1 << EXTMODE0);   //设置INT0为电平触发
  EXTMODE        |=   (1 << EXTMODE3);   //设置INT3为边沿触发



  VICVectCntl0   = VICIntSel_Enable//使能IRQ中断
                 | VICIntSel_EINT0;//获取EINT0的IRQ级别
  VICVectAddr0   = (long) IRQ_Eint0;//取INT0中断服务地址
  VICIntEnable   = (1 << VICIntSel_EINT0); //使能EINT0中断
//////////////////////////////////////////////////////////////////////////////////////////////////
  VICVectCntl1   = VICIntSel_Enable//使能IRQ中断
              | VICIntSel_Time0;   
  VICVectAddr1   = (uint32)IRQ_Timer0;
  VICIntEnable   = (1 << VICIntSel_Time0);
  VICIntEnable   = (1 << VICIntSel_EINT3); //使能EINT3中断



  EXTINT = (1 << EINT0) | (1 << EINT1) | (1 << EINT2) | (1 << EINT3); //清除INT中断标志
}




void UART0_Init(void)
{
uint16 Fdiv;
  PINSEL0 |= (P0_0_TXD0 << P0_0_PINSEL) | (P0_1_RXD0 << P0_1_PINSEL); //设置I/O连接到UART0
  U0LCR = 0x83;      // DLAB=1,允许设置波特率
  Fdiv  = (Fpclk / 16) / UART_BPS; // 设置波特率
//  U0DLM = Fdiv / 256;
//  U0DLL = Fdiv % 256;
  U0DLM = 0;
  U0DLL = 94;//95;//96;//98;//97;
  U0LCR = 0x03;
}



void KeyInit(void)
{
  PINSEL1 &= ~(3 << P0_16_PINSEL);//只清除P0_16原先的连接状态
  PINSEL1 |=  (P0_16_EINT0 << P0_16_PINSEL);//连接P0_16到EINT0,并保持其他连接不变



  PINSEL1 &= ~(3 << P0_20_PINSEL);//只清除P0_20原先的连接状态
  PINSEL1 |=  (P0_20_EINT3 << P0_20_PINSEL);//连接P0_20到EINT0,并保持其他连接不变



  IO0DIR &=~((1 << KEY1)  // 设置KEY1为输入
       |  (1 << KEY2)  // 设置KEY2为输入  
       |  (1 << KEY3)  // 设置KEY3为输入  
       |  (1 << KEY4)  // 设置KEY4为输入  
       |  (1 << KEY5)  // 设置KEY5为输入  
       |  (1 << KEY6));     // 设置KEY6为输入  
  
}




void RtcInit(void)
{
    /* RTC初始化 */
  PREINT = Fpclk / 12980 - 1;     // 设置基准时钟分频器
  PREFRAC = Fpclk - (Fpclk / 12980) * 12980;
//  PREINT = Fpclk / 32768 - 1;     // 设置基准时钟分频器
//  PREFRAC = Fpclk - (Fpclk / 32768) * 32768;
   
//   YEAR = 2003;        // 初化年
//   MONTH = 6;            // 初化月
//   DOM = 20;            // 初化日
   
  CIIR = 0x01;        // 设置秒值的增量产生一次中断
  ILR = 0x03;      // 清除RTC增量和报警中断标志
  CCR = 0x01;            // 启动RTC
  RtcTime.Sec  = 0;
  RtcTime.Min  = 0;
  RtcTime.Hour = 0;
}




void VicIntSetup(void)
{
  VICIntSelect   = (1 << VICIntSel_EINT3);   // Enable a Vic Channel as FIQ
  EXTPOLAR       &= ~((1 << EXTPOLAR0)  //INT0为低电平有效
      |   (1 << EXTPOLAR3));//INT3为低电平有效
  EXTMODE        &= ~ (1 << EXTMODE0);   //设置INT0为电平触发
  EXTMODE        |=   (1 << EXTMODE3);   //设置INT3为边沿触发



  VICVectCntl0   = VICIntSel_Enable//使能IRQ中断
                 | VICIntSel_EINT0;//获取EINT0的IRQ级别
  VICVectAddr0   = (long) IRQ_Eint0;//取INT0中断服务地址
  VICIntEnable   = (1 << VICIntSel_EINT0); //使能EINT0中断
//////////////////////////////////////////////////////////////////////////////////////////////////
  VICVectCntl1   = VICIntSel_Enable//使能IRQ中断
              | VICIntSel_Time0;   
  VICVectAddr1   = (uint32)IRQ_Timer0;
  VICIntEnable   = (1 << VICIntSel_Time0);
  VICIntEnable   = (1 << VICIntSel_EINT3); //使能EINT3中断



  EXTINT = (1 << EINT0) | (1 << EINT1) | (1 << EINT2) | (1 << EINT3); //清除INT中断标志



/* VIC初始化 */
  VICVectCntl2   = VICIntSel_Enable//使能IRQ中断
                 | VICIntSel_RTC;
  VICVectAddr2 = (int)RTC_Int; // 设置中断服务程序地址
  VICIntEnable = (1 << VICIntSel_RTC);  // 使能RTC中断
}




void  MSPI_Init(void) {  
  PINSEL0 |= ((P0_4_SCK0 << P0_4_PINSEL) | (P0_5_MISO0 << P0_5_PINSEL) | (P0_6_MOSI0 << P0_6_PINSEL));
  IODIR0  |= (1 << RCLK);  // 设置RCLK控制口为输出
  IOCLR0   = (1 << RCLK);
  S0SPCCR = 0x52;              // 设置SPI时钟分频
  S0SPCR  = (1 << CPHA) |    // CPHA = 1, 数据在SCK 的第2个时钟沿采样
        (1 << CPOL) |    // CPOL = 1, SCK 为低有效
       (1 << MSTR) |    // MSTR = 1, SPI 处于主模式
       (0 << LSBF) |    // LSBF = 0, SPI 数据传输MSB (位7)在先
       (0 << SPIE);    // SPIE = 0, SPI 中断被禁止
}






注: 以上函数之间没任何联系,他们是在各自的实验模块中进行配置和初始化的.



     本帖主要是说明LPC213XDEF.H这样定义的好处.


3: 晕到~~~无奈被剥夺的ARM菜鸟资格 4: 自言自语呢 5: 晕到~~~在怀念我的"ARM菜鸟"资格证书... 6: 子欲展其事,必先藏也 7: 子曰: 看你晕不晕~~~ 8: 习惯了,一点都不晕,呵呵我发现我又回到AVR菜鸟时代了

最近几天在研究M128的DATASHEET,又发现好多似懂非懂的东东 9: 晕到~~~跨过M64就应该迈入ARM时代了 10: 我属于怀旧一派从LPC2104倒退回了M128 11: AVR不玩C++简直泛晕我在AVR根本不知道什么是C语言... 12: 你只顾着斗牛了所以忘掉C怎么玩了 13: 哈哈,红布掀起来的时候连牛都眼晕... 14: 牛眼晕那是被忽悠的不是被XX吓的,呵呵。。。 15: 好词呀~~~"忽悠"---以后"替代"晕了整天晕的连自己都被"忽悠"了... 16: 哈哈,这是忽悠的最高境界 17: lpc2132的AD精度试了没有?给AD脚几个电压0V,0.5V,1V,1.5V,2V,2.5V,3V,看看采样精度和线性如何? 18: 精度没什么好怕的,稳定度才是最大的敌人 19: 提精度的原因我用lpc  AD跳字比较厉害,板子是我自己做的,我估计是模拟电源的问题.

请你用zlg的开发板试一下.

中断可能对AD采样有影响,请hotpower验证一下.

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]