VladislavS 39 25 сентября, 2020 Опубликовано 25 сентября, 2020 · Жалоба А я считаю, что в том виде как написано, возможность невыровненного доступа очевидна. Не зря же вы все дружно кинулись давать советы как "полечить". Коипилятор тупо прошляпил. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AleksBak 0 25 сентября, 2020 Опубликовано 25 сентября, 2020 · Жалоба 22 часа назад, Realking сказал: Память нормально протестировалась MPU_InitStruct.Enable = MPU_REGION_ENABLE; MPU_InitStruct.Number = MPU_REGION_NUMBER0; MPU_InitStruct.BaseAddress = SDRAM_ADDR; MPU_InitStruct.Size = MPU_REGION_SIZE_256MB; MPU_InitStruct.SubRegionDisable = 1; MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0; MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS; MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_DISABLE; MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE; MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE; MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE; HAL_MPU_ConfigRegion(&MPU_InitStruct); поставил MPU_InitStruct.SubRegionDisable = 1; вместо нуля но unaligned fault так и не пропал... пример в иснструкции где short ычитывается с невыравненного адреса (например 0xC0001203). Но не понятно , почему с внутренней памятью все гуд там то же считывание, только по адресу 0x24001203 CubeMX поэтому ругают и называют калом, что он создает лишнюю "прослойку" в виде своих каких-то структур, которые нужно дополнительно изучать (и очень много изучать!), а в итоге все равно переделывать и свои настройку напрямую в регистры. Тут вообще-то у Вас 256Mb м/с, а не 256MB хотя ошибку не в этом. Вы так и не привели кусок кода. И на др. вопросы, заданные тут, абсолютно не ответили. Если Вам не надо - так и напишите. У меня вот такой код: volatile uint32_t* ptr = 0xC0001203; *ptr = 0xAA; if (*ptr == 0xAA) HAL_Delay(1); не вызывает никаких "fault"-ов с внешней SDRAM. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Realking 0 25 сентября, 2020 Опубликовано 25 сентября, 2020 · Жалоба 16 minutes ago, AleksBak said: CubeMX поэтому ругают и называют калом, что он создает лишнюю "прослойку" в виде своих каких-то структур, которые нужно дополнительно изучать (и очень много изучать!), а в итоге все равно переделывать и свои настройку напрямую в регистры. Тут вообще-то у Вас 256Mb м/с, а не 256MB хотя ошибку не в этом. Вы так и не привели кусок кода. И на др. вопросы, заданные тут, абсолютно не ответили. Если Вам не надо - так и напишите. У меня вот такой код: volatile uint32_t* ptr = 0xC0001203; *ptr = 0xAA; if (*ptr == 0xAA) HAL_Delay(1); не вызывает никаких "fault"-ов с внешней SDRAM. на счет того что 256 Mb я в курсе код инициализации памяти: GPIO_InitTypeDef GPIO_InitStruct ={0}; FMC_SDRAM_TimingTypeDef SdramTiming = {0}; __HAL_RCC_GPIOD_CLK_ENABLE(); __HAL_RCC_GPIOE_CLK_ENABLE(); __HAL_RCC_GPIOF_CLK_ENABLE(); __HAL_RCC_GPIOG_CLK_ENABLE(); __HAL_RCC_GPIOH_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_FMC_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_15|GPIO_PIN_8|GPIO_PIN_5|GPIO_PIN_4 |GPIO_PIN_2|GPIO_PIN_0|GPIO_PIN_1; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF12_FMC; HAL_GPIO_Init(GPIOG, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_15|GPIO_PIN_14; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF12_FMC; HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_1|GPIO_PIN_0|GPIO_PIN_3 |GPIO_PIN_5|GPIO_PIN_4|GPIO_PIN_13|GPIO_PIN_14 |GPIO_PIN_12|GPIO_PIN_15|GPIO_PIN_11; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF12_FMC; HAL_GPIO_Init(GPIOF, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF12_FMC; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF12_FMC; HAL_GPIO_Init(GPIOH, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_9|GPIO_PIN_8|GPIO_PIN_7; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF12_FMC; HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); hsdram1.Instance = FMC_SDRAM_DEVICE; hsdram1.Init.SDBank = FMC_SDRAM_BANK1; hsdram1.Init.ColumnBitsNumber = FMC_SDRAM_COLUMN_BITS_NUM_10; hsdram1.Init.RowBitsNumber = FMC_SDRAM_ROW_BITS_NUM_13; hsdram1.Init.MemoryDataWidth = FMC_SDRAM_MEM_BUS_WIDTH_8; hsdram1.Init.InternalBankNumber = FMC_SDRAM_INTERN_BANKS_NUM_4; hsdram1.Init.CASLatency = FMC_SDRAM_CAS_LATENCY_2; hsdram1.Init.WriteProtection = FMC_SDRAM_WRITE_PROTECTION_DISABLE; hsdram1.Init.SDClockPeriod = FMC_SDRAM_CLOCK_PERIOD_2; hsdram1.Init.ReadBurst = FMC_SDRAM_RBURST_ENABLE; hsdram1.Init.ReadPipeDelay = FMC_SDRAM_RPIPE_DELAY_1; SdramTiming.LoadToActiveDelay = 2; SdramTiming.ExitSelfRefreshDelay = 9; SdramTiming.SelfRefreshTime = 5; SdramTiming.RowCycleDelay = 8; SdramTiming.WriteRecoveryTime = 3; SdramTiming.RPDelay = 2; SdramTiming.RCDDelay = 2; HAL_SDRAM_Init(&hsdram1, &SdramTiming); FMC_SDRAM_CommandTypeDef Command; __IO uint32_t tmpmrd = 0; /* Configure a clock configuration enable command */ Command.CommandMode = FMC_SDRAM_CMD_CLK_ENABLE; Command.CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1; Command.AutoRefreshNumber = 1; Command.ModeRegisterDefinition = 0; HAL_SDRAM_SendCommand(&hsdram1, &Command, 0xFFFF); HAL_Delay(10); /* Configure a PALL (precharge all) command */ Command.CommandMode = FMC_SDRAM_CMD_PALL; Command.CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1; Command.AutoRefreshNumber = 2; Command.ModeRegisterDefinition = 0; HAL_SDRAM_SendCommand(&hsdram1, &Command, 0xFFFF); HAL_Delay(10); /* Configure the 1st Auto Refresh command */ Command.CommandMode = FMC_SDRAM_CMD_AUTOREFRESH_MODE; Command.CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1; Command.AutoRefreshNumber = 8; Command.ModeRegisterDefinition = 0; HAL_SDRAM_SendCommand(&hsdram1, &Command, 0xFFFF); HAL_Delay(10); /* Program the external memory mode register */ #define SDRAM_MODEREG_BURST_LENGTH_1 ((uint16_t)0x0000) #define SDRAM_MODEREG_BURST_LENGTH_2 ((uint16_t)0x0001) #define SDRAM_MODEREG_BURST_LENGTH_4 ((uint16_t)0x0002) #define SDRAM_MODEREG_BURST_LENGTH_8 ((uint16_t)0x0003) #define SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL ((uint16_t)0x0000) #define SDRAM_MODEREG_BURST_TYPE_INTERLEAVED ((uint16_t)0x0008) #define SDRAM_MODEREG_CAS_LATENCY_2 ((uint16_t)0x0020) #define SDRAM_MODEREG_CAS_LATENCY_3 ((uint16_t)0x0030) #define SDRAM_MODEREG_OPERATING_MODE_STANDARD ((uint16_t)0x0000) #define SDRAM_MODEREG_WRITEBURST_MODE_PROGRAMMED ((uint16_t)0x0000) #define SDRAM_MODEREG_WRITEBURST_MODE_SINGLE ((uint16_t)0x0200) #define SDRAM_REFRESH_COUNT ((uint32_t)(917)) tmpmrd = (uint32_t)SDRAM_MODEREG_BURST_LENGTH_1 | SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL | SDRAM_MODEREG_CAS_LATENCY_2 | SDRAM_MODEREG_OPERATING_MODE_STANDARD | SDRAM_MODEREG_WRITEBURST_MODE_SINGLE; Command.CommandMode = FMC_SDRAM_CMD_LOAD_MODE; Command.CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1; Command.AutoRefreshNumber = 1; Command.ModeRegisterDefinition = tmpmrd; HAL_SDRAM_SendCommand(&hsdram1, &Command, 0xFFFF); HAL_SDRAM_ProgramRefreshRate(&hsdram1, SDRAM_REFRESH_COUNT); не могли бы Вы свой кусок кода инициализации привести ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AleksBak 0 25 сентября, 2020 Опубликовано 25 сентября, 2020 · Жалоба 1 минуту назад, Realking сказал: не могли бы Вы свой кусок кода инициализации привести ? Могу. Почему не могу. Давайте я Ваш кусок кода засандалю/помещу у себя тут и сразу и проверю. Только Вы так и не привели свой кусок кода где этот "fault" у Вас возникает. Хотя бы часть его. Чтобы проверить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Realking 0 25 сентября, 2020 Опубликовано 25 сентября, 2020 · Жалоба 1 minute ago, AleksBak said: Могу. Почему не могу. Давайте я Ваш кусок кода засандалю/помещу у себя тут и сразу и проверю. Только Вы так и не привели свой кусок кода где этот "fault" у Вас возникает. Хотя бы часть его. Чтобы проверить. volatile uint32_t* ptr = (uint32_t*)0xC0001203; *ptr = 0xAA; да вот тут и возникает )) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AleksBak 0 25 сентября, 2020 Опубликовано 25 сентября, 2020 (изменено) · Жалоба 12 минут назад, Realking сказал: да вот тут и возникает )) RAM тут у меня - MT48LC4M32B2 (в Дискавери которая, 746-м). Код у меня такой: Скрытый текст /* FMC initialization function */ static void MX_FMC_Init(void) { /* USER CODE BEGIN FMC_Init 0 */ /* USER CODE END FMC_Init 0 */ FMC_SDRAM_TimingTypeDef SdramTiming = { 0 }; /* USER CODE BEGIN FMC_Init 1 */ /* USER CODE END FMC_Init 1 */ /** Perform the SDRAM1 memory initialization sequence */ hsdram1.Instance = FMC_SDRAM_DEVICE; /* hsdram1.Init */ hsdram1.Init.SDBank = FMC_SDRAM_BANK1; hsdram1.Init.ColumnBitsNumber = FMC_SDRAM_COLUMN_BITS_NUM_8; hsdram1.Init.RowBitsNumber = FMC_SDRAM_ROW_BITS_NUM_12; hsdram1.Init.MemoryDataWidth = FMC_SDRAM_MEM_BUS_WIDTH_16; hsdram1.Init.InternalBankNumber = FMC_SDRAM_INTERN_BANKS_NUM_2; hsdram1.Init.CASLatency = FMC_SDRAM_CAS_LATENCY_2; hsdram1.Init.WriteProtection = FMC_SDRAM_WRITE_PROTECTION_DISABLE; hsdram1.Init.SDClockPeriod = FMC_SDRAM_CLOCK_PERIOD_2; hsdram1.Init.ReadBurst = FMC_SDRAM_RBURST_ENABLE; hsdram1.Init.ReadPipeDelay = FMC_SDRAM_RPIPE_DELAY_0; /* SdramTiming */ SdramTiming.LoadToActiveDelay = 2; SdramTiming.ExitSelfRefreshDelay = 6; SdramTiming.SelfRefreshTime = 4; SdramTiming.RowCycleDelay = 6; SdramTiming.WriteRecoveryTime = 2; SdramTiming.RPDelay = 2; SdramTiming.RCDDelay = 2; if (HAL_SDRAM_Init(&hsdram1, &SdramTiming) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN FMC_Init 2 */ /* USER CODE END FMC_Init 2 */ } /** * @brief GPIO Initialization Function * @param None * @retval None */ static void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = { 0 }; /* GPIO Ports Clock Enable */ __HAL_RCC_GPIOE_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_GPIOG_CLK_ENABLE(); __HAL_RCC_GPIOJ_CLK_ENABLE(); __HAL_RCC_GPIOD_CLK_ENABLE(); __HAL_RCC_GPIOK_CLK_ENABLE(); __HAL_RCC_GPIOF_CLK_ENABLE(); __HAL_RCC_GPIOI_CLK_ENABLE(); __HAL_RCC_GPIOH_CLK_ENABLE(); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(LCD_BL_CTRL_GPIO_Port, LCD_BL_CTRL_Pin, GPIO_PIN_SET); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOI, GPIO_PIN_1, GPIO_PIN_RESET); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(LCD_DISP_GPIO_Port, LCD_DISP_Pin, GPIO_PIN_SET); /*Configure GPIO pin : LCD_BL_CTRL_Pin */ GPIO_InitStruct.Pin = LCD_BL_CTRL_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(LCD_BL_CTRL_GPIO_Port, &GPIO_InitStruct); /*Configure GPIO pin : PI1 */ GPIO_InitStruct.Pin = GPIO_PIN_1; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOI, &GPIO_InitStruct); /*Configure GPIO pin : LCD_DISP_Pin */ GPIO_InitStruct.Pin = LCD_DISP_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(LCD_DISP_GPIO_Port, &GPIO_InitStruct); } /* USER CODE BEGIN 4 */ /* USER CODE END 4 */ /* MPU Configuration */ void MPU_Config(void) { MPU_Region_InitTypeDef MPU_InitStruct = { 0 }; /* Disables the MPU */ HAL_MPU_Disable(); /** Initializes and configures the Region and the memory to be protected */ MPU_InitStruct.Enable = MPU_REGION_ENABLE; MPU_InitStruct.Number = MPU_REGION_NUMBER0; MPU_InitStruct.BaseAddress = 0xC0000000; MPU_InitStruct.Size = MPU_REGION_SIZE_4MB; MPU_InitStruct.SubRegionDisable = 0x0; MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0; MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS; MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE; MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE; MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE; MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE; HAL_MPU_ConfigRegion(&MPU_InitStruct); /* Enables the MPU */ HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT); } На всякий случай и инициализацию портов тоже привел. Еще есть RAM W98256G6JH и с ней тоже, когда ее подключу, тоже попробую/поэкспериментирую. Вот файл: "MT48LC4M32B2.с" еще: Скрытый текст #include "MT48LC4M32B2.h" FMC_SDRAM_CommandTypeDef command; HAL_StatusTypeDef hal_stat; void MT48LC4M32B2_Init(SDRAM_HandleTypeDef* hsdram) { __IO uint32_t tmpmrd = 0; command.CommandMode = FMC_SDRAM_CMD_CLK_ENABLE; // вкл. тактирование command.CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1; // обращение именно к 1 банку памяти command.AutoRefreshNumber = 1; // одно автообновление (бывает от 1 до 16) command.ModeRegisterDefinition = 0; // в регистр режимов ничего не заносим hal_stat = HAL_SDRAM_SendCommand(hsdram, &command, SDRAM_TIMEOUT); command.CommandMode = FMC_SDRAM_CMD_PALL; // 'Precharge All' - деактивирует все банки памяти чтобы потом использ. регенерацию command.CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1; // обращение именно к 1 банку памяти command.AutoRefreshNumber = 1; // одно автообновление (бывает от 1 до 16) command.ModeRegisterDefinition = 0; // в регистр режимов ничего не заносим hal_stat = HAL_SDRAM_SendCommand(hsdram, &command, SDRAM_TIMEOUT); command.CommandMode = FMC_SDRAM_CMD_LOAD_MODE; // вкл. авторегенерацию command.CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1; // обращение именно к 1 банку памяти command.AutoRefreshNumber = 8; // 8 циклов на регенерацию command.ModeRegisterDefinition = 0; // в регистр режимов ничего не заносим hal_stat = HAL_SDRAM_SendCommand(hsdram, &command, SDRAM_TIMEOUT); // здесь см. 'Figure 13: Mode Register Definition' описания SDRAM MT48LC4M32B2: tmpmrd = (uint32_t) SDRAM_MODEREG_BURST_LENGTH_1 | // работаем с короткими пакетами (пакетами идут данные, а не постранично) SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL | // вкл. последовательный режим такой SDRAM_MODEREG_CAS_LATENCY_2 | // такую латентность 'CAS_LATENCY' указываем (в CubeMX мы это уже вообще-то указали) SDRAM_MODEREG_OPERATING_MODE_STANDARD | // стандартный режим используем SDRAM_MODEREG_WRITEBURST_MODE_SINGLE; // одиночный режим записи пакета command.CommandMode = FMC_SDRAM_CMD_AUTOREFRESH_MODE; // вкл. авторегенерацию, необходимая для нормального функционирования SDRAM. command.CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1; // обращение именно к 1 банку памяти command.AutoRefreshNumber = 1; // 8 циклов на регенерацию command.ModeRegisterDefinition = tmpmrd; // в регистр режимов пишем настройки hal_stat = HAL_SDRAM_SendCommand(hsdram, &command, SDRAM_TIMEOUT); /* в конце, вручную в в регистр FMC SDRTR, отвечающий за время авторегенерации отправим теперь: */ /* Step 8: Set the refresh rate counter (с какой частотой делать обновление) */ /* (15.62 us x Freq) — 20 ('Freq' - тут 200 МГц) */ /* Set the device refresh counter */ // hsdram->Instance->SDRTR |= ((uint32_t)((1292)<< 1)); // эквивалент "ручной" команды - 'hsdram->Instance->SDRTR |= ((uint32_t)((1292)<< 1));' HAL_SDRAM_ProgramRefreshRate(hsdram, REFRESH_COUNT); HAL_Delay(1); } А вот хедер к нему - "MT48LC4M32B2.h"; Скрытый текст #ifndef __MT48LC4M32B2_H #define __MT48LC4M32B2_H //------------------------------------------ #include "stm32f7xx_hal.h" #include <string.h> #include <stdlib.h> #include <stdint.h> //------------------------------------------ #define SDRAM_TIMEOUT ((uint32_t)0xFFFF) #define SDRAM_MODEREG_BURST_LENGTH_1 ((uint16_t)0x0000) #define SDRAM_MODEREG_BURST_LENGTH_2 ((uint16_t)0x0001) #define SDRAM_MODEREG_BURST_LENGTH_4 ((uint16_t)0x0002) #define SDRAM_MODEREG_BURST_LENGTH_8 ((uint16_t)0x0004) #define SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL ((uint16_t)0x0000) #define SDRAM_MODEREG_BURST_TYPE_INTERLEAVED ((uint16_t)0x0008) #define SDRAM_MODEREG_CAS_LATENCY_2 ((uint16_t)0x0020) #define SDRAM_MODEREG_CAS_LATENCY_3 ((uint16_t)0x0030) #define SDRAM_MODEREG_OPERATING_MODE_STANDARD ((uint16_t)0x0000) #define SDRAM_MODEREG_WRITEBURST_MODE_PROGRAMMED ((uint16_t)0x0000) #define SDRAM_MODEREG_WRITEBURST_MODE_SINGLE ((uint16_t)0x0200) // адрес начала нашего SDRAM банка (см. RM0385 - 13.4) (в проекте 'FMC_SDRAM' было 'SDRAM_BANK_ADDR') #define SDRAM_DEVICE_ADDR ((uint32_t)0xC0000000) /** SDRAM refresh counter (100MHz SD Clock) */ #define REFRESH_COUNT ((uint32_t)0x0603) //------------------------------------------ void MT48LC4M32B2_Init(SDRAM_HandleTypeDef* hsdram); //------------------------------------------ #endif /* __MT48LC4M32B2_H */ Вызываем так (в main-е): // про адрессацию памяти при использовании 'SDRAM' и пр. см. табл. и далее в: // RM0385 - '13.4 External device address mapping' MT48LC4M32B2_Init(&hsdram1); Изменено 25 сентября, 2020 пользователем AleksBak Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AleksBak 0 25 сентября, 2020 Опубликовано 25 сентября, 2020 · Жалоба Добавлю информацию чтобы не искать в нете и тут была: MT48LC4M32B2 - 1 Meg x 32 x 4 Banks (128Mb), но используется как 16-ти битная (т.е. 64Mb останется). Ваша память 8-ми битная как я понял? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Realking 0 25 сентября, 2020 Опубликовано 25 сентября, 2020 · Жалоба Just now, AleksBak said: Добавлю информацию чтобы не искать в нете и тут была: MT48LC4M32B2 - 1 Meg x 32 x 4 Banks (128Mb), но используется как 16-ти битная (т.е. 64Mb останется). Ваша память 8-ми битная как я понял? Да Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AleksBak 0 25 сентября, 2020 Опубликовано 25 сентября, 2020 · Жалоба 1 минуту назад, Realking сказал: Да Тогда в CubeMX поставьте соотв. настройки для нее. То что я привел первый кусок кода - это вообще-то он сам и нагенерил и я там не менял ничего. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 245 25 сентября, 2020 Опубликовано 25 сентября, 2020 · Жалоба 17 часов назад, VladislavS сказал: Вот! Как раз в точку. Не знаешь - рассчитывай на худшее. С таким подходом нужно вообще во всех случаях невыровненного доступа делать как в ARM7/9 - читать побайтно и потом склеивать. 2 часа назад, VladislavS сказал: А я считаю, что в том виде как написано, возможность невыровненного доступа очевидна. Не зря же вы все дружно кинулись давать советы как "полечить". Коипилятор тупо прошляпил. У вас код криво написан. Если есть возможность, что указатель может быть не выровнен, то его следует объявлять указателем на пакованные данные. Только и всего. И компилятор ничего не "прошляпил" - он совершенно прав. Указатель Вы объявили как указатель на непакованные данные, которые по мнению компилятора всегда должны быть выровнены. А возможность или невозможность - должен определять программист, когда пишет код. Исходя из алгоритма работы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 25 сентября, 2020 Опубликовано 25 сентября, 2020 · Жалоба 3 минуты назад, jcxz сказал: читать побайтно и потом склеивать. Смехуёчки смехуёчками, а компилятор достаточно умный, и на ядрах с поддержкой невыровненного доступа заменяет такие выражения 32-битным доступом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 245 25 сентября, 2020 Опубликовано 25 сентября, 2020 · Жалоба 6 минут назад, VladislavS сказал: Смехуёчки смехуёчками, а компилятор достаточно умный, и на ядрах с поддержкой невыровненного доступа заменяет такие выражения 32-битным доступом. И пускай. Только если указатель был бы объявлен как указатель на пакованные данные, то компилятор обязан был использовать только инструкции, умеющие невыровненный доступ. А если вы объявили указатель на непакованные данные - он вполне вправе использовать любые инструкции доступа к 32-битным данным. Так как подразумевает их априори - выровненными. Код в вашем примере кривой. Виноват не компилятор, а написатель сего кода. 1 час назад, AleksBak сказал: У меня вот такой код: volatile uint32_t* ptr = 0xC0001203; *ptr = 0xAA; if (*ptr == 0xAA) HAL_Delay(1); не вызывает никаких "fault"-ов с внешней SDRAM. До поры до времени "не вызывает". Код тоже кривой, по той же причине. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 25 сентября, 2020 Опубликовано 25 сентября, 2020 · Жалоба 16 часов назад, haker_fox сказал: Уф, как мне кажется, уважаемый @Arlleex выше даже показал, что нужно сделать) Между нами девочками, Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 245 25 сентября, 2020 Опубликовано 25 сентября, 2020 · Жалоба 1 минуту назад, VladislavS сказал: Между нами девочками, Понятно, что Кейл такого не умеет. Но как-то ведь там можно указателю сказать, что он указывает на пакованные данные? Ну например навскидку: Объявить пакованную структуру с одним членом u32 и объявить указатель на эту структуру. Впрочем - пользователям кейла должно быть виднее как. И если в Вашем примере указатель исправить на такой, то как изменится генерируемый код? Если только одно это изменение сделать. Для чистоты эксперимента..... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AleksBak 0 25 сентября, 2020 Опубликовано 25 сентября, 2020 · Жалоба 12 минут назад, jcxz сказал: До поры до времени "не вызывает". Код тоже кривой, по той же причине. Я понял. Кажется понял. Спасибо. (я понял, что надо применять выравнивание - правильно да?) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться