编程armmcu -有什么不同?
很少有工程师或电子爱好者立即开始使用ARM微控制器编程。大多数人来ARM是为了寻求更高的处理能力,具有简单8位mcu的背景。
在上一篇文章中如何设置和安装ARM的开发环境,演示了如何设置Keil ARM工具,以能够编译程序和生成输出文件。然而,在你继续为ARM微控制器编写程序之前,了解ARM和AVR、8051或PIC之间的一些区别是很重要的,你可能在过去编程过。
它们在处理数据和内部传输数据方面存在一些非常基本的差异。知道了这些差异,对于那些过去编写过8位微控制器的人来说,可以简化对ARM硬件的理解。
注册大小
您将注意到的第一个主要区别是寄存器的大小。在AVR或其他8位微控制器上,用户可访问的寄存器大小几乎总是8位的。必须包含16位数据的寄存器通常以“高字节”和“低字节”的形式访问。它需要两次读访问来读取16位数据。
这在手臂上是不同的。ARM核心是32位的能力,并且在32位模式中使用时最有效。因此,几乎所有寄存器地址宽度为4个字节(32位)。例如,要使AVR端口D的所有引脚作为输出,您将写入
ddrd = 0xff;//将所有8个引脚设置为输出
但是在ARM上,要使端口0的所有引脚都作为输出,你需要写
io0dir = 0xffffffff;//将所有32个引脚设置为输出
已经说,请注意,端口PIN码号可能从pN.0至p.N.31,因为I / O端口也是32位宽的。当然,并非所有引脚都可以在外部可用 - 就像8位微控制器一样。
你也可能想知道 - 如果你想把一个引脚切换到高,而不会影响其余的东西怎么办?AVR上的典型过程将是:
- 取输出寄存器的内容
- 逻辑或与二进制引脚数据你想设置(设置为' 1 ')
- 逻辑和恭维您要重置的二进制引脚数据(清除,或设置为'0')
- 将结果写回输出寄存器。
这简而言之,称为读取修改写入序列,并且由于这么多步骤是耗时的。ARM通过在硬件中提供可用的问题来解决这个问题。代替Portn寄存器以写入所有引脚的位值,ARM微控制器提供掩模寄存器,例如ICESET和IONCLR。将“1”写入寄存器的任何位清除或设置位并留下不受关系的其他位。这使得能够非常快速的I / O切换和控制(超过15MHz!)。
系统结构
本节考虑LPC214x (NXP Semiconductors)来说明ARM7微控制器中各部分是如何组织的。

可以立即注意到的中央骨干网是VPB (VLSI外围总线)。如果您在框图中向上跟踪总线,您将注意到它起源于AHB(高级高性能总线)。AHB以与ARM7TDMI-S核心相同的时钟速度运行。VPB从AHB中获取时钟,使用分频器降低时钟速度。VPB将所有外设连接到核心。因此,外设的运行速度低于或等于ARM核心的运行速度。
然而,中断控制器和USB DMA(直接内存访问)以与核心相同的速度运行。这使得可以快速处理中断和USB数据传输。
了解这种结构使ARM微控制器似乎更简单地编程,因为这些块中的每一个都非常易于操作。此外,知道此结构对于程序应用程序非常重要,而不耗尽定时异常或错误(下面更多)。
时机
ARM微控制器集成了ARM核心和外围设备,如上所示。外围设备与核心仔细集成。但外围设备在时钟源和速度方面也清楚地分开。因此,在不实现正在发生的情况下,可能很容易导致定时问题。调试程序很少将此问题指出。
要了解这一点,请考虑通过使用外部中断检测0.3us(微秒)或更长时间的脉冲的示例应用程序。假设外部中断滤波器拒绝具有宽度小于8个时钟周期的脉冲,如“毛刺”。因此,检测脉冲0.3US,最小时钟速度是
8 /(0.3美元)= ~ 27 mhz
为了增加可靠性,我们将其考虑为30MHz。
所以结论是您可以将CPU和中断控制器速度设置为30MHz,以便能够使用外部中断检测该脉冲。但这可能不起作用!
为什么?外部中断硬件位于VPB上。不管处理器频率和VIC(中断控制器)的速度如何,您需要将VPB时钟步进到30MHz来检测这个脉冲。这是因为外部中断硬件包含从VPB时钟而不是系统时钟派生的故障滤波器。
这样的小问题可能变得非常难以调试,特别是在高速串行接口的情况下。在我们在未来的文章中单独访问外围设备时,将包含更详细的分析。
数据字边界对齐
必须使用字对齐方式访问寄存器地址。不允许使用半字或字节访问权限。例如,您可以从位于0x40000000和0x40000004的寄存器中读取单词(32位)。但是你不能写入地址0x40000002。
这是因为大多数芯片中的地址解码逻辑不实现边界独立访问所需的字节道硬件。好的方面是,这不是一个大问题,它降低了生产成本!当你用C语言或其他高级语言编程时,工具链会为你照顾访问规则。
此外,32位地址意味着有4GB的地址空间!这些地址很少被实际使用,并试图访问不包含寄存器或内存的地址将导致一个总线周期中止异常,并将导致重置,如果你的代码不正确处理异常。因此,强烈建议不要将' 1 '写入保留位或访问未映射的地址。
通常,在非法访问时,大多数8位MCU不会发生任何内容。在最坏的情况下可能会受到影响或覆盖不相关的寄存器。但在ARM MCU上,任何非法代码行为都将导致异常。这些必须由用户代码处理。
在Keil工具中,默认情况下异常只会导致无限循环或重置——这可能是处理异常的最安全的方式。可以通过修改启动文件中的汇编代码来改变这一点,这将在后面的更多文章中讨论。
1评论
如果我以像C这样的高级语言编程,为什么我需要知道这样的内部结构/功能的详细信息?编程臂从根本上不同,其他MCU,因为它更像是汇编语言,这需要这么多的硬件知识?