Перейти к содержанию
    

А я считаю, что в том виде как написано, возможность невыровненного доступа очевидна. Не зря же вы все дружно кинулись давать советы как "полечить". Коипилятор тупо прошляпил.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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);

 

не могли бы Вы свой кусок кода инициализации привести ?

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 минуту назад, Realking сказал:

не могли бы Вы свой кусок кода инициализации привести ?

Могу. Почему не могу. Давайте я Ваш кусок кода засандалю/помещу у себя тут и сразу и проверю. Только Вы так и не привели свой кусок кода где этот "fault" у Вас возникает. Хотя бы часть его.  Чтобы проверить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 minute ago, AleksBak said:

Могу. Почему не могу. Давайте я Ваш кусок кода засандалю/помещу у себя тут и сразу и проверю. Только Вы так и не привели свой кусок кода где этот "fault" у Вас возникает. Хотя бы часть его.  Чтобы проверить.

    volatile uint32_t* ptr =  (uint32_t*)0xC0001203;
    *ptr = 0xAA;

да вот тут и возникает ))

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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);

 

Изменено пользователем AleksBak

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добавлю информацию чтобы не искать в нете и тут была: MT48LC4M32B2 - 1 Meg x 32 x 4 Banks (128Mb), но используется как 16-ти битная (т.е. 64Mb останется). Ваша память 8-ми битная как я понял?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Just now, AleksBak said:

Добавлю информацию чтобы не искать в нете и тут была: MT48LC4M32B2 - 1 Meg x 32 x 4 Banks (128Mb), но используется как 16-ти битная (т.е. 64Mb останется). Ваша память 8-ми битная как я понял?

Да

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 минуту назад, Realking сказал:

Да

Тогда в CubeMX поставьте соотв. настройки для нее. То что я привел первый кусок кода - это вообще-то он сам и нагенерил и я там не менял ничего.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

17 часов назад, VladislavS сказал:

Вот! Как раз в точку. Не знаешь - рассчитывай на худшее.

С таким подходом нужно вообще во всех случаях невыровненного доступа делать как в ARM7/9 - читать побайтно и потом склеивать.  :biggrin:

2 часа назад, VladislavS сказал:

А я считаю, что в том виде как написано, возможность невыровненного доступа очевидна. Не зря же вы все дружно кинулись давать советы как "полечить". Коипилятор тупо прошляпил.

У вас код криво написан. Если есть возможность, что указатель может быть не выровнен, то его следует объявлять указателем на пакованные данные. Только и всего.

И компилятор ничего не "прошляпил" - он совершенно прав. Указатель Вы объявили как указатель на непакованные данные, которые по мнению компилятора всегда должны быть выровнены.

А возможность или невозможность - должен определять программист, когда пишет код. Исходя из алгоритма работы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 минуты назад, jcxz сказал:

читать побайтно и потом склеивать.  

Смехуёчки смехуёчками, а компилятор достаточно умный, и на ядрах с поддержкой невыровненного доступа заменяет такие выражения 32-битным доступом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 минут назад, VladislavS сказал:

Смехуёчки смехуёчками, а компилятор достаточно умный, и на ядрах с поддержкой невыровненного доступа заменяет такие выражения 32-битным доступом.

И пускай. Только если указатель был бы объявлен как указатель на пакованные данные, то компилятор обязан был использовать только инструкции, умеющие невыровненный доступ.

А если вы объявили указатель на непакованные данные - он вполне вправе использовать любые инструкции доступа к 32-битным данным.

Так как подразумевает их априори - выровненными.

Код в вашем примере кривой. Виноват не компилятор, а написатель сего кода.

 

1 час назад, AleksBak сказал:

У меня вот такой код:


    volatile uint32_t* ptr =  0xC0001203;
    *ptr = 0xAA;
    if (*ptr == 0xAA)
        HAL_Delay(1);

не вызывает никаких "fault"-ов с внешней SDRAM.

До поры до времени "не вызывает".

Код тоже кривой, по той же причине.  :unknw:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

16 часов назад, haker_fox сказал:

Уф, как мне кажется, уважаемый @Arlleex выше даже показал, что нужно сделать)

Между нами девочками, 

packed.thumb.png.d9c5b78da4ce1b2895531818bee09268.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 минуту назад, VladislavS сказал:

Между нами девочками, 

Понятно, что Кейл такого не умеет. Но как-то ведь там можно указателю сказать, что он указывает на пакованные данные?

Ну например навскидку: Объявить пакованную структуру с одним членом u32 и объявить указатель на эту структуру. Впрочем - пользователям кейла должно быть виднее как. :unknw:

И если в Вашем примере указатель исправить на такой, то как изменится генерируемый код?

Если только одно это изменение сделать. Для чистоты эксперимента.....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

12 минут назад, jcxz сказал:

До поры до времени "не вызывает".

Код тоже кривой, по той же причине.  :unknw:

Я понял. Кажется понял. Спасибо. (я понял, что надо применять выравнивание - правильно да?)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...