Объясните пожалуйста строчку на СИ(библеотека STM8s.h)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
qwerty13
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Вс мар 08, 2015 11:29:17

Объясните пожалуйста строчку на СИ(библеотека STM8s.h)

Сообщение qwerty13 »

Копаюсь в библиотеке stm8 и не могу понять как реализован SPI.

Вот эстэмщики определили структуру и новый тип данных
typedef struct SPI_struct
{
__IO uint8_t CR1; /*!< SPI control register 1 */
__IO uint8_t CR2; /*!< SPI control register 2 */
__IO uint8_t ICR; /*!< SPI interrupt control register */
__IO uint8_t SR; /*!< SPI status register */
__IO uint8_t DR; /*!< SPI data I/O register */
__IO uint8_t CRCPR; /*!< SPI CRC polynomial register */
__IO uint8_t RXCRCR; /*!< SPI Rx CRC register */
__IO uint8_t TXCRCR; /*!< SPI Tx CRC register */
}
SPI_TypeDef;

Но в коде они обращаются к элементам через вот такую штуку:
#define SPI ((SPI_TypeDef *) SPI_BaseAddress)

То есть в коде пишут например:
SPI->CR1 = SPI_CR1_RESET_VALUE;

Мой вопрос заключается в том, что я не понимаю как работает строка #define SPI ((SPI_TypeDef *) SPI_BaseAddress)
SPI_BaseAddress = адресу с которого начинаются все регистры SPI.
Спасибо.
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18649
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Объясните пожалуйста строчку на СИ(библеотека STM8s.h)

Сообщение ARV »

#define SPI ((SPI_TypeDef *) SPI_BaseAddress) - это подмена явного привдения типа к простой записи SPI.

SPI_BaseAddress - это просто число. чтобы рассматривать это число, как адрес, надо явно привести его к типу УКАЗАТЕЛЬ. например, (void*)123 - это указатель, равный 123. но вам надо, чтобы указатель был равен SPI_BaseAddress, да еще и не просто так, а указывал бы на определенную структуру... вот вместо абстрактного void и указывается конкретный тип вашей структуры SPI_TypeDef.

получается длинная запись, которую заменяют на короткую SPI.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
Аватара пользователя
Oxford
Опытный кот
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск
Контактная информация:

Re: Объясните пожалуйста строчку на СИ(библеотека STM8s.h)

Сообщение Oxford »

Это просто структура SPI_TypeDef у которой начальный адрес равен SPI_BaseAddress. Эта структура описывает карту регистров периферии SPI, можно найти карту в мануале.
Просто упрощает запись, можете писать так
((SPI_TypeDef *) SPI1_BASE)->DR = 0xFF;
SPI1->DR = 0xFF;
Обе записи верны.
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
qwerty13
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Вс мар 08, 2015 11:29:17

Re: Объясните пожалуйста строчку на СИ(библеотека STM8s.h)

Сообщение qwerty13 »

"Это просто структура SPI_TypeDef у которой начальный адрес равен SPI_BaseAddress"
Тогда получается первый элемент структуры лежит по адресу SPI_BaseAddress, второй SPI_BaseAddress+1, тритий SPI_BaseAddress+2 . Так?
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Объясните пожалуйста строчку на СИ(библеотека STM8s.h)

Сообщение Аlex »

Адреса полей уже будут зависеть от размеров полей и выравнивания по машинному слову. Если они = 1 байту, то да, смещение каждого будет на единицу.
Реклама
qwerty13
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Вс мар 08, 2015 11:29:17

Re: Объясните пожалуйста строчку на СИ(библеотека STM8s.h)

Сообщение qwerty13 »

Спасибо!
Реклама
Ответить

Вернуться в «Разные вопросы по МК»