Взаимодействие или присвоение структурной переменной ячейке памяти - PullRequest
0 голосов
/ 23 февраля 2020

Пожалуйста, объясните следующий фрагмент кода из заголовочного файла микроконтроллера и как структурная переменная присваивается определенной ячейке памяти, указанной в коде (т. Е. 0x40000000 + 0x04000 = 0x40004000). И как программист приложения может получить доступ к элементам структуры и записать в них указанные в структуре (т.е. IR, TCR, T C, PR, P C и MCR).

/*------------- Timer (TIM) --------------------------------------------------*/
typedef struct
{
  __IO uint32_t IR; /* __IO is volatile read and write */
  __IO uint32_t TCR;
  __IO uint32_t TC;
  __IO uint32_t PR;
  __IO uint32_t PC;
  __IO uint32_t MCR;
} LPC_TIM_TypeDef;

#define LPC_APB0_BASE         (0x40000000UL)
#define LPC_TIM0_BASE         (LPC_APB0_BASE + 0x04000)
#define LPC_TIM0              ((LPC_TIM_TypeDef *) LPC_TIM0_BASE)

Ответы [ 3 ]

2 голосов
/ 23 февраля 2020

Это похоже на отображаемые в памяти аппаратные регистры.

Если вы определяете структуру в C, как бы вы обращались к ней по указателю?

typedef struct {
    int x;
} Moo;

Moo myMooStruct;
Moo *ptr = &myMooStruct;
ptr->x = 1;

То же самое применимо и здесь, за исключением у вас есть жестко закодированный адрес структуры, который LPC_TIM0.

LPC_TIM_TypeDef *timer = LPC_TIM0;
timer->IR = /* someValueHere */ 0;
2 голосов
/ 23 февраля 2020

Как вы правильно указали, макросы LPC_APB0_BASE и LPC_TIM0_BASE вместе определяют адрес, где расположены данные (предположительно) "Таймера 0". Макрос LPC_TIM0 оценивает указатель на LPC_TIM_TypeDef структуру в этом месте.

Таким образом, чтобы получить доступ к членам этой структуры, вы можете использовать оператор -> на LPC_TIM0; например, чтобы установить элемент TC, используйте код, подобный следующему:

uint32_t value = 123; // or whatever
LPC_TIM0->TC = value;

Чтобы прочитать данные из элемента PC, используйте:

uint32_t value = LPC_TIM0->PC;

попросить дальнейших разъяснений и / или объяснений.

0 голосов
/ 24 февраля 2020

Спасибо @Adrian Mole и @Tarek Dakhran за вашу помощь, и я переписал приведенный выше оригинальный код без квалификатора typedef и определил макросы. Верно ли мое понимание, и теперь я могу легко получить доступ к членам структуры, используя LPC_TIM0-> IR et c. И это только из-за моих трудностей в понимании typedef и макросов.

И на основе этого кода LPC_TIM0 будет указателем на структуру LPC_TIM_TypeDef, а структура будет сопоставлена ​​с физической памятью 0x40004000.

/*------------- Timer (TIM) --------------------------------------------------*/

struct LPC_TIM_TypeDef
{
  __IO uint32_t IR; /* __IO is volatile read and write */
  __IO uint32_t TCR;
  __IO uint32_t TC;
  __IO uint32_t PR;
  __IO uint32_t PC;
  __IO uint32_t MCR;
};

struct LPC_TIM_TypeDef *LPC_TIM0 = ((struct LPC_TIM_TypeDef *) 0x40004000);
...