zoukankan      html  css  js  c++  java
  • 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 令牌,后面是设备对应的数据

  • 相关阅读:
    jQuerychicun
    css3动画
    app开发,H5+CSS3页面布局小tips
    函数基础
    函数
    冒泡排序
    关于Vue+iview的前端简单的导入数据(excel)
    关于Vue+iview的简单下拉框滚动加载
    ES6中set的用法回顾
    百度地图api设置点的自定义图标不显示
  • 原文地址:https://www.cnblogs.com/zsb517/p/2532395.html
Copyright © 2011-2022 走看看