Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить

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

Чт апр 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.
Спасибо.

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

Чт апр 20, 2017 13:15:57

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

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

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

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

Чт апр 20, 2017 14:49:26

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

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

Чт апр 20, 2017 15:15:54

"Это просто структура SPI_TypeDef у которой начальный адрес равен SPI_BaseAddress"
Тогда получается первый элемент структуры лежит по адресу SPI_BaseAddress, второй SPI_BaseAddress+1, тритий SPI_BaseAddress+2 . Так?

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

Чт апр 20, 2017 15:32:24

Адреса полей уже будут зависеть от размеров полей и выравнивания по машинному слову. Если они = 1 байту, то да, смещение каждого будет на единицу.

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

Пт апр 21, 2017 08:14:20

Спасибо!
Ответить