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

Проблема с настройкой SDRAM


Leo

Рекомендуемые сообщения

Пытаюсь настроить SDRAM но при записи по адресу заполняются сразу 4 ячейки через одну . Дальше заполняются 4 пропущенные ячейки через одну . И так по кругу 8 раз то первые то вторые  ячейки заполняются новыми данными . А на 9 разе происходит переход и цикл повторяется. Если кто настраивал подскажите?  Настройка частоты 180 мГц APB1=45мГц APB2=90мГц

 void SdRamNastroika (void){
	  uint32_t tmp;

	  // Enable clock for FMC
	    RCC->AHB3ENR |= RCC_AHB3ENR_FMCEN;
	    // Initialization step 1
	    FMC_Bank5_6->SDCR[0] = FMC_SDCR1_SDCLK_1 | FMC_SDCR1_RBURST | FMC_SDCR1_RPIPE_1;
	    FMC_Bank5_6->SDCR[1] = FMC_SDCR1_NR_0 | FMC_SDCR1_MWID_0 | FMC_SDCR1_NB | FMC_SDCR1_CAS;
	    // Initialization step 2
	    FMC_Bank5_6->SDTR[0] = TRC(7) | TRP(2);
	    FMC_Bank5_6->SDTR[1] = TMRD(2) | TXSR(7) | TRAS(4) | TWR(2) | TRCD(2);
	    // Initialization step 3
	    while(FMC_Bank5_6->SDSR & FMC_SDSR_BUSY);
	    FMC_Bank5_6->SDCMR = 1 | FMC_SDCMR_CTB2 | (1 << 5);
	    // Initialization step 4
	    for(tmp = 0; tmp < 10000000; tmp++);
	    // Initialization step 5
	    while(FMC_Bank5_6->SDSR & FMC_SDSR_BUSY);
	    FMC_Bank5_6->SDCMR = 2 | FMC_SDCMR_CTB2 | (1 << 5);
	    // Initialization step 6
	    while(FMC_Bank5_6->SDSR & FMC_SDSR_BUSY);
	    FMC_Bank5_6->SDCMR = 3 | FMC_SDCMR_CTB2 | (4 << 5);
	    // Initialization step 7
	    while(FMC_Bank5_6->SDSR & FMC_SDSR_BUSY);
	    FMC_Bank5_6->SDCMR = 4 | FMC_SDCMR_CTB2 | (1 << 5) | (0x231 << 9);
	    // Initialization step 8
	    while(FMC_Bank5_6->SDSR & FMC_SDSR_BUSY);
	    FMC_Bank5_6->SDRTR |= (683 << 1);
	    while(FMC_Bank5_6->SDSR & FMC_SDSR_BUSY);
	    for(tmp = SDRAM_START_ADR; tmp < (SDRAM_START_ADR + SDRAM_MEMORY_SIZE); tmp += 4)//0x00800000 0x00000000
	    (*(__IO uint32_t *)tmp) = 0x00000000;
  }

void  SDRAM_Write32(uint32_t value){
	
	uint32_t tmp1 = 0xD0000000;
	
  *(__IO uint32_t*)tmp1 = value;//0xD15151FF

	tmp1+=4;
	
	*(__IO uint32_t*)tmp1 = 0xD45783FF;
	tmp1+=4;
		
		*(__IO uint32_t*)tmp1 = 0xD59256FF;
		tmp1+=4;
			
			*(__IO uint32_t*)tmp1 = 0xD14748FF;
			tmp1+=4;
				
				*(__IO uint32_t*)tmp1 = 0xD95317FF;
				tmp1+=4;
					
					*(__IO uint32_t*)tmp1 = 0xD45786FF;
					tmp1+=4;
		
						*(__IO uint32_t*)tmp1 = 0xD59256CF;
						tmp1+=4;
						
							*(__IO uint32_t*)tmp1 = 0xD14749FF;
							tmp1+=4;
								*(__IO uint32_t*)tmp1 = 0xD95316FF;
}

 

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

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Ради этого и задаю вопрос что не так. А знание  Си приходит с опытом и пониманием. Я бы пожелал примеры Cmsis для лучшего понимания. А уж потом круговерть с библиотеками.    

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

  • 1 месяц спустя...
  • 6 месяцев спустя...
В 04.06.2021 в 18:21, Leo сказал:
	    FMC_Bank5_6->SDCR[0] = FMC_SDCR1_SDCLK_1 | FMC_SDCR1_RBURST | FMC_SDCR1_RPIPE_1;
	    FMC_Bank5_6->SDCR[1] = FMC_SDCR1_NR_0 | FMC_SDCR1_MWID_0 | FMC_SDCR1_NB | FMC_SDCR1_CAS;

Это как? Двa sdram чипа, один читает другой пишет?

Ага, поиском вытянул уши http://en.radzio.dxp.pl/stm32f429idiscovery/sdram.html

И там память подключена ко второму банку, отчего код выглядит хитро. Но так подключить ещё нужно умудриться.

Будет проще если Leo сообщит полное название чипов, и список контактов (подготавливается в кубике).

 

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

3 часа назад, Leo сказал:

Хотел узнать есть у кого рабочий пример работы SDRAM на stm32F429 к сожалению правильно работающего не нашёл. 

Шутите ? Выше выкладывал рабочий пример ! Там даже камень такой же !

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

Alex  он скомпилировался но при запуске связь с платой пропала! Я через reset восстановил связь но не понял почему так произошло а заклинило конкретно.

AVI-crak Home да пример этот но я его не первый раз встречаю и все утверждают что он рабочий. А плата у меня stm32f429i-disc1 камень  stm32f429ZIT6U память IS42S16400J-7TL.

Я писал так . Вы хотите чтоб я в кубе проект настроил?

RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN;
	RCC->AHB1ENR |= RCC_AHB1ENR_GPIOEEN;
    RCC->AHB1ENR |= RCC_AHB1ENR_GPIOFEN;
	RCC->AHB1ENR |= RCC_AHB1ENR_GPIOGEN;
    RCC->AHB1ENR |= RCC_AHB1ENR_GPIOCEN;
    RCC->AHB1ENR |= RCC_AHB1ENR_GPIOBEN;
	/**************************************PD***************************************/
	//** PD0  
	GPIOD->MODER |= GPIO_MODER_MODER0_1;//
	GPIOD->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR0;
  	GPIOD->PUPDR &= ~GPIO_PUPDR_PUPDR0;
    
    GPIOD->AFR[0] |= (12);

    //** PD1  
    GPIOD->MODER |= GPIO_MODER_MODER1_1;
    GPIOD->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR1;
  	GPIOD->PUPDR &= ~GPIO_PUPDR_PUPDR1;
    
    GPIOD->AFR[0] |= (12<<4);

    //** PD8  
    GPIOD->MODER |= GPIO_MODER_MODER8_1;
    GPIOD->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR8;
  	GPIOD->PUPDR &= ~GPIO_PUPDR_PUPDR8;
    
    GPIOD->AFR[1] |= (12);

    //** PD9  
    GPIOD->MODER |= GPIO_MODER_MODER9_1;
    GPIOD->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR9;
  	GPIOD->PUPDR &= ~GPIO_PUPDR_PUPDR9;
    
    GPIOD->AFR[1] |= (12<<4);

    //** PD10  
    GPIOD->MODER |= GPIO_MODER_MODER10_1;
    GPIOD->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR10;
  	GPIOD->PUPDR &= ~GPIO_PUPDR_PUPDR10;
    
    GPIOD->AFR[1] |= (12<<4*2);

    //** PD14  
    GPIOD->MODER |= GPIO_MODER_MODER14_1;
    GPIOD->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR14;
  	GPIOD->PUPDR &= ~GPIO_PUPDR_PUPDR14;
  
    GPIOD->AFR[1] |= (12<<4*6);

    //** PD15  
    GPIOD->MODER |= GPIO_MODER_MODER15_1;
    GPIOD->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR15;
  	GPIOD->PUPDR &= ~GPIO_PUPDR_PUPDR15;
    
    GPIOD->AFR[1] |= (12<<4*7);
/***********************************PE******************************************/
    //** PE0 (NBL0) 
    GPIOE->MODER |= GPIO_MODER_MODER0_1;
    GPIOE->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR0;
    GPIOE->PUPDR &= ~GPIO_PUPDR_PUPDR0;
  
    GPIOE->AFR[0] |= (12);

    //** PE1 (NBL1) 
    GPIOE->MODER |= GPIO_MODER_MODER1_1;
    GPIOE->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR1;
    GPIOE->PUPDR &= ~GPIO_PUPDR_PUPDR1;
    
    GPIOE->AFR[0] |= (12<<4);

    //** PE7  
    GPIOE->MODER |= GPIO_MODER_MODER7_1;
    GPIOE->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR7;
    GPIOE->PUPDR &= ~GPIO_PUPDR_PUPDR7;
    
    GPIOE->AFR[0] |= (12<<4*7);

    //** PE8  
    GPIOE->MODER |= GPIO_MODER_MODER8_1;
    GPIOE->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR8;
    GPIOE->PUPDR &= ~GPIO_PUPDR_PUPDR8;
    
    GPIOE->AFR[1] |= (12);

    //** PE9  
    GPIOE->MODER |= GPIO_MODER_MODER9_1;
    GPIOE->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR9;
    GPIOE->PUPDR &= ~GPIO_PUPDR_PUPDR9;
    
    GPIOE->AFR[1] |= (12<<4);

    //** PE10  
    GPIOE->MODER |= GPIO_MODER_MODER10_1;
    GPIOE->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR10;
    GPIOE->PUPDR &= ~GPIO_PUPDR_PUPDR10;
    
    GPIOE->AFR[1] |= (12<<4*2);

    //** PE11  
    GPIOE->MODER |= GPIO_MODER_MODER11_1;
    GPIOE->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR11;
    GPIOE->PUPDR &= ~GPIO_PUPDR_PUPDR11;
    
    GPIOE->AFR[1] |= (12<<4*3);

    //** PE12  
    GPIOE->MODER |= GPIO_MODER_MODER12_1;
    GPIOE->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR12;
    GPIOE->PUPDR &= ~GPIO_PUPDR_PUPDR12;
   
    GPIOE->AFR[1] |= (12<<4*4);

    //** PE13
    GPIOE->MODER |= GPIO_MODER_MODER13_1;
    GPIOE->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR13;
    GPIOE->PUPDR &= ~GPIO_PUPDR_PUPDR13;
    
    GPIOE->AFR[1] |= (12<<4*5);

    //** PE14  
    GPIOE->MODER |= GPIO_MODER_MODER14_1;
    GPIOE->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR14;
    GPIOE->PUPDR &= ~GPIO_PUPDR_PUPDR14;
    
    GPIOE->AFR[1] |= (12<<4*6);

    //** PE15
    GPIOE->MODER |= GPIO_MODER_MODER15_1;
    GPIOE->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR15;
    GPIOE->PUPDR &= ~GPIO_PUPDR_PUPDR15;
    
    GPIOE->AFR[1] |= (12<<4*7);
 /********************************PF******************************************/
    //** PF0  
    GPIOF->MODER |= GPIO_MODER_MODER0_1;//
    GPIOF->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR0;
    GPIOF->PUPDR &= ~GPIO_PUPDR_PUPDR0;
  
    GPIOF->AFR[0] |= (12);

    //** PF1 
    GPIOF->MODER |= GPIO_MODER_MODER1_1;
    GPIOF->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR1;
    GPIOF->PUPDR &= ~GPIO_PUPDR_PUPDR1;
  
    GPIOF->AFR[0] |= (12<<4);

    //** PF2  
    GPIOF->MODER |= GPIO_MODER_MODER2_1;
    GPIOF->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR2;
    GPIOF->PUPDR &= ~GPIO_PUPDR_PUPDR2;
    
    GPIOF->AFR[0] |= (0x12<<4*2);

    //** PF3  
    GPIOF->MODER |= GPIO_MODER_MODER3_1;
    GPIOF->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR3;
    GPIOF->PUPDR &= ~GPIO_PUPDR_PUPDR3;
    
    GPIOF->AFR[0] |= (12<<4*3);

    //** PF4  
    GPIOF->MODER |= GPIO_MODER_MODER4_1;
    GPIOF->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR4;
    GPIOF->PUPDR &= ~GPIO_PUPDR_PUPDR4;
  
    GPIOF->AFR[0] |= (12<<4*4);

    //**  PF5
    GPIOF->MODER |= GPIO_MODER_MODER5_1;
    GPIOF->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR5;
    GPIOF->PUPDR &= ~GPIO_PUPDR_PUPDR5;
    
    GPIOF->AFR[0] |= (12<<4*5);

    //** PF11 (SDNRAS)
    GPIOF->MODER |= GPIO_MODER_MODER11_1;
    GPIOF->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR11;
    GPIOF->PUPDR &= ~GPIO_PUPDR_PUPDR11;
    
    GPIOF->AFR[1] |= (12<<4*3);

    //** PF12 
    GPIOF->MODER |= GPIO_MODER_MODER12_1;
    GPIOF->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR12;
    GPIOF->PUPDR &= ~GPIO_PUPDR_PUPDR12;
    
    GPIOF->AFR[1] |= (12<<4*4);

    //** PF13
    GPIOF->MODER |= GPIO_MODER_MODER13_1;
    GPIOF->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR13;
    GPIOF->PUPDR &= ~GPIO_PUPDR_PUPDR13;
    
    GPIOF->AFR[1] |= (12<<4*5);

    //** PF14  
    GPIOF->MODER |= GPIO_MODER_MODER14_1;
    GPIOF->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR14;
    GPIOF->PUPDR &= ~GPIO_PUPDR_PUPDR14;
    
    GPIOF->AFR[1] |= (12<<4*6);

    //** PF15 
    GPIOF->MODER |= GPIO_MODER_MODER15_1;
    GPIOF->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR15;
    GPIOF->PUPDR &= ~GPIO_PUPDR_PUPDR15;
    
    GPIOF->AFR[1] |= (12<<4*7);
  /*******************************PG*******************************************/
    //** PG0  
    GPIOG->MODER |= GPIO_MODER_MODER0_1;//
    GPIOG->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR0;
    GPIOG->PUPDR &= ~GPIO_PUPDR_PUPDR0;
    
    GPIOG->AFR[0] |= (12);

    //** PG1  
    GPIOG->MODER |= GPIO_MODER_MODER1_1;
    GPIOG->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR1;
    GPIOG->PUPDR &= ~GPIO_PUPDR_PUPDR1;
    
    GPIOG->AFR[0] |= (12<<4);

    //** PG4 (BA0) 
    GPIOG->MODER |= GPIO_MODER_MODER4_1;
    GPIOG->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR4;
    GPIOG->PUPDR &= ~GPIO_PUPDR_PUPDR4;
    
    GPIOG->AFR[0] |= (12<<4*4);

    //** PG5 (BA1) 
    GPIOG->MODER |= GPIO_MODER_MODER5_1;
    GPIOG->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR5;
    GPIOG->PUPDR &= ~GPIO_PUPDR_PUPDR5;
    
    GPIOG->AFR[0] |= (12<<4*5);

    //** PG8 (SDCLK) 
    GPIOG->MODER |= GPIO_MODER_MODER8_1;
    GPIOG->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR8;
    GPIOG->PUPDR &= ~GPIO_PUPDR_PUPDR8;
    
    GPIOG->AFR[1] |= (12);

    //** PG15 (SDNCAS) 
    GPIOG->MODER |= GPIO_MODER_MODER15_1;
    GPIOG->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR15;
    GPIOG->PUPDR &= ~GPIO_PUPDR_PUPDR15;
    
    GPIOG->AFR[1] |= (12<<4*7);
 /****************************************PC****************************************/
    //** PC0 (SDNWE) 
    GPIOC->MODER |= GPIO_MODER_MODER0_1;
    GPIOC->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR0;
    GPIOC->PUPDR &= ~GPIO_PUPDR_PUPDR0;
    
    GPIOC->AFR[0] |= (12);

 /*******************************************PB*****************************************/
    //** PB5 (SDCKE1) 
    GPIOB->MODER |= GPIO_MODER_MODER5_1;
    GPIOB->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR5;
    GPIOB->PUPDR &= ~GPIO_PUPDR_PUPDR5;
    
    GPIOB->AFR[0] |= (12<<4*5);

    //** PB6 (SDNE1) 
    GPIOB->MODER |= GPIO_MODER_MODER6_1;
    GPIOB->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR6;
    GPIOB->PUPDR &= ~GPIO_PUPDR_PUPDR6;
    
    GPIOB->AFR[0] |= (12<<4*6);

  

 

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

Офигеть портянка, и наверняка ошибка в магических сдвигах, в линиях данных D1 или D2. Искать несоответствие сразу по трём документам моего желания не наблюдается. Могу подсказать как упростить житие и программирование. Нужно писать так, чтобы написанное было сразу понятно. мой костыль (ссылка) Выбрать свой мк из списка, вставить в проект.

    gpio_one_pin(zap_gpio.D.pin15.v_af12_fmc_d1_da1.speed4.pull_down.lock_on);         /// FMC_d1
    gpio_one_pin(zap_gpio.D.pin14.v_af12_fmc_d0_da0.speed4.pull_down.lock_on);         /// FMC_d0

У кубика есть вывод статистики используемых контактов в текстовый файл, там сразу в трёх вариантах сортировки: по физическому номеру ноги корпуса, по имени периферии, по названию ноги. Для серийной отладочной платы уже есть готовый проект кубика, где назначены все нужные ноги, именно так как они распаяны на печатной плате. Просто загрузить, и вывести статистику. При операциях копировать/вставить - ошибку очень трудно допустить. Ну а мой макрос просто не допустит иного ввода текста, кроме как рабочего.

И да, проект от кубика тянет текста больше чем у меня, примерно в 30 раз.

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

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

Alex  он скомпилировался но при запуске связь с платой пропала! Я через reset восстановил связь но не понял почему так произошло а заклинило конкретно.

А плата у меня stm32f429i-disc1

Не знаю, что там у Вас могло заклинить, но плата, на которой я экспериментировал, такая же, один в один. Дисплей только отгрыз и прикрутил другой. Вот, я даже фотки выкладывал :
https://forum.cxem.net/index.php?/topic/172764-stm32-для-чайника/page/81/#comment-3118906

 

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

AVI-crak Home Я взял документацию по плате и оттуда взял контакты подключения 10 раз перепроверил . Костыль смотрится красиво но для начала проще моя портянка в начале пути. Хотя когда во всём разберусь я к ней вернусь для упрощение настроек.

Вы думаете я ошибся в контактах или настройке FMC.

Alex Я заметил что SDRAM у вас прописан в stm32f4_flash.ld у меня этого нет может это повлиять на работу.

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

  • 3 недели спустя...

Взял проект из куба добавил запись массива emcpy((uint32_t *) SDRAM_ADD, wdata, 5);

но записи не происходит. 

Может  кто-нибудь проверить на своей плате пишет программа в память или я написал что-то не так? 

CubProba1.7z

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

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

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

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

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

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

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

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...