共2条
1/1 1 跳转至页
ARTX,LPC2131 ARTX水鸟LPC2131板实验笔记
问
/*--------------------------------------------------------
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验证一下.
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 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |