LPC1343整理

LPC1343(1)下载

时隔3年又开始学处理器,呵呵,LED灯有亮起来了,刚开始接触这个处理器,遇到的问题还蛮多

(1)JLINK管脚也可以用作普通的IO,刚开始的时候,因为程序占用的问题,JLINK不能正常连接

(2)LPC1343支持串口下载和USB导入,是通过管脚来控制的,但是都和复位管脚有联系,这两种方式都没开始尝试

(3)JLINK下载以后需要复位,KEIL MDK时使用的时候需要主要debug选项中的设置,另外MDK下载程序的时候失败,问题原因不明白

(4)注意存储器的内部空间分布,因为MDK之类的编译器对寄存器的定义也是根据内部存储区的分布来定义的,使用结构体来操作,和单片机很不同,不过很方便

(5)推荐去电子世界网站看看,那里面关于这个处理器的资料比较多

(6)JLINK使用SWD模式更方便点,较少了管脚

LPC1343(2)系统节拍器

在MDK m3内核文件中有初始化函数,可以不用自己去设置寄存器,代码:

/* ##################################    SysTick function  ############################################ */

#if (!defined (__Vendor_SysTickConfig)) || (__Vendor_SysTickConfig == 0)

/* SysTick constants */
#define SYSTICK_ENABLE              0                                          /* Config-Bit to start or stop the SysTick Timer                         */
#define SYSTICK_TICKINT             1                                          /* Config-Bit to enable or disable the SysTick interrupt                 */
#define SYSTICK_CLKSOURCE           2                                          /* Clocksource has the offset 2 in SysTick Control and Status Register   */
#define SYSTICK_MAXCOUNT       ((1<<24) -1)                                    /* SysTick MaxCount                                                      */

/**
 * @brief  Initialize and start the SysTick counter and its interrupt.
 *
 * @param  uint32_t ticks is the number of ticks between two interrupts
 * @return  none
 *
 * Initialise the system tick timer and its interrupt and start the
 * system tick timer / counter in free running mode to generate
 * periodical interrupts.
 */
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{
  if (ticks > SYSTICK_MAXCOUNT)  return (1);                                             /* Reload value impossible */

  SysTick->LOAD  =  (ticks & SYSTICK_MAXCOUNT) - 1;                                      /* set reload register */
  NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);                            /* set Priority for Cortex-M0 System Interrupts */
  SysTick->VAL   =  (0x00);                                                              /* Load the SysTick Counter Value */
  SysTick->CTRL = (1 << SYSTICK_CLKSOURCE) | (1<<SYSTICK_ENABLE) | (1<<SYSTICK_TICKINT); /* Enable SysTick IRQ and SysTick Timer */
  return (0);                                                                            /* Function successful */
}

#endif

 

可 以看出,系统默认使用主时钟,而不是节拍时钟分频器分频后的时钟,节拍器是24伟减数定时器,在为0的时候,重载LOAD里面的值,这个值需要初始化,控 制使这个节拍器的存储器有:SYSTICK时钟分频器寄存器(使用主时钟的话,可以不用理他,默认关闭),系统定时器控制和状态寄存器 ctrl,控制使能,时钟源,中断使能; 系统定时器重载值寄存器LOAD,写0可以清楚里面的数值;

节拍器的初始值不正确的话,得不到想要的结果,计算值可以是clk/1000;,测试代码:


 #include<LPC13xx.h>
 #include "gpio.h"
   
 void SysTick_Handler(void);
 void Delay (uint32_t dlyTicks);
 uint32_t msTicks = 0;

 void SysTick_Handler(void)
 {
         msTicks ++ ;
 }
 void Delay (uint32_t dlyTicks)
{
    uint32_t curTicks;
    curTicks = msTicks;
    while ((msTicks - curTicks) < dlyTicks);
}
  int main()
 {


     GPIOInit();
    SysTick_Config(12000);  //初始化节拍器
    GPIOSetDir(PORT1,5,1);

    while (1)                                
    {
        GPIOSetValue( PORT1, 5, 0 );
        Delay (1000);               //节拍器延时
         /* 软件循环延时 */
          //    for (i = 0; i < 0xFFFFF; i++);

         GPIOSetValue( PORT1, 5, 1 );

        /* 软件循环延时 */
       //for (i = 0; i < 0xFFFFF; i++);
        Delay (1000);              //节拍器延时
   }
     return 1;
 }

LPC1343(3)定时器

LPC1343有4个定时器,2个16位的,2个32位的,涉及到的寄存器使用方法基本一样, 所以用起来其实还是蛮方便的。使用的代码是网上LPC1100的代码,稍加修改,删去了一些不必要的东西。使用的时候注意的问题:

(1)注意时钟,系统没做系统初始化的时候,使用的内部12M的时钟,可以根据这个时钟计算需要的定时长度

(2)在我的板子上,不知道什么问题,对系统进行初始化的时候,竟然失败了,然后系统一直在等待PLL的锁定

(3)定时器的用法有很多,可以根据匹配后的状态等去实现多种用途、

(4)用定时器去做延时的方法似乎好是不错的,至少精度有保证了

lPC1343(4)USB HID

 使用USB_HID需要了解USB本身的实现方法,USB事物处理、数据传输类型、描述符以及请求管道等,HID和一般的USB设备不一样,HID中

(1)数据是在报表结构中,通过控制传输和中断传输完成数据局发送和请求。

(2)了解USB的描述符和HID的三个特殊描述符以及6个HID特定请求

(3)理解USBHID数据处理的过程

(4)所有的 HID 设备通过 USB的控制管道(默认管道,即端点 0)和中断管道与主机通信

(1)与HID设备描述符相关的

   2.HID 设备的描述符除了 5个 USB的标准描述符(设备描述符、配置描述符、接口描述符、端点描述符、字符串描述符;设备描述符中 bDeviceClass、bDeviceSubClass和 bDeviceProtocol三个字段的值必须为零;接口描述符中 bInterfaceClass 的值必须为 0x03,bInterfaceSubClass的值为 0 或 1,为 1表示 HID 设备符是一个启动设备(Boot Device,一般对 PC 机而言才有意义,意思
是BIOS启动时能识别并使用您的HID设备, 且只有标准鼠标或键盘类设备才能成为Boot Device。如果为 0则只有在操作系统启动后才能识别并使用您的 HID 设备);

(3)与设备报表相关

         http://imcu.blogbus.com/logs/38306643.html

       http://blog.csdn.net/alien75/article/details/4622319

      http://hi.baidu.com/woodeasyyang/blog/category/Usb

LPC1343(5)USB底层

LPC1343 USB使用笔记1

该笔记是查阅周公LPC1300文档记录

1基本配置

  (1)IOCONFIG,如果你需要VBUS、soft_connect的功能话,需要设置通过这里俩设置,USB信号管脚默认,不用设定

 (2)SYSAHBCLKCTRL使能14位

 (3)设置USB的时钟,在MDK下,起始文件中的  SystemInit();函数已经设置好了USB时钟,不用自己费心,不过要看得懂代码的内容

2.看USB方面的需要对USB的协议有所了解,看起来就不会云里雾里,例如USB事物处理,USB的传输方式,配置符,特别是USB传输的过程

3.LPC1343的结构

  ATX:相当于信号的解码吧,模拟转换为数字

  SIE:USB协议实现部件,。SIE 对 EP_RAM 中的端点缓冲区和 USB 总线之间的数据传输进行处理

  EP_RAM :每个端点都有一个保留空间,宗的EP_RAM 是固定的

4.soft_connect

可 以利用实现主机与设备的连接和断开,在使用 SoftConnect 特性时, CONNECT _USB 信号应控制一个外部开关,这个开关与USB_DP 和+3.3V 之间的 1.5kΩ 电阻相连。然后,通过使用 SIE 设置设备状态指令来对 CON 位执行写操作,从而实现软件对 CONNECT _USB 信号的控制

5.USB的功率

1)一个处于未配置状态下的设备从总线中汲取的最大电流应为 100mA。
2)一个已配置好的设备能够汲取的电流最高只能达到配置描述符的 Max Power字段中规定的值。这个最大值为 500mA。
3)处于挂起状态的设备能够汲取的最大电流为 500μA。

(4)为了节省功率,USB 设备控制器在不使用时自动禁止 PCLK和 USB_MainClk

6.USB的寄存器

(1)USBDevintSt、USBDevintEn、USBDevIntSet和USBDevintClr的位分配是固定的,并且相同

USBDevintST中段状态寄存器,只能读数据

USBDevintEn中断使能寄存器,向该寄存器中的某个位写入 1 时,如果 USBDevintSt 中的对应位置位,则可以产生一个外部中断。如果未置位,便无法产生外部中断,

USBDevintSt中断清零寄存器,写1有效

USBDevIntSet中断设置寄存器,向该寄存器中的某个位写入 1 可将USBDevIntSt中的对应位置位,只写

(2)SIE命令代码寄存器

USBCmdCode命令寄存器。控制读、写、命令

USBCmdData数据寄存器,都数据的时候

(3)USB数据传输寄存器

USB 接收数据寄存器位:USBRxData  ---在读取该寄存器之前,应当对USBCtrl寄存器中的RD_EN位和LOG_ENDPOINT字段进行适当的设置。在读取该寄存器时,将提取来自所选的端点缓冲区的数据

USB 发送数据寄存器位:USBTxData ---在对该寄存执行写操作之前,应该对USBCtrl 寄存器的 WU_EN位和 LOG_ENDPOINT 字段进行适当的设置,并将数据包的长度写入USBTxPlen 寄存器。

USB 接收包长度寄存器位描述USBRxPLen ---给出了正在传输的当前数据包剩余在 RAM 的字节数???

USB 发送包长度寄存器位描述USBTxPLen ---包含从处理器传送到 RAM的字节数

USB 控制寄存器位描述(USBCtrl ---设置控制模式,读数据或者写数据,并且选择逻辑端点编号

(4)数据读写

当 软件从端点缓冲区读取数据时,它要将读使能位设为高电平,并对逻辑端点编号进行编程。控制逻辑首先提取包长度并发送到接收包长度寄存器。同时硬件用数据包 的第一个字填入接收数据寄存器。 现在软件可以启动对接收数据寄存器的读操作。当到达包的末尾时,将通过控制逻辑将读使能位禁能,并且在设备中断状态寄存器中设置 RxENDPKT 位。
如果在读数据的过程中,软件使读使能位中途变低电平,则读操作将停止。在这种情况下,数据保留在 RAM 中。当该端点的读使能信号再次变为高电平时,将从头开始读数据。 对于向端点缓冲区写入数据,写使能位为高电平,软件应当向 Tx Packet 长度寄存器写入要发送的数据包的字节数。然后在发送数据寄存器内持续地进行写操作。当控制逻辑接收到在 Tx Packet 长度寄存器中编程的字节数时,它将复位写使能位。如果软件在中途便复位写使能位,则写操作将作从头开始。
注:在对USB 控制寄存器编程之后,从RAM中提取数据包长度需要3 个时钟周期。如果在对USB 控制寄存器编程之后立即读取数据包长度(在编程后的下一个时钟周期),则读到的数据包长度的值可能不准。为了避免这种问题,需要在编程USBCtrl寄存 器和读取包长度寄存器之间加入一个NOP指令。

(5)USB 设备FIQ选择寄存器位描述(USBDevFIQSel ---当该寄存器中的某个位设为‘1’时,对应的中断将进入最高优先级的中断线上。不允许同时将所有位设为‘1’

7SIE控制

(1) 命令阶段:对 USBCmdCode寄存器执行写操作,将 CMD_PHASE 字段设为 0x05 (命令),CMD_CODE 字段设为所需的命令代码。在命令执行完后,USBDevIntSt 寄存器中的 CCEMPTY位置位

(2)写操作,将 USBCmdCode 寄存器中的 CMD_PHASE 字段设为 0x01(写) ,CMD_WDATA 设置为所需的写数据。在完成写操作后,USBDevIntSt 寄存器中的 CCEMPTY 位置位。

(3) 读操作,将 USBCmdCode 寄存器中的 CMD_PHASE 字段设为 0x02 (读) , CMD_CODE 字段利用读对应的命令代码来设置。在完成读数据后, USBDevInSt寄存器中的 CDFULL 位置位,表明USBCmdData 寄存器中的数据在执行读操作时是可用的。

(4)命令解释:

设置地址(命令:0xD0,数据:写 1 个字节) :设置地址命令用于设置 USB 分配的地址并使能(内含的)函数。设备中的地址设置将在控制处理的状态阶段后生效。当总线复位时,DEV_ADDR 设置为 0x00,并且 DEV_EN设置为 1,设备将响应函数地址为 0x00,端点为0(默认端点)的数据包。

配置设备(命令:0xD8,数据:写 1 个字节):向寄存器写入 1 表示设备已配置,并且所有使能的非控制端点将作出响应。在默认状态下,即使设备没有配置,控制端点也始终是使能的并能作出响应。

设置模式(命令:0xF3,数据:写 1 个字节) :配置时钟和中断相应时间

读中断状态(命令:0xF4,数据:读 2 个字节)

读当前帧编号(命令:0xF5,数据:读 1 个或 2个字节):返回上一次成功接收的 SOF 的帧编号。

读芯片ID(命令:0xFD,数据:读 2 个字节)

设置设备状态(命令:0xFE,数据:写 1 个字节):设置设备状态命令将对设备状态寄存器中的位进行设置。

获取设备状态(命令:0xFE,数据:读 1 个字节):获取设备状态命令返回设备状态寄存器的值为了保证操作正确,在执行获取设备状态命令之前必须清除USBDevIntSt寄存器的DEV_STAT 位。

获取错误代码(命令:0xFF,数据:读 1 个字节):获取错误代码命令将返回上一次发生的错误代码

选择端点(命令:0x00 – 0x09 数据:读 1个字节(可选) :选择端点指令将一个内部指针初始化为指向 EP_RAM 中所选缓冲区的起始字节。可以选择的是,该命令后面可以是读数据操作,它可以在端点缓冲区的数据包上返回一些附加信息。

选择端点/清除中断(命令:0x40 – 0x47,数据:读 1个字节) :

设置端点状态(命令:0x40 – 0x49,数据:写入 1个字节(可选) ) :设置端点状态命令用于设置端点的状态位 7:5 和位 0。

清空缓冲区(命令:0xF2,数据:读 1 个字节(可选) ) :

   确认缓冲区(命令:0xFA,数据:无) :

8.:USB是一个主机控制的协议,即不管数据是从主机到设备还是从设备到主机,传输的序列通常由主机进行初始化。在数据从设备传输到主机的过程中,主机向设备发送IN 令牌,后面是设备对应的数据

 

 

posted @ 2012-06-03 00:09  RubbyZhang  阅读(1535)  评论(0编辑  收藏  举报