Выше в сообщении я неправильно посчитал.
7 регистров по 32 бит. 7*32==224==E0
0x4000 4800+E0==0x4000 48E0
Это хранится начиная с адреса 0x4000 48E0:
UART_InitTypeDef Init;
const uint8_t *pTxBuffPtr;
uint16_t TxXferSize;
__IO uint16_t TxXferCount;
uint8_t *pRxBuffPtr;
uint16_t RxXferSize;
__IO uint16_t RxXferCount;
__IO HAL_UART_RxTypeTypeDef ReceptionType;
DMA_HandleTypeDef *hdmatx;
DMA_HandleTypeDef *hdmarx;
HAL_LockTypeDef Lock;
__IO HAL_UART_StateTypeDef gState;
__IO HAL_UART_StateTypeDef RxState;
__IO uint32_t ErrorCode;
Это находится между адресами 0x4000 4800 - 0x4000 4BFF где вы пишете ничего не хранится.
))Не судите строго))
224/8==28 Байт
Но сымсл не меняется
@stm железок нет сейчас под рукой ) завтра скину и распишу, что где находится
Я упростил код для лучшего понимания.
struct nr1
{
int CR1;
} Instance;
struct nr2
{
int BaudRate;
} Init;
struct nr3
{
int HAL_UART_STATE_RESET;
} ReceptionType;
struct common
{
struct nr1 Instance;
struct nr2 Init;
struct nr3 ReceptionType;
} UART_HandleTypeDef;
int main()
{
UART_HandleTypeDef.Instance.CR1=1;
UART_HandleTypeDef.Init.BaudRate=2;
UART_HandleTypeDef.ReceptionType.HAL_UART_STATE_RESET=3;
return 0;
}
Главное на что здесь надо обратить это структура UART_HandleTypeDef.
Информация из этой структуры будет храниться в памяти по порядку без разрывов.
UART_HandleTypeDef.Instance.CR1=1;
UART_HandleTypeDef.Init.BaudRate=2;
UART_HandleTypeDef.ReceptionType.HAL_UART_STATE_RESET=3;
huart3.Init.BaudRate = 9600;
huart3 - начальный адрес Адрес USART3 0x4000 4800
BaudRate находится в структуре UART_HandleTypeDef и должен идти сразу после регистров.
Я смотрел в памяти, но этого не происходит.
@stm Каша, все смешалось )
typedef struct __UART_HandleTypeDef { USART_TypeDef *Instance; /*!< UART registers base address */ UART_InitTypeDef Init; /*!< UART communication parameters */ uint8_t *pTxBuffPtr; /*!< Pointer to UART Tx transfer Buffer */ uint16_t TxXferSize; /*!< UART Tx Transfer size */ // ........................
Instance - поле структуры = переменная (указатель на структуру USART_TypeDef), в которой хранится адрес 0x40004800 (UART registers base address), таким образом в дальнейшем происходит запись в регистры:
typedef struct { __IO uint32_t SR; /*!< USART Status register, Address offset: 0x00 */ __IO uint32_t DR; /*!< USART Data register, Address offset: 0x04 */ __IO uint32_t BRR; /*!< USART Baud rate register, Address offset: 0x08 */ __IO uint32_t CR1; /*!< USART Control register 1, Address offset: 0x0C */ __IO uint32_t CR2; /*!< USART Control register 2, Address offset: 0x10 */ __IO uint32_t CR3; /*!< USART Control register 3, Address offset: 0x14 */ __IO uint32_t GTPR; /*!< USART Guard time and prescaler register, Address offset: 0x18 */ } USART_TypeDef;
Экземпляр UART_HandleTypeDef, как и все ее поля, хранится в ОЗУ.
Ок. Раробрался))
USART_TypeDef, не UART_InitTypeDef
То есть если бы адрес сохранялся в UART_HandleTypeDef структуру, то было бы так, как я описал))
Я что то напутал и думал что так оно и есть, что адрес в структуру UART_HandleTypeDef сохраняется.