lpc54102双核介绍及LPC54102寄存器直接编程

发布者:SparklingSun最新更新时间:2023-03-20 来源: elecfans关键字:LPC54102  寄存器 手机看文章 扫描二维码
随时随地手机看文章

  随着科技的进步,双核逐渐被淘汰已是时间上的问题,四核乃至八核心CPU也已不再是什么新奇的事物,不过在微控制器领域,双核却是个十分新颖的东西。很多工程师朋友在开发MCU应用系统的时候,若是系统功能复杂、一颗MCU芯片无法满足要求,往往会采用多颗MCU协同工作,把一些“打杂”的工作交给低端的MCU完成,高端的MCU则可以放开“手脚”,完成系统主要的任务。不过这样一来,系统研发的复杂性,成本以及可靠性都会受到不同程度的影响,多微控制器方案带来系统的功耗问题也不容小视。对此,恩智浦推出了基于ARM Cortex-M4和 ARM Cortex-M0+非对称双核架构的LPC54102系列微控制器,旨在提供一个低功耗高性能的双核解决方案,用于超低功耗传感器侦听到数据整合、传感器融合或其他传感器数据处理。


  有幸拿到了搭载LPC54102双核微控制器的LPCXpresso54102开发套件。该套件采用的包装与STM32 Nucleo系列板卡的外包装材料相同,均为透明塑料外壳。这样的包装虽然降低了成本,但在视觉表现上却一点也不逊色于其他包装,透明材料的使用更加凸显出板卡的精致,使得板卡的芯片资源“一丝不挂”地呈现在大家的眼前。

  

  打开包装,取出LPCXpresso54102板卡,板卡整体采用墨蓝色阻焊和乳白色丝印,让人眼前一亮,pcb焊盘的沉金工艺,更是显得高端大气。虽然LPCXpresso54102板卡的设计思路与STM32 Nucleo板卡大致相似,都是板载仿真器加核心板的结构,但相比于Nucleo板卡,LPCXpresso54102明显大了很多,元器件的布局也紧凑了不少。

  

  这块板卡一共有两个micro usb接口,使用普通安卓手机充电数据线便可以和计算机相连接。位于上方的接口是专门给LPC54102供电的接口,给除LINK2仿真器外的部件供电,在不需使用板载调试器时可以连接此接口。心细的话,会发现这个micro usb接口右边还有一个P3接口、是一个两线的排针,分别是5V和GND,此举也是结合了工程师的需求,留出外部电源的接口。下方的USB接口则是LPCLINK2仿真器的接口。说道这里,不得不重点了解一下LPCLINK2仿真器,NXP在这款仿真器的设计上,可谓是不惜成本,主控芯片的选择便显现出霸气,LPC4322双核MCU让LINK2充满了“暴力”!

  

  LPC54102有多个串口,我尝试用寄存器直接操作!经过多次测试,可以发送和接收数据!内部晶振12MHz,没有锁频,波特率9600b/s,使用第一个串口!也可以把其它串口都用上。


  参考代码:

  unsigned long buf;

  #define DELAY_COUNT 0xFFFF

  void Delay( long int Count)

  {

  for(; Count!= 0;Count--);

  }

  main()

  {

  *(long*)0x400000c0=0xe10b;///使能P0口

  *(long*)0x1c002000=0xf0000002;

  *(long*)0x4001C004=0x191;///p01为串口

  *(long*)0x4001C000=0x191;;///p00为串口

  *(long*)0x40000020=0x1;

  *(long*)0x40080010=0x8002;///

  *(long*)0x40084000=0x4;

  *(long*)0x40084020=78;///9600b/s

  *(long*)0x40084000|=0x1;

  ///printf(“hello world!”);

  asm(“nop”);

  *(long*)0x4008401c=‘L’;///buf;

  while(!(*(long*)0x40084008&0x04));

  *(long*)0x4008401c=‘P’;///buf;

  while(!(*(long*)0x40084008&0x04));

  *(long*)0x4008401c=‘C’;///buf;

  while(!(*(long*)0x40084008&0x04));

  *(long*)0x4008401c=‘5’;///buf;

  while(!(*(long*)0x40084008&0x04));

  *(long*)0x4008401c=‘4’;///buf;

  while(!(*(long*)0x40084008&0x04));

  *(long*)0x4008401c=‘1’;///buf;

  while(!(*(long*)0x40084008&0x04));

  *(long*)0x4008401c=‘0’;///buf;

  while(!(*(long*)0x40084008&0x04));

  *(long*)0x4008401c=‘2’;///buf;

  while(!(*(long*)0x40084008&0x04));

  *(long*)0x4008401c=0xd;///buf;

  while(!(*(long*)0x40084008&0x04));

  *(long*)0x4008401c=0xa;///buf;

  while(!(*(long*)0x40084008&0x04));

  while(1)

  {

  *(long*)0x4008401c=‘L’;///buf;

  while(!(*(long*)0x40084008&0x04));

  *(long*)0x4008401c=‘P’;///buf;

  while(!(*(long*)0x40084008&0x04));

  *(long*)0x4008401c=‘C’;///buf;

  while(!(*(long*)0x40084008&0x04));

  *(long*)0x4008401c=‘5’;///buf;

  while(!(*(long*)0x40084008&0x04));

  *(long*)0x4008401c=‘4’;///buf;

  while(!(*(long*)0x40084008&0x04));

  *(long*)0x4008401c=‘1’;///buf;

  while(!(*(long*)0x40084008&0x04));

  *(long*)0x4008401c=‘0’;///buf;

  while(!(*(long*)0x40084008&0x04));

  *(long*)0x4008401c=‘2’;///buf;

  while(!(*(long*)0x40084008&0x04));

  *(long*)0x4008401c=0xd;///buf;

  while(!(*(long*)0x40084008&0x04));

  *(long*)0x4008401c=0xa;///buf;

  while(!(*(long*)0x40084008&0x04));

  Delay(DELAY_COUNT);

  Delay(DELAY_COUNT);

  Delay(DELAY_COUNT);

  }

  }

  ///下边是老外的头文件定义

  /* Main memory addresses */

  #define LPC_FLASHMEM_BASE 0x00000000UL

  #define LPC_SRAM0_BASE 0x02000000UL

  #define LPC_SRAM1_BASE 0x02010000UL

  #define LPC_ROM_BASE 0x03000000UL

  #define LPC_SRAM2_BASE 0x03400000UL

  #define LPC_GPIO_PORT_BASE 0x1C000000UL

  #define LPC_DMA_BASE 0x1C004000UL

  #define LPC_CRC_BASE 0x1C010000UL

  #define LPC_SCT_BASE 0x1C018000UL

  #define LPC_MBOX_BASE 0x1C02C000UL

  #define LPC_ADC_BASE 0x1C034000UL

  #define LPC_FIFO_BASE 0x1C038000UL

  /* APB0 peripheral group addresses */

  #define LPC_SYSCON_BASE 0x40000000UL

  #define LPC_TIMER2_BASE 0x40004000UL

  #define LPC_TIMER3_BASE 0x40008000UL

  #define LPC_TIMER4_BASE 0x4000C000UL

  #define LPC_GPIO_GROUPINT0_BASE 0x40010000UL

  #define LPC_GPIO_GROUPINT1_BASE 0x40014000UL

  #define LPC_PIN_INT_BASE 0x40018000UL

  #define LPC_IOCON_BASE 0x4001C000UL

  #define LPC_UTICK_BASE 0x40020000UL

  #define LPC_FMC_BASE 0x40024000UL

  #define LPC_PMU_BASE 0x4002C000UL

  #define LPC_WWDT_BASE 0x40038000UL

  #define LPC_RTC_BASE 0x4003C000UL

  /* APB1 peripheral group addresses */

  #define LPC_ASYNC_SYSCON_BASE 0x40080000UL

  #define LPC_USART0_BASE 0x40084000UL

  #define LPC_USART1_BASE 0x40088000UL

  #define LPC_USART2_BASE 0x4008C000UL

  #define LPC_USART3_BASE 0x40090000UL

  #define LPC_I2C0_BASE 0x40094000UL

  #define LPC_I2C1_BASE 0x40098000UL

  #define LPC_I2C2_BASE 0x4009C000UL

  #define LPC_SPI0_BASE 0x400A4000UL

  #define LPC_SPI1_BASE 0x400A8000UL

  #define LPC_TIMER0_BASE 0x400B4000UL

  #define LPC_TIMER1_BASE 0x400B8000UL

  #define LPC_INMUX_BASE 0x40050000UL

  #define LPC_RITIMER_BASE 0x40070000UL

  #define LPC_MRT_BASE 0x40074000UL

  /* Main memory register access */

  #define LPC_GPIO ((LPC_GPIO_T *) LPC_GPIO_PORT_BASE)

  #define LPC_DMA ((LPC_DMA_T *) LPC_DMA_BASE)

  #define LPC_CRC ((LPC_CRC_T *) LPC_CRC_BASE)

  #define LPC_SCT ((LPC_SCT_T *) LPC_SCT_BASE)

  #define LPC_MBOX ((LPC_MBOX_T *) LPC_MBOX_BASE)

  #define LPC_ADC ((LPC_ADC_T *) LPC_ADC_BASE)

  #define LPC_FIFO ((LPC_FIFO_T *) LPC_FIFO_BASE)

  /* APB0 peripheral group register access */

  #define LPC_SYSCON ((LPC_SYSCON_T *) LPC_SYSCON_BASE)

  #define LPC_TIMER2 ((LPC_TIMER_T *) LPC_TIMER2_BASE)

  #define LPC_TIMER3 ((LPC_TIMER_T *) LPC_TIMER3_BASE)

  #define LPC_TIMER4 ((LPC_TIMER_T *) LPC_TIMER4_BASE)

  #define LPC_GINT ((LPC_GPIOGROUPINT_T *) LPC_GPIO_GROUPINT0_BASE)

  #define LPC_PININT ((LPC_PIN_INT_T *) LPC_PIN_INT_BASE)

  #define LPC_IOCON ((LPC_IOCON_T *) LPC_IOCON_BASE)

  #define LPC_UTICK ((LPC_UTICK_T *) LPC_UTICK_BASE)

  #define LPC_WWDT ((LPC_WWDT_T *) LPC_WWDT_BASE)

  #define LPC_RTC ((LPC_RTC_T *) LPC_RTC_BASE)

  /* APB1 peripheral group register access */

  #define LPC_ASYNC_SYSCON ((LPC_ASYNC_SYSCON_T *) LPC_ASYNC_SYSCON_BASE)

  #define LPC_USART0 ((LPC_USART_T *) LPC_USART0_BASE)

  #define LPC_USART1 ((LPC_USART_T *) LPC_USART1_BASE)

  #define LPC_USART2 ((LPC_USART_T *) LPC_USART2_BASE)

  #define LPC_USART3 ((LPC_USART_T *) LPC_USART3_BASE)

  #define LPC_I2C0 ((LPC_I2C_T *) LPC_I2C0_BASE)

  #define LPC_I2C1 ((LPC_I2C_T *) LPC_I2C1_BASE)

  #define LPC_I2C2 ((LPC_I2C_T *) LPC_I2C2_BASE)

  #define LPC_SCT0 LPC_SCT

  #define LPC_SPI0 ((LPC_SPI_T *) LPC_SPI0_BASE)

  #define LPC_SPI1 ((LPC_SPI_T *) LPC_SPI1_BASE)

  #define LPC_TIMER0 ((LPC_TIMER_T *) LPC_TIMER0_BASE)

  #define LPC_TIMER1 ((LPC_TIMER_T *) LPC_TIMER1_BASE)

  #define LPC_INMUX ((LPC_INMUX_T *) LPC_INMUX_BASE)

  #define LPC_RITIMER ((LPC_RITIMER_T *) LPC_RITIMER_BASE)

  #define LPC_MRT ((LPC_MRT_T *) LPC_MRT_BASE)

  #define LPC_PMU ((LPC_PMU_T *) LPC_PMU_BASE)

  由于LPC54102支持单电源1.62v~3.6v供电,为了保护MCU接口安全,在板子的设计上可以看到大量的双电源转换收发器。


关键字:LPC54102  寄存器 引用地址:lpc54102双核介绍及LPC54102寄存器直接编程

上一篇:多任务看门狗监控原理和实现
下一篇:lpc824 和lpc84x 微控制器的区别和联系

推荐阅读最新更新时间:2024-11-11 10:33

51单片机寄存器寻址方式与指令举例
寄存器寻址的寻址范围是: 1、4个工作寄存器组共有32个通用寄存器,但在 指令 中只能使用当前寄存器组(工作寄存器组的选择在前面专用寄存器的学习中,我们已知道,是由程序状态字PSW中的RS1和RS0来确定的),因此在使用前常需要通过对PSW中的RS1、RS0位的状态设置,来进行对当前工作寄存器组的选择。 2、部份专用寄存器。例如,累加器A、通用寄存器B、地址寄存器DPTR和进位位CY。 寄存器寻址方式是指操作数在寄存器中,因此指定了寄存器名称就能得到操作数。 例如:MOV A,R0 这条指令的意思是把寄存器R0的内容传送到累加器A中,操作数就在R0中。 INC R3 这条指令的意思是把寄存器R3中的内容加1 从前面的学习中我产
[单片机]
labview中的移位寄存器、循环隧道,自动索引隧道的区别
对于循环结构(For 循环、while循环)而言,循环体内的数据域外部数据的传递是通过以下三种方式: 1.移位寄存器2.循环隧道3.自动索引隧道 第一、各自的区别、作用 循环隧道,就是把数据传入传出循环结构,数据的类型和值在传入传出循环结构前后不发生变化,是循环后的最后一个数据。 索引隧道是 Lab VIEW 的一种独特功能。一个循环外的数组通过索引隧道连接到循环结构上,隧道在循环内一侧会自动取出数组的元素,依顺序每次循环取出一个元素。用索引隧道传出数据,可以自动把循环内的数据组织成数组,最后输出的是一个数组的形式。 移位寄存器:他是成对存在的,也可以是迭代移位寄存器使用,重点突出了递归函数使用而开发的 第二、自动索
[测试测量]
labview中的移位<font color='red'>寄存器</font>、循环隧道,自动索引隧道的区别
AVR单片机寄存器DDR,PORT和PIN之间对应关系
AVR单片机每一个I/O口都对应3个寄存器DDRx,PORTx和PINx,其中DDRx为数据方向,即输入或输出;PORTx为将内部上拉电阻的状态,PINx为读取的外部引脚的状态.以下是三者对应关系:(假设DDRx.n,PORTx.n如下,PINx.n悬空) 0 0 x : 输入, 高阻态, PINx.n的值不确定. 0 1 1 : 输入, 上拉, 值为1. 1 0 0 : 输出0, 无拉. 1 1 1 : 输出1, 上拉. 代码实例: #include mega16.h void main(void) { unsigned char result; PORTA = 0b1111
[单片机]
STM32 IO寄存器操作
STM32的IO端口有八种模式: 1、输入浮空 5、开漏输出 2、输入上拉 6、推挽输出 3、输入下拉 7、推挽复用 4、模拟输入 8、开漏复用 每个IO口都有七个寄存器来控制: CHL、CHR :端口配置寄存器(32位) IDR、ODR :数据寄存器(32位) BSRR :置位/复位寄存器(32位) BRR :复位寄存器(16位) LCKR :所存寄存器(32位) 其中,比较常用的IO端口寄存器为CRL,CRH,IDR,ODR 低配置寄存器CRL: 该寄存器复位值为0x4444 4444。即
[单片机]
STM32 IO<font color='red'>寄存器</font>操作
STM32配置外设寄存器,不论怎么写都写不进去或全是0
之前在调试STM32定时器时,由于不满意STM32 HAL库,于是便自己写了配置代码。 但是运行时,不论怎么调试,都发现定时器的每个寄存器都为0,也不清楚究竟有没有写进去。 将数据、地址等等都打印出来,都没有问题。 后来仔细检查后才发现是定时器的时钟没有打开。 如果一个外设的时钟没有打开,那么此外设是不会运行的,那么对其执行的访问都是无效的。 于是就记住了这个问题所在。 后来在调试其它外设时偶尔会出现问题,但是出现问题的一瞬间就想到是否是时钟没有打开。 如果每次遇到这个问题,都非常快的就知道了解决方案。 所以在配置外设时,发现寄存器写不进去或者写了之后全为0,那么应该要想到是否是外设时钟没有打开的原
[单片机]
MCS-51单片机寄存器TMOD的工作选择方式解析
特殊功能寄存器TMOD为T0、T1的工作方式寄存器,其格式如下: TMOD的低4位为T0的方式字段,高4位为T1的方式字段,它们的含义是完全相同的。 工作方式选择位M1、M0(方式 0~3) 定时方式和外部事件计数方式选择位C/T C/T=1为外部事件计数方式。 门控位GATE GATE为1时,定时器的计数受外部引脚输入电平的控制(INT0控制T0的运行,INT1控制T1的运行);GATE为0时定时器计数不受外部引脚输入电平的控制。
[单片机]
MCS-51单片机<font color='red'>寄存器</font>TMOD的工作选择方式解析
堆栈指针寄存器 SP 详解
堆栈是一种具有 后进先出 (LIFO---Last In First Out)特殊访问属性的存储结构。堆 栈一般使用RAM 物理资源作为存储体,再加上LIFO 访问接口实现。 堆栈的实现方法: 在随机存储器区划出一块区域作为堆栈区,数据可以一个个顺序地存入(压入)到这个区域之中,这个过程称为 压栈 (push )。通常用一个指针(堆栈指针 SP---Stack Pointer)实现做一次调整,SP 总指向最后一个压入堆栈的数据所在的数据单元(栈顶)。从堆栈中读取数据时,按照堆栈 指针指向的堆栈单元读取堆栈数据,这个过程叫做 弹出 (pop ),每弹出一个数据,SP 即向相反方向做一次调整,如此就
[单片机]
ISO 26262安全机构插入和验证四步骤讲解
翻译自——semiengineering 随着先进的驾驶员辅助系统和自动驾驶技术的引入,汽车集成电路的复杂性呈指数级增长。与这种复杂性的增加直接相关的是,确保IC不受随机硬件故障(不可预测的功能故障)的影响所增加的负担。 历史上,汽车行业通过利用专家的判断来进行安全分析。最初的安全性分析通常采用自上而下的故障模式影响诊断分析(FMEDA)。随着IC复杂性的增加,主要由专家驱动的方法不再实用或有效。 汽车集成电路已经变得太大、太复杂,以至于人们无法完全理解保护所有可能的故障所需的安全机制。必须部署自动化工作流来帮助专家处理随机故障。有效的方法是使用安全综合和形式验证来将安全机制纳入设计。这最好在寄存器传输层(RTL)进行
[汽车电子]
ISO 26262安全机构插入和验证四步骤讲解
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved