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 令牌,后面是设备对应的数据

  • 相关阅读:
    The Python Standard Library
    Python 中的round函数
    Python文件类型
    Python中import的用法
    Python Symbols 各种符号
    python 一行写多个语句
    免费SSL证书(https网站)申请,便宜SSL https证书申请
    元宇宙游戏Axie龙头axs分析
    OLE DB provider "SQLNCLI10" for linked server "x.x.x.x" returned message "No transaction is active.".
    The operation could not be performed because OLE DB provider "SQLNCLI10" for linked server "xxx.xxx.xxx.xxx" was unable to begin a distributed transaction.
  • 原文地址:https://www.cnblogs.com/zsb517/p/2532395.html
Copyright © 2011-2022 走看看