Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Чт апр 20, 2017 13:05:25
Копаюсь в библиотеке 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.
Спасибо.
Чт апр 20, 2017 13:15:57
#define SPI ((SPI_TypeDef *) SPI_BaseAddress) - это подмена явного привдения типа к простой записи SPI.
SPI_BaseAddress - это просто число. чтобы рассматривать это число, как адрес, надо явно привести его к типу УКАЗАТЕЛЬ. например, (void*)123 - это указатель, равный 123. но вам надо, чтобы указатель был равен SPI_BaseAddress, да еще и не просто так, а указывал бы на определенную структуру... вот вместо абстрактного void и указывается конкретный тип вашей структуры SPI_TypeDef.
получается длинная запись, которую заменяют на короткую SPI.
Чт апр 20, 2017 14:49:26
Это просто структура SPI_TypeDef у которой начальный адрес равен SPI_BaseAddress. Эта структура описывает карту регистров периферии SPI, можно найти карту в мануале.
Просто упрощает запись, можете писать так
((SPI_TypeDef *) SPI1_BASE)->DR = 0xFF;
SPI1->DR = 0xFF;
Обе записи верны.
Чт апр 20, 2017 15:15:54
"Это просто структура SPI_TypeDef у которой начальный адрес равен SPI_BaseAddress"
Тогда получается первый элемент структуры лежит по адресу SPI_BaseAddress, второй SPI_BaseAddress+1, тритий SPI_BaseAddress+2 . Так?
Чт апр 20, 2017 15:32:24
Адреса полей уже будут зависеть от размеров полей и выравнивания по машинному слову. Если они = 1 байту, то да, смещение каждого будет на единицу.
Пт апр 21, 2017 08:14:20
Спасибо!
Powered by phpBB © phpBB Group.
phpBB Mobile / SEO by Artodia.