Blogs

NXP LPC17xx / 40xx:解码零件ID

ricky bennett.2016年8月25日4评论

这是第一个博客 尽管缺乏文档,但是如何处理恩智浦LPC17XX / 40XX处理器系列以及如何编程它们。 下一个博客将处理实施 LPC17xx / 40xx UART具有正确中断,后续博客将显示如何在RS485正常多帧模式(NMM)中使用UART with Auto 地址检测(AAD)。

我公司已经决定使用NXP LPC17xx / 40xx处理器线进行所有嵌入式项目。 由于线路中的每个处理器与其他处理器非常相似,因此我写了一个处理所有处理器的硬件层。 通过读取部分ID来处理差异以确定应用程序正在运行的处理器/族。 但是当我开始制作表格显示每个处理器的表格,如果它可以处理120 MHz等,那么它开始变得非常昂贵。

这是关于这次我开始良好的介绍零件ID表值,尤其是LPC177x / 8x的表:

本文以PDF格式提供,便于打印

部分ID没有太大意义。 为什么不仅给他们1774到1788的价值? 然后我意识到它们是展示了处理器的能力的标志。 所以我用各种手册坐下来开始解码标志。 After about 一个小时,我最后一组#defines掩盖了表示处理器功能的位域或定义位。

通过使用Address 0x1FFF1FF1的NXP引导码读取零件ID,使用 在应用程序编程(IAP)命令54中。 有关如何进行呼叫的更多信息,请参阅每个处理器用户手册中的闪存章节。 文档中未提及的一件事是 您必须禁用中断,因为地址0处的异常矢量表可能是 在呼叫期间重新映射。

NXP LPC17XX / 40xx处理器线分为两个家庭,每个家庭都有四个组。  The 处理器家庭是 lpc17xx和lpc40xx,以及 groups are LPCXX5X,LPCXX6X,LPCXX7X和LPCXX8X。

以下是我用来提取各种位字段的定义和 flags.  要提取位字段,请通过换档值向右移动部分ID,然后应用掩码。 要检查一下,并使用零件ID并检查非零。

#define Bit(BitNum)     (1u << (BitNum))

#define NXP_FAMILY_SHIFT        28      //!< Family right shift value
#define NXP_FAMILY_MASK         0x0Fu   //!< Family mask
#define NXP_FAMILY_LPC17xx      0x02u   //!< LPC17xx family
#define NXP_FAMILY_LPC40xx      0x04u   //!< LPC40xx family

#define NXP_GROUP_SHIFT         24      //!< Group right shift value
#define NXP_GROUP_MASK          0x0Fu   //!< Group mask
#define NXP_GROUP_LPCxx5x       0x05u   //!< LPCxx5x group
#define NXP_GROUP_LPCxx6x       0x06u   //!< LPCxx6x group
#define NXP_GROUP_LPCxx7x       0x07u   //!< LPCxx7x group
#define NXP_GROUP_LPCxx8x       0x08u   //!< LPCxx8x group

#define NXP_120_MHZ          (1u << 20) //!< 120 MHz capable
#define NXP_SD_CARD          (1u << 19) //!< SD card
#define NXP_LCD              (1u << 18) //!< LCD
#define NXP_PRAM             (1u << 16) //!< Peripheral memory (PRAM) available
#define NXP_PRAM_32K         (1u << 13) //!< 32K peripheral memory
#define NXP_CAN              (1u << 12) //!< CAN bus
#define NXP_ETHERNET         (1u << 11) //!< Ethernet
#define NXP_USB_OTG          (1u << 10) //!< USB On-The-Go
#define NXP_USB_HOST         (1u <<  9) //!< USB host
#define NXP_USB              (1u <<  8) //!< USB

#define NXP_RAM_SHIFT           4       //!< RAM size right shift value
#define NXP_RAM_MASK            0x0Fu   //!< RAM size mask
#define NXP_RAM_8K              0x01u   //!< 8 KB RAM
#define NXP_RAM_16K             0x02u   //!< 16 KB RAM
#define NXP_RAM_32K             0x03u   //!< 32 KB RAM
#define NXP_RAM_64K             0x04u   //!< 64 KB RAM

#define NXP_LPC1751_CRP      (1u <<  3) //!< CRP (LPC1751 only, else always 0)

#define NXP_FLASH_SHIFT         0       //!< Flash size right shift value
#define NXP_FLASH_MASK          0x07u   //!< Flash size mask
#define NXP_FLASH_32K           0x00u   //!< 32 KB flash
#define NXP_FLASH_64K           0x01u   //!< 64 KB flash
#define NXP_FLASH_128K          0x02u   //!< 128 KB flash
#define NXP_FLASH_256K          0x03u   //!< 256 KB flash
#define NXP_FLASH_512K          0x07u   //!< 512 KB flash

[]
评论 Stephaneb.2016年8月30日
感谢您发布您的第一个博客ricky。这看起来像一个有希望的系列,很可能对许多人有用。
[]
评论 ajitskale.2018年10月31日

你好

LPC1768我面临这个问题----->RTC仅用电源开启工作,即使硬币电池为3.3V连接到RTC引脚也是如此。在启动程序时,需要读取备份寄存器以加载RTC值。但在重置电源后,在我的情况下,备份寄存器未存储RTC值。

请建议解决方案......

谢谢
Ajit.
[]
评论 朱丽克2018年10月31日

您应该使用电源关闭VBAT引脚上的电压,然后确保在引脚上看到3.3V。如果您没有看到任何电压,电池可能会死,或电池电路不好。

另请确保您将0写入未定义的RTC寄存器位。有些位用于测试,并且可以同时导致计数器所有增量或根本不递增。

您还需要连接到RTCX1和RTCX2引脚的32 kHz晶体。没有它,RTC不计数。

这是我的RTC init序列:

1.通过在PCONP寄存器中写入1到位9(PCRTC)将电源应用于RTC外围设备

2.将0写入时钟控制寄存器(CCR)

3.将1写入启用位(CLKEN)以启用RTC

4.将1写入AUX寄存器(RTC_aux)中的振荡器故障位(RTC_OSCF)以清除振荡器故障检测标志。

[]
评论 ajitskale.2018年11月1日

感谢您的信息,我会检查我的设计..

要发布回复评论,请单击连接到每个注释的“回复”按钮。发布新的评论(不是回复评论),请在评论的顶部查看“写评论”选项卡。

注册将允许您参加所有相关网站的论坛,并为您提供所有PDF下载。

注册

我同意 使用条款隐私政策.

尝试我们偶尔但流行的时事通讯。非常容易取消订阅。
或登录