1

我目前正在参加使用 Tiva C TM4C123GXL LaunchPad 的在线课程 UT.6.02x Embedded Systems - Shape the World。我也在阅读《ARM Cortex-M3 和 Cortex-M4 处理器权威指南》一书作为补充。书中提到了一个名为 CMSIS 的标准库,其中 GPIO 端口的寄存器被实现为一个结构。

图书代码:

typedef struct
{
_IO uint32_t CRL;
_IO uint32_t CRH;
//and so on ...
} GPIO_TypeDef;

#define PERIPH_BASE ((uint32_t)0x40000000) //Peripheral base address
#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)
#define GPIOA_BASE (APB2PERIPH_BASE + 0x0800)
#define GPIOA ((GPIO_TypeDef*) GPIOA_BASE)

其中 _IO 被定义为易失性。

如果我想将 GPIOA CRL 寄存器设置为 0,我可以输入 GPIOA->CRL = 0; 我还可以调用诸如 GPIO_Reset(GPIOA) 之类的函数。

对于课程,教授没有使用这个库,而是包含一个头文件tm4c123gh6pm.h,它分别定义了每个端口的每个寄存器:

班级代码:

#define GPIO_PORTA_DATA_BITS_R  ((volatile unsigned long *)0x40004000)
#define GPIO_PORTA_DATA_R       (*((volatile unsigned long *)0x400043FC))
#define GPIO_PORTA_DIR_R        (*((volatile unsigned long *)0x40004400))
#define GPIO_PORTA_IS_R         (*((volatile unsigned long *)0x40004404))
#define GPIO_PORTA_IBE_R        (*((volatile unsigned long *)0x40004408))
#define GPIO_PORTA_IEV_R        (*((volatile unsigned long *)0x4000440C))
#define GPIO_PORTA_IM_R         (*((volatile unsigned long *)0x40004410))
#define GPIO_PORTA_RIS_R        (*((volatile unsigned long *)0x40004414))
#define GPIO_PORTA_MIS_R        (*((volatile unsigned long *)0x40004418))
#define GPIO_PORTA_ICR_R        (*((volatile unsigned long *)0x4000441C))
#define GPIO_PORTA_AFSEL_R      (*((volatile unsigned long *)0x40004420))
#define GPIO_PORTA_DR2R_R       (*((volatile unsigned long *)0x40004500))
#define GPIO_PORTA_DR4R_R       (*((volatile unsigned long *)0x40004504))
#define GPIO_PORTA_DR8R_R       (*((volatile unsigned long *)0x40004508))
#define GPIO_PORTA_ODR_R        (*((volatile unsigned long *)0x4000450C))
#define GPIO_PORTA_PUR_R        (*((volatile unsigned long *)0x40004510))
#define GPIO_PORTA_PDR_R        (*((volatile unsigned long *)0x40004514))
#define GPIO_PORTA_SLR_R        (*((volatile unsigned long *)0x40004518))
#define GPIO_PORTA_DEN_R        (*((volatile unsigned long *)0x4000451C))
#define GPIO_PORTA_LOCK_R       (*((volatile unsigned long *)0x40004520))
#define GPIO_PORTA_CR_R         (*((volatile unsigned long *)0x40004524))
#define GPIO_PORTA_AMSEL_R      (*((volatile unsigned long *)0x40004528))
#define GPIO_PORTA_PCTL_R       (*((volatile unsigned long *)0x4000452C))
#define GPIO_PORTA_ADCCTL_R     (*((volatile unsigned long *)0x40004530))
#define GPIO_PORTA_DMACTL_R     (*((volatile unsigned long *)0x40004534))

这似乎使寄存器操作更加麻烦。

这个头文件是否在这个类以外的其他地方使用过?它是否被视为 CMSIS 的一部分?

这两个文件有什么区别?

4

3 回答 3

2

简短的回答:您芯片中的 GPIO 硬件是由 TI 而不是 ARM 设计的,因此其标头的编码风格略有不同。

更长的解释

使用 Cortex-M 微控制器时,跟踪硬件的哪些部分是由 ARM 设计的,哪些是由从 ARM 获得处理器许可的硅供应商(在本例中为 TI)设计的,这很有帮助。ARM 设计了 ​​CPU 以及调试和跟踪相关的硬件模块(您甚至可以使用这些模块来执行一些 I/O,例如 SWD),但其他一切,GPIO、定时器、PWM、ADC、UART、SPI、I2S 都由硅完成小贩。因此,即使是一个简单的低级blink示例也不会从 TI 移植到 ST、NXP 或 Atmel 芯片,即使它们都是 Cortex-M 微控制器。

ARM 有一个 CMSIS-Driver 计划,旨在为通用外围设备创建统一的 API,但它基本上已经死了。对于便携式高级 API,请查看mBedArduino项目。

于 2015-02-17T12:54:14.167 回答
1

该类中使用的文件不被视为 CMSIS 的一部分。如果您想知道如何设置环境以创建符合 CMSIS 的软件,请查看此简短教程https://www.youtube.com/watch?v=jQZi81O3cMc&list=PLmfT_cdP5PYBWYvK_bCdGyBqQEiRzUPeq&index=11

于 2015-03-07T22:26:03.710 回答
-1

实际上该文件来自德州仪器,可与 TivaWare Bundle 一起使用

http://www.ti.com/tool/SW-TM4C

于 2017-01-09T17:54:30.420 回答