2015-02-08 5 views
0

В настоящее время я занимаюсь онлайн-классом, UT.6.02x Embedded Systems - Shape the World, который использует Tiva C TM4C123GXL LaunchPad. Я также читаю книгу «Окончательное руководство по процессорам ARM Cortex-M3 и Cortex-M4» для дополнения. В книге упоминается стандартная библиотека под названием CMSIS, где регистры портов GPIO реализованы как структура.Интерфейсная библиотека Tiva C TM4C123GXL

Книга Код:

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?

В чем разница между обоими файлами?

+0

Ваш профессор - лучший человек, который отвечает на вопросы о материале курса. У него может быть определенная причина для использования этого заголовочного файла, который относится к некоторой концепции, которую он рассмотрит в ходе курса. Он может просто предпочесть его, потому что он считает его более удобным - спросите его. –

+0

Разница в том, что они разные, в значительной степени именно так, как вы заявляете - один пример того, как поставщик может определить структуру стиля CMSIS для примера контроллера GPIO, а другой (если вы посмотрите на в верхней части файла) некоторые фактические определения регистров, взятые из SDK конкретного поставщика для конкретного SoC. [CMSIS - это только рекомендуемый стандартный уровень абстракции) (http://www.arm.com/products/processors/cortex-m/cortex-microcontroller-software-interface-standard.php), поставщики могут свободно выбирать его или нет. – Notlikethat

+0

Кроме того, с точки зрения пользователя разница в этом случае в основном сводится к тому, чтобы иногда вводить '_' вместо' -> 'в именах для доступа к регистрам - действительно ли это? – Notlikethat

ответ

1

Короткий ответ: оборудование GPIO в вашем чипе , разработанное TI вместо ARM, и, следовательно, его заголовки имеют немного отличающийся стиль кодирования.

дольше Объяснение

При использовании Cortex-M микроконтроллеров, это полезно отслеживать, какие части аппаратных средств были разработаны ARM и которые были разработаны поставщиком кремния, который лицензированный процессор от ARM (TI в этом дело). ARM спроектировал процессор и связанные с ним отладки и связанные с трассировкой аппаратные блоки (которые вы могли бы даже использовать для ввода некоторых операций ввода-вывода, например SWD), но все остальное - GPIO, Таймеры, PWM, ADC, UART, SPI, I2S - все это осуществляется с помощью кремния поставщик. Таким образом, даже простой низкоуровневый пример blink не будет переноситься с TI на чипы ST, NXP или Atmel, даже если они все микроконтроллеры Cortex-M.

У ARM была инициатива CMSIS-Driver, цель которой заключалась в создании единого API для общих периферийных устройств, но он по существу мертв. Для портативных API высокого уровня посмотрите на проекты mBed или Arduino.

1

Файл, используемый в этом классе, не считается частью CMSIS. Если вы хотите знать, как создать условия для создания взглянуть CMSIS совместимого программного обеспечения на этом коротком руководстве https://www.youtube.com/watch?v=jQZi81O3cMc&list=PLmfT_cdP5PYBWYvK_bCdGyBqQEiRzUPeq&index=11

Смежные вопросы