В настоящее время я занимаюсь онлайн-классом, 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?
В чем разница между обоими файлами?
Ваш профессор - лучший человек, который отвечает на вопросы о материале курса. У него может быть определенная причина для использования этого заголовочного файла, который относится к некоторой концепции, которую он рассмотрит в ходе курса. Он может просто предпочесть его, потому что он считает его более удобным - спросите его. –
Разница в том, что они разные, в значительной степени именно так, как вы заявляете - один пример того, как поставщик может определить структуру стиля CMSIS для примера контроллера GPIO, а другой (если вы посмотрите на в верхней части файла) некоторые фактические определения регистров, взятые из SDK конкретного поставщика для конкретного SoC. [CMSIS - это только рекомендуемый стандартный уровень абстракции) (http://www.arm.com/products/processors/cortex-m/cortex-microcontroller-software-interface-standard.php), поставщики могут свободно выбирать его или нет. – Notlikethat
Кроме того, с точки зрения пользователя разница в этом случае в основном сводится к тому, чтобы иногда вводить '_' вместо' -> 'в именах для доступа к регистрам - действительно ли это? – Notlikethat