最新日志

发表于:2008-6-20 18:34:56
标签:LPC2368  

1

还有几块空板,想送给有意用LPC2368的网友,交个朋友

还有几块空板,想送给有意用LPC2368的网友,交个朋友,

优先考虑南京的朋友, 因为本人现在南京, 让俺们共同努力, 一齐进步!

 

点击此处查看原文 >>

系统分类: ARM   |    用户分类: 无分类    |    来源: 原创

评论(0) | 阅读(101)
发表于:2008-6-14 10:07:04
标签:无标签

0

上传已调试好的源程序,原理图

上传源程序和板子原理图请点击下载。

原理图是POWERLOIGC格式的。

rarrar

点击此处查看原文 >>

系统分类: ARM   |    用户分类: 无分类    |    来源: 原创

评论(0) | 阅读(163)
发表于:2008-6-13 19:01:27
标签:LPC2368  RTC  

0

LPC2368网络板DIY——RTC 调试记录(七)

       RTC的使用,首先要设置RTC的时钟源,2368可以有两种方式,1 使用PLL 分频得到32.768K的时钟,2 直接用外部32.768的晶体,不知NXP为何搞这两种方式,个人认为可能是为了降低功耗,当系统有电时用片上的PLLRTC供电,掉电时用外部晶体,这样可以延长电池寿命。但是要注意的是如果系统一直使用PLLRTC

时钟的话,掉电时间会丢失的,因为时钟没有了。下面的程序用来在CSTN屏上显示时间:格式为:Week Year—Month—Day Hour: Min

并用一个按键来校准时间,在板子上用K1,同时用光标来指示要修改的时间区域。

                K1          Single Click     Time Reg Value  Increase or Decrease

                K1      Double Click    Change the Modify Area

                K1      LongTime Click  Switch the INC or DEC

程序如下:

RTCTime RTCGetTime( void )

{

    RTCTime LocalTime;

 

    LocalTime.RTC_Sec = SEC;

    LocalTime.RTC_Min = MIN;

    LocalTime.RTC_Hour = HOUR;

    LocalTime.RTC_Mday = DOM;

    LocalTime.RTC_Wday = DOW;

    LocalTime.RTC_Yday = DOY;

    LocalTime.RTC_Mon = MONTH;

    LocalTime.RTC_Year = YEAR;

    return ( LocalTime );

}

 

void RTC_ISR (void)

{

    ILR |= ILR_RTCCIF;  /* clear interrupt flag */

 

    alarm_on = 1;  

 

}

 

RTC实时显示时间任务。

void  Task_RTC(void * pdata)

{

  RTCTime   current_time;

 

  YEAR_bit.YEAR = 2008;

  while(1)

  {

    while(alarm_on==0)

      OSTimeDly(10);

    alarm_on = 0;

    current_time = RTCGetTime();

    //CSTN_Filling_Window(0, 0, 15, 161, Red);

    Refresh_Time(current_time);

   

  }  

}

点击看大图

点击此处查看原文 >>

系统分类: ARM   |    用户分类:    |    来源: 原创

评论(0) | 阅读(113)
发表于:2008-6-13 18:51:21
标签:LPC2368  LCD  

0

LPC2368网络板DIY——CSTN 调试记录(六)

        CSTN屏的大小是 162X1326.5K色,我用的是8位并行的传输模式,点亮一个点需要两个发送周期。先送高字节,再送低字节。在调试的时候发现,图片的颜色老是不对,CSTN的驱动时序看了N遍,觉得没问题啊,于是考虑是不是其他程序模块影响到CSTN的操作了,然后我把操作系统给关了,CSTN屏就正常了,想想UCOS就用了个TIMER0啊,又看了看manual, 再对照TIMER0的配置程序,发现TIMER0 match out 功能使能了,而且使能的输出正好是CSTN CDM信号线上,导致CSTN分不出传送的是数据还命令,因而颜色混乱。

调试好的CSTN驱动如下:

void CSTN_Send_Cmd (unsigned char lcd_cmd)

{

  CSTN_EN;

  RD_HIGH;

  CSTN_CMD;

//data setup and hold time is 5nS minimum

//WR pulse width minimum is 20nS

  CSTN_Write(lcd_cmd);

  WR_LOW;

  WR_HIGH;

  CSTN_DIS;

}

 

void CSTN_Send_Data (unsigned char lcd_dat)

{

  RD_HIGH;

  CSTN_DAT;

  CSTN_EN; 

//data setup and hold time is 5nS minimum 

  CSTN_Write(lcd_dat);

  WR_LOW;

//acess cycle time is 50nS minimum ( from perious wr="0" to next  wr=0)

  WR_HIGH; 

  CSTN_DIS;

}

 

void CSTN_Filling_Window (unsigned char X0, unsigned char Y0, unsigned char X1,\

                         unsigned char Y1, unsigned int filling_color)

{

  unsigned int i, pixel;

  unsigned char higher_byte, lower_byte;

 

  pixel = (X1 - X0 + 1) * (Y1 - Y0 + 1);

  higher_byte = (filling_color >>8) & 0xff;

  lower_byte  = filling_color & 0xff;

 

  Def_Window(X0, Y0, X1, Y1);

  for (i=0; i

  {

     CSTN_Send_Data(higher_byte);

     CSTN_Send_Data(lower_byte);           

  }

}

点击此处查看原文 >>

系统分类: ARM   |    用户分类:    |    来源: 原创

评论(0) | 阅读(83)
发表于:2008-6-13 18:43:44
标签:LPC2368  I2C  

0

LPC2368网络板DIY——I2C PCF8574 调试记录(五)

调试完了FAST GPIO,开始进入I2C接口调试,主要实现对PCF8574的控制,整个程序是个状态机,I2C 中断服务程序根据不同的状态确定下一步要做的事情。首先确定8574的地址,由于原理图上我接的是A1A2A30,故地址为0x40. 在调试时发现一个令人很迷茫的问题。每当程序复位后开始运行,发送I2CStart 位后,也能进入I2C中断,就是在进入switch  case 语句时,只要对STA(起始位),SI(中断位)清零都会导致整个积存器被清零。郁闷的不行,manual 来来回回看了N遍觉得没错啊,就是不知问题出在那里。

最后实在是没辙了,在SI清除指令后,再清除一次,居然行了,I2C可以正常的发送数据了,然后我把多余的指令删掉,放一条__nop_operation; 发现也是可以的,可能是因为位清除的操作指令执行的太快了的缘故。

 

下面是I2C 发送数据给8574的程序:

我用了中断处理加环型对列的结构,pTx 只指向发送缓冲区, pRx指向接收缓冲区。

void  I2C0_ISR(void)

{

  INT8U   bus_state;

  queue * pTx;

  queue * pRx;

 

  pTx = & TxBuffer;

  pRx = & RxBuffer;

 

  bus_state = Get_I2CState();

 

  switch  (bus_state & 0xF8)

  {

//-----------------------------------------------------------------------------

//I2C interrupt Status int the Master Tranceiver mode

//-----------------------------------------------------------------------------

  case  0x0:

    I2C_BusPend;

    break;

  case  0x08:                       //bus is initiate   

    I2C_SendAddr(ADDR8574, rw);

    I2C_StartClr;

    break;

  case  0x18:                       //control logic receive the Ack for address   

    if(pTx->s==1)

      I2C0DAT = Queue_DataOut(pTx);

    else

      I2C_BusPend;

    break;

  case  0x20:                       //doesn't get the ACK pluse   

    I2C_BusPend;

    I2C_BusStart;

    break;

  case  0x28:                     //ACK inform the master get the data

    if(pTx->s==0)

      I2C_BusPend;

    break;

  case  0x10:

    I2C_StartClr;

    I2C_SendAddr(ADDR8574, rw);

    break;

  case  0x30:                     //Send data error

    I2C_BusPend;

    break;

//-----------------------------------------------------------------------------

//I2C interrupt Status int the Master receiver mode

//Add code here for the I2C bus in the Master receiver mode

//-----------------------------------------------------------------------------

 

//-----------------------------------------------------------------------------

//I2C interrupt Status int the Slave Tranceiver mode

//Add code here for the I2C bus in the Slave Tranceiver mode

//-----------------------------------------------------------------------------   

       

//-----------------------------------------------------------------------------

//I2C interrupt Status int the Slave receiver mode

//Add code here for the I2C bus in the Slave receiver mode

//-----------------------------------------------------------------------------     

   

  default:  break;

  }   

  I2C_ISRClr;  

}              

点击此处查看原文 >>

系统分类: ARM   |    用户分类:    |    来源: 原创

评论(0) | 阅读(117)
发表于:2008-6-13 18:31:26
标签:LPC2368  FAST  GPIO  

0

LPC2368网络板DIY——FastGPIO 调试记录(四)

LPC2368GPIO可以配置为low speed high speed 两种模式,PORT0PORT1默认为low speed模式,PORT2,PORT3, PORT4只能工作在high speed模式。特别要注意的是在外围器件的时序要求比较严格的情况下对IO口的操作,最好不要用对IOXSETIOXCLR中的对应位置一的模式,因为对IOXSETIOXCLR操作,写入的值不会立即反映在芯片的管脚上,这种情况下最好直接对IOXPIN直接写入。

如:

          FIO2PIN0 = 0x80;

即可立即改变P2.7的状态。

LPC2368 GPIO的另一个优点是操作比较灵活,一个32BIT的积存器可以按 double word(32), Word16位), Byte8位)的方式来操作。

下面的程序是我用FAST GPIO 来做按键扫描的例子

系统中有四个按键,每个按键可以有Single Click单击, Double click双击, LongTime Click长击,三种属性。并且用一个8bit的整型来表示按键的返回值。Bit4Bit7表示按键代码,

Bit0Bit3表示按键的属性。

按键编码如下:

                     #define   K1_Click          0x11

#define   K1_DoubleClick    0x12

#define   K1_LongTimeClick  0x13

#define   K2_Click          0x21

#define   K2_DoubleClick    0x22

#define   K2_LongTimeClick  0x23

#define   K3_Click          0x41

#define   K3_DoubleClick    0x42

#define   K3_LongTimeClick  0x43

#define   K4_Click          0x41

#define   K4_DoubleClick    0x42

#define   K4_LongTimeClick  0x43

 

按键扫描程序如下:

INT8U KeyScan(void)

{

  OS_CPU_SR cpu_sr;

  INT8U encode = 0;

  INT32U  osclk;

 

  if(K1==0 || K2==0 || K3==0 || K4==0)

  {

    OSTimeDly(20);                             //avoid the Key stroke skew

    if(K1==0)

      encode |= KEY1_Encode;

    if(K2==0)

      encode |= KEY2_Encode;

    if(K3==0)

      encode |= KEY3_Encode;

    if(K4==0)

      encode |= KEY4_Encode;

    if(GetKey(encode)==1)       

      return NoKey;

    else                                      // key is still pressed

    {

      OS_ENTER_CRITICAL();

      osclk = OSTime;

      OS_EXIT_CRITICAL();

      while(GetKey(encode)==0)                //wait for KEY Released

      {

        OSTimeDly(10);

        OS_ENTER_CRITICAL();

        if(OSTime-osclk>=3000)                // if the Key is LongTime click

          encode |= LongTime_Click; 

        OS_EXIT_CRITICAL();       

      }

      if((encode & 0x0f)==LongTime_Click)

        return  encode;

      else

      {

        OS_ENTER_CRITICAL();

        osclk = OSTime;

        OS_EXIT_CRITICAL();

        while(GetKey(encode)==1)

        {

          OSTimeDly(10);

          OS_ENTER_CRITICAL();

          if(OSTime-osclk>300)                //if key doesn't response in 300mS

            encode |= Single_Click;           //key will be judge as Single Click

          OS_EXIT_CRITICAL();

          if((encode & 0x0F)==Single_Click)

            break;    

        }

          if((encode & 0x0F)==Single_Click)

            return  encode;

          else

          {

            while(GetKey(encode)==0)

              OSTimeDly(10);

            return  encode | Double_Click;    //key response in 300mS will be judge

                                              //as Double Click event

          }

      }

    }       

  }

  else

  {

    OSTimeDly(20);

    return  NoKey;

  }

}

点击此处查看原文 >>

系统分类: ARM   |    用户分类:    |    来源: 原创

评论(1) | 阅读(106)
发表于:2008-6-13 18:28:38
标签:LPC2368  UCOS  

0

LPC2368网络板DIY——uCOS移植 调试记录(三)

 硬件调好之后,俺就开始准备把UCOS移上来,由于以前在LPC2132上移植过,所以要做工作量不是很大,主要是重新配置下系统的资源如: PLLMAMVIC中断系统,和Timer,并重写中断处理函数。

PLL的配置,我采用了逐一试探的方法,先确定晶体的分频值N,然后根据输入的系统运行频率求出PLL的倍频值M,并使PLL Synthesizer 输出的频率介于 275550MHz之间。程序如下:

INT8U Config_Clock(CLKSEL clksrc, INT32U fosc, INT32U clk)

{

  INT16U  i;

  INT32U  clkdiv;

  if(clk>F72MHZ || fosc>F50MHZ)

    return  0;

  //STEP 1 

 

  PLLCON_bit.PLLC = 0;

  PLLFEED = 0xAA;

  PLLFEED = 0x55;

  SCS |= 0x20;

  //while( !(SCS & 0x40) );

  //STEP 2

  PLLCON_bit.PLLE = 0;

  PLLFEED = 0xAA;

  PLLFEED = 0x55;

  //STEP 3

  switch  (clksrc)

  {

  case  RC:

    CLKSRCSEL_bit.CLKSRC = RC;

    break;

  case  OSC:

    CLKSRCSEL_bit.CLKSRC = OSC;

    break;

  case  RTC:

    CLKSRCSEL_bit.CLKSRC = RTC;

    break;

  default: return 0; 

  }

  //STEP 5, assume N="1"

  for(i=6;i<513;i++)

  {

    clkdiv = (fosc*(i+1)*2)%clk;

    if(clkdiv==0)

    {

      clkdiv = (fosc*(i+1)*2)/clk;

      if(clkdiv%2==0)

        break;

    }

    if(i==514)

      return 0;

  }

  PLLCFG_bit.MSEL = i;

  PLLCFG_bit.NSEL = 0;

  PLLFEED = 0xAA;

  PLLFEED = 0x55;

  //STEP 6

  PLLCON_bit.PLLE = 1;

  PLLFEED = 0xAA;

  PLLFEED = 0x55;

  //STEP 7

  CCLKCFG = clkdiv-1;

  //STEP 8

  //while(PLLSTAT_bit.PLOCK!=1);

  //STEP 9

  PLLCON_bit.PLLC = 1;

  PLLFEED = 0xAA;

  PLLFEED = 0x55;

    return 1;

}

存储器加速模块MAM可以提高系统运行的速度,避免CPU在每个时钟周期都跑到

FLASH区去取指令和数据,从而加快系统运行速度。MAM配置的根据是系统的运

行频率,还要注意的是,MAM必须先关闭,然后才可以对其进行配置,配置完毕

后在使能MAM,如果在MAM打开的状态下去修改MAM Reg的值会导致CPU取指混

乱,程序自然会跑飞,俺可是体验过的。

MAM的配置程序如下:

       void  MAM_Config(INT32U clk)

{

             //disable Memory acceleratolr

               MAMCR_bit.MODECTRL = 0;

              if(clk

                    MAMTIM_bit.CYCLES = 1;

              else if(clk>F20MHZ && clk

                   MAMTIM_bit.CYCLES = 2;

              else if(clk>F40MHZ)

                   MAMTIM_bit.CYCLES = 3;

              //MAM REG must be disable first

             MAMCR_bit.MODECTRL= 2;

}

最关键的部分还是中断处理程序,这部分由于LPC2368VIC2132的差别还蛮大的,所以要重写了,2368没有非向量中断这一说,只有IRQ,和FIQ2132里设置IRQ的优先级是把中断向量等级SLOT赋给VICVECTCtrl015的低5位,SLOT0,优先级最高。2368是把SLOT赋给32