Копаюсь в библиотеке 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.
Спасибо.
Объясните пожалуйста строчку на СИ(библеотека STM8s.h)
- Реклама
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18649
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Объясните пожалуйста строчку на СИ(библеотека STM8s.h)
#define SPI ((SPI_TypeDef *) SPI_BaseAddress) - это подмена явного привдения типа к простой записи SPI.
SPI_BaseAddress - это просто число. чтобы рассматривать это число, как адрес, надо явно привести его к типу УКАЗАТЕЛЬ. например, (void*)123 - это указатель, равный 123. но вам надо, чтобы указатель был равен SPI_BaseAddress, да еще и не просто так, а указывал бы на определенную структуру... вот вместо абстрактного void и указывается конкретный тип вашей структуры SPI_TypeDef.
получается длинная запись, которую заменяют на короткую SPI.
SPI_BaseAddress - это просто число. чтобы рассматривать это число, как адрес, надо явно привести его к типу УКАЗАТЕЛЬ. например, (void*)123 - это указатель, равный 123. но вам надо, чтобы указатель был равен SPI_BaseAddress, да еще и не просто так, а указывал бы на определенную структуру... вот вместо абстрактного void и указывается конкретный тип вашей структуры SPI_TypeDef.
получается длинная запись, которую заменяют на короткую SPI.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Oxford
- Опытный кот
- Сообщения: 819
- Зарегистрирован: Вт окт 23, 2012 13:17:25
- Откуда: Прокопьевск
- Контактная информация:
Re: Объясните пожалуйста строчку на СИ(библеотека STM8s.h)
Это просто структура SPI_TypeDef у которой начальный адрес равен SPI_BaseAddress. Эта структура описывает карту регистров периферии SPI, можно найти карту в мануале.
Просто упрощает запись, можете писать так
((SPI_TypeDef *) SPI1_BASE)->DR = 0xFF;
SPI1->DR = 0xFF;
Обе записи верны.
Просто упрощает запись, можете писать так
((SPI_TypeDef *) SPI1_BASE)->DR = 0xFF;
SPI1->DR = 0xFF;
Обе записи верны.
Инженер R@D
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Re: Объясните пожалуйста строчку на СИ(библеотека STM8s.h)
"Это просто структура SPI_TypeDef у которой начальный адрес равен SPI_BaseAddress"
Тогда получается первый элемент структуры лежит по адресу SPI_BaseAddress, второй SPI_BaseAddress+1, тритий SPI_BaseAddress+2 . Так?
Тогда получается первый элемент структуры лежит по адресу SPI_BaseAddress, второй SPI_BaseAddress+1, тритий SPI_BaseAddress+2 . Так?
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Объясните пожалуйста строчку на СИ(библеотека STM8s.h)
Адреса полей уже будут зависеть от размеров полей и выравнивания по машинному слову. Если они = 1 байту, то да, смещение каждого будет на единицу.
- Реклама


