Библиотека интерфейса Tiva C TM4C123GXL

В настоящее время я посещаю онлайн-курс UT.6.02x Embedded Systems — Shape the World, в котором используется панель запуска Tiva C TM4C123GXL. Я также читаю книгу «Полное руководство по процессорам 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.

Если бы я хотел установить для регистра CRL GPIOA значение 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?

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


person Lucas Mezalira    schedule 08.02.2015    source источник
comment
Ваш профессор лучше всего ответит на вопросы по материалам курса. У него может быть какая-то конкретная причина для использования этого заголовочного файла, относящаяся к какой-то концепции, которую он будет освещать в ходе курса. Он может просто предпочесть это, потому что он находит это более удобным — спросите его.   -  person    schedule 08.02.2015
comment
Разница в том, что они разные, практически точно так, как вы описываете: один является примером того, как поставщик может определить структуру в стиле CMSIS для примерного контроллера GPIO, другой (если вы посмотрите на вверху файла) некоторые фактические определения регистров, взятые из SDK конкретного поставщика для конкретной SoC. CMSIS — это просто рекомендуемый стандартный уровень абстракции., поставщики могут сами выбирать, внедрять его или нет.   -  person Notlikethat    schedule 08.02.2015
comment
Кроме того, с точки зрения пользователя, разница в этом случае в основном сводится к тому, что иногда для доступа к регистрам в именах вводится _ вместо ->действительно это имеет значение?   -  person Notlikethat    schedule 08.02.2015


Ответы (3)


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

Более подробное объяснение

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

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

person scottt    schedule 17.02.2015

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

person SoftwareDev    schedule 07.03.2015

на самом деле файл от Texas Instruments доступен с TivaWare Bundle

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

person Raros    schedule 09.01.2017
comment
Этот SDK не включает необходимые файлы. - person solumnant; 02.05.2021