我目前正在上网,使用Tiva C TM4C123GXL LaunchPad的UT.6.02x嵌入式系统 - 塑造世界。我还在阅读这本书和#34; 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被定义为volatile。
如果我想将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的一部分吗?
两个文件有什么区别?
答案 0 :(得分: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微控制器。
答案 1 :(得分:1)
该类中使用的文件不被视为CMSIS的一部分。如果您想知道如何设置环境来创建符合CMSIS标准的软件,请查看这个简短的教程https://www.youtube.com/watch?v=jQZi81O3cMc&list=PLmfT_cdP5PYBWYvK_bCdGyBqQEiRzUPeq&index=11
答案 2 :(得分:-1)
实际上该文件来自德州仪器公司,可与TivaWare Bundle一起使用