Fórum témák
- • Kompresszor építés
- • Erősítő mindig és mindig
- • Alternativ HE találkozó(k)
- • WLAN router
- • LCD TV probléma
- • Forrasztópákák - melyik miért jó
- • Napelem alkalmazása a lakás energia ellátásában
- • TV hiba, mi a megoldás?
- • Szárítógép problémák
- • Villanyszerelés
- • Mikrohullámú sütő javítás, magnetron csere, stb.
- • Elektroncső
- • Villanypásztor
- • Hangsugárzó építés, javítás - miértek, hogyanok
- • Dansk 3f-T3535, és minden, ami vele kapcsolatos
- • Házilag építhető fémkereső
- • Mi mivel oldható (hígítható) vagy ragasztható?
- • Hűtőgép probléma
- • Felajánlás, azaz ingyen elvihető
- • Kapcsolóüzemű táp 230V-ról
- • Feszültségszabályzó motorba
- • Kávéfőzőgép hiba
- • Li-Po - Li-ion akkumulátor és töltője
- • Hordozható, bluetooth hangszóró
- • V-FET és SIT erősítő kapcsolások
- • Autóelektronika
- • TECHNICS erősítők, javításuk
- • Westen 240 Fi gázkazán hiba
- • CNC építése házi alkatrészekből az alapoktól
- • Ponthegesztő készítése házilag
- • RP2040
- • Motor fordulatszám szabályzó
- • Robotfűnyíró vagy fűnyíró robot
- • LED-es index
- • Hangszórójavítás (otthon)
- • Labortápegység készítése
- • Brushless motor elektronika
- • LCD-TFT tápegység probléma
- • Érdekességek
- • Fejhallgató erősítő
- • K típusú hőelem alkalmazása
- • PC táp javítása
- • Tápegységgel kapcsolatos kérdések
- • Online oszcilloszkóp emulátor
- • IC-t keresek
- • Erősítőhöz való hangsugárzó védelem (koppanásgátló)
- • Elektromos gyerekautò
- • Rendezvény-hangosítás (PA) hangtechnikái
- • Internetes rádióvevő
- • Vérnyomásmérők
- • Vicces - mókás történetek
- • Elektrolit kompenzátor
- • DVB-C (digitális kábeltévé) és annak készülékei
- • Villámvédelem
- • Elfogadnám, ha ingyen elvihető
» Több friss téma
|
Fórum » ARM - Miértek hogyanok
Minden olyan constans erteket es valtozot amelyik nem uint32 kenyszerits uint32-re: ,...Ha #define-al fogod csinalni, akkor is ! #define konst (uint32_t)2048
A current valtozoid hany bitesek, belefer minden esetben amit szamolsz ? Mert ha nem, akkor lehet hogy felulirodik valami. A hozzászólás módosítva: Márc 29, 2018
Meg egy eszrevetel, vigyazz hogy semmilyen korulmenyek kozott ne tudjon atmenni negativ ertekbe amit szamolsz.
Teljesen igaz, amit írtál, de ha jól tudom, akkor elég az is ha csak jelölöd, hogy
ha uint32_t
ha int32_t
ha float
mert az alapértelmezett hosszúság a 32bit.
Atlathatobb ha konkretan kiirod.
Persze, minden szépen megy addig míg csak uint16_t ben van.
Csináltam egy olyat hogy létrehoztam egy másik változót még az if előtt abba írom bele az adc_store és az offset értékét. Azt vizsgálja meg az If elágazás és miután belépett az if-be vagy az else-be akkor átmásolom az értékét egy 32 bites változóba és onnantól már működik a dolog.
Mindenesetre nagyon fura hogy ilyen megoldást kellett csináljak és egyszerűen 1 változóval végigszámolva nem működik.
kurvaanyad = (uint32_t)adc_store[1] + offset1;
Ezt próbáld ki hátha segít.
Sajnos nem, de más módszerrel sikerült. Létrehoztam egy harmadik változót amit csak ideiglenesen használok míg be nem lép az if-be itt pedig átrakja egy másikba. Nem értem miért de úgy megy.
köszi azért.
Próbáltad különböző optimalizációs szintekkel? Nekem volt egy hasonló WTF esetem külső SRAM használatakor, amikor az -O2 esetén mindenféle fura hibám volt, míg -O1-el tökéletesen működött.
Érdemes lehet még assembly-ben léptetni a kódot és figyelni a regisztereket, illetve milyen utasítások is hajtódnak ténylegesen végre.
Srácok, STM32F103-as MCU-val szeretnék egy külső SRAM-ot kezelni.
1MB-os memória van rajta, próbálkozom a gyári könyvtárával, de valamiért nem tudom működésre bírni. Valamit csinál, de az nem jó, ellenőrzésnél is elhasal.
Gyári fejlesztőpanelt használok, ilyet: Bővebben: Link
Nincs véletlen valakinél elfekvőben egy működő (tesztelt) példa program?
3 napja kínlódok vele, de nem jutok előre, vagy elnézek valamit vagy csak simán nem jó a gyári konfigurálás.
Előre is köszi..
// General FSMC configuration
static void FSMC_CtrlLinesConfig(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Enable FSMC, GPIOD, GPIOE, GPIOF, GPIOG and AFIO clocks */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOF |
RCC_APB2Periph_GPIOG | RCC_APB2Periph_AFIO, ENABLE);
// Data lines
/* Set PD.00(D2), PD.01(D3), PD.04(NOE), PD.05(NWE), PD.08(D13), PD.09(D14),
PD.10(D15), PD.14(D0), PD.15(D1) as alternate function push pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5 |
GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_14 |
GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOD, &GPIO_InitStructure);
/* Set PE.07(D4), PE.08(D5), PE.09(D6), PE.10(D7), PE.11(D8), PE.12(D9), PE.13(D10),
PE.14(D11), PE.15(D12) as alternate function push pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 |
GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 |
GPIO_Pin_15;
GPIO_Init(GPIOE, &GPIO_InitStructure);
// Address lines
/* Set PF.00(A0), PF.01(A1), PF.02(A2), PF.03(A3), PF.04(A4), PF.05(A5), PF.12(A6),
PF.13(A7), PF.14(A8), PF.15(A9) as alternate function push pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 |
GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_12 | GPIO_Pin_13 |
GPIO_Pin_14 | GPIO_Pin_15;
GPIO_Init(GPIOF, &GPIO_InitStructure);
/* Set PG.00(A10), PG.01(A11), PG.02(A12), PG.03(A13), PG.04(A14), PG.05(A15)
as alternate function push pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 |
GPIO_Pin_4 | GPIO_Pin_5;
GPIO_Init(GPIOG, &GPIO_InitStructure);
/* Set PD.11(A16), PD.12(A17), PD.13(A18)
as alternate function push pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13;
GPIO_Init(GPIOD, &GPIO_InitStructure);
/* Set PE.3(A19)
as alternate function push pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_Init(GPIOE, &GPIO_InitStructure);
#ifdef CS_EXTENSION
/* Set PE.2(A23)
as alternate function push pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_Init(GPIOE, &GPIO_InitStructure);
/* Set PG.13(A24)
as alternate function push pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_Init(GPIOG, &GPIO_InitStructure);
#endif
}
// External SRAM
void SRAM_CtrlLinesConfig(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
FSMC_CtrlLinesConfig();
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG | RCC_APB2Periph_GPIOE, ENABLE);
// SRAM chip select
/* Set PG.10(NE3) as alternate function push pull */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_Init(GPIOG, &GPIO_InitStructure);
/* Set PE.00(NBL0), PE.01(NBL1) as alternate function push pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
GPIO_Init(GPIOE, &GPIO_InitStructure);
}
void SRAM_FSMCConfig(void)
{
FSMC_NORSRAMTimingInitTypeDef FSMC_NORSRAMTimingInitStructure;;
FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure;
// FSMC Configuration
FSMC_NORSRAMTimingInitStructure.FSMC_AddressSetupTime = 3; //3
FSMC_NORSRAMTimingInitStructure.FSMC_AddressHoldTime = 0; //0
FSMC_NORSRAMTimingInitStructure.FSMC_DataSetupTime = 3; //3
FSMC_NORSRAMTimingInitStructure.FSMC_BusTurnAroundDuration = 0;
FSMC_NORSRAMTimingInitStructure.FSMC_CLKDivision = 0;
FSMC_NORSRAMTimingInitStructure.FSMC_DataLatency = 0;
FSMC_NORSRAMTimingInitStructure.FSMC_AccessMode = FSMC_AccessMode_A;
FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM3;
FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM;
FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;
FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;
FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;
FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;
FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;
FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &FSMC_NORSRAMTimingInitStructure;
FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &FSMC_NORSRAMTimingInitStructure;
FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);
// Enable FSMC Bank1_SRAM Bank
FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM3, ENABLE);
// Enable the DMA Clock
RCC_AHBPeriphClockCmd(MEM_DMA_CLK, ENABLE);
}
void SRAM_Configuration(void)
{
SRAM_CtrlLinesConfig();
SRAM_FSMCConfig();
}
uint32_t SRAM_Test(void)
{
__IO uint32_t addr;
for( addr = SRAM_START_ADDR; addr < SRAM_END_ADDR + 1 ; addr += 4 ) {
*(uint32_t *)addr = addr;
}
for( addr = SRAM_START_ADDR; addr < SRAM_END_ADDR + 1 ; addr += 4 ) {
if (*(uint32_t *)addr != addr) {
break;
}
}
if( addr >= SRAM_END_ADDR + 1 ) {
return 0; // OK
} else {
return addr; // Failed at address
}
}
// External SRAM
/* Address calculation:
Base address for FSMC banks:
= 0x60000000
Offset for bank NEx:
= 0x04000000 * (x - 1)
NE1: 0x00000000
NE2: 0x04000000
NE3: 0x08000000
NE4: 0x0C000000
Offset for LCD register select with Ay:
= 2^y (for 8 bit bus)
= 2^(y+1) (for 16 bit bus)
*/
#define SRAM_START_ADDR ((uint32_t)0x68000000)
#define SRAM_END_ADDR ((uint32_t)0x680FFFFF)
#define EXTRAM __attribute__((section(".extram")))
példa:
uint8_t EXTRAM lcdScreenBuffer[LCD_DATASIZE];
uint8_t EXTRAM lcdImageBuffer[LCD_DATASIZE];
Linker script:
MEMORY
{
ROM (rx) : ORIGIN = 0x08040000, LENGTH = 256K
RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 64K
EXTRAM (rwx) : ORIGIN = 0x68000000, LENGTH = 1024K
}
__EEPROM_SIZE = 0x4000;
.extram (NOLOAD):
{
*(.extram*)
. = ALIGN(__EEPROM_SIZE);
__ee_start__ = .;
*(.eepromshared*)
*(.eepromdata*)
__ee_end__ = .;
. = ALIGN(__EEPROM_SIZE);
__extram_end__ = .;
} > EXTRAM
Ezt a kódot ezzel a fejlesztőpanellel használtam:
https://www.waveshare.com/product/mcu-tools/stm32/open/open103z-pac...-a.htm
Az oldal alján találsz linket a kapcsolási rajzhoz ha szükséges. A hozzászólás módosítva: Ápr 1, 2018
Sajnos egyelőre ugyan azt csinálja mint az én kódom..
A linker állományt hol találom amúgy?
IAR Embedded Workbench-et használók, abból is a 7.60-as verziót.
Fogalmam sincs, sohasem használtam IAR workbenchet.
Megvan valahol a kapcsolási rajza a fejlesztőkártyádnak?
Neten biztos van,de nekem nincs hozzá, de mivel FSMC gyári könyvtárát használom, mennie kellene. Integrálva van rá az SRAM.
Közben megtaláltam: Bővebben: Link
Csatolom a kódomat:
/******************** (C) COPYRIGHT 2008 STMicroelectronics ********************
* File Name : fsmc_sram.c
* Author : MCD Application Team
* Version : V2.0.3
* Date : 09/22/2008
* Description : This file provides a set of functions needed to drive the
* IS61WV51216BLL SRAM memory
********************************************************************************
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
*******************************************************************************/
/* Includes ------------------------------------------------------------------*/
#include "fsmc_sram.h"
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
//#define Bank1_SRAM3_ADDR ((u32)0x60000000)
//#define Bank2_SRAM3_ADDR ((u32)0x64000000)
//#define Bank3_SRAM3_ADDR ((u32)0x68000000)
//#define Bank4_SRAM3_ADDR ((u32)0x6C000000)
#define Bank1_SRAM3_ADDR ((u32)0x68000000)
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
/*******************************************************************************
* Function Name : FSMC_SRAM_Init
* Description : Configures the FSMC and GPIOs to interface with the SRAM memory.
* This function must be called before any write/read operation
* on the SRAM.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void FSMC_SRAM_Init(void)
{
FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure;
FSMC_NORSRAMTimingInitTypeDef p;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOG | RCC_APB2Periph_GPIOE |
RCC_APB2Periph_GPIOF, ENABLE);
/*-- GPIO Configuration ------------------------------------------------------*/
/* SRAM Data lines configuration */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_8 | GPIO_Pin_9 |
GPIO_Pin_10 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 |
GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 |
GPIO_Pin_15;
GPIO_Init(GPIOE, &GPIO_InitStructure);
/* SRAM Address lines configuration */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 |
GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_12 | GPIO_Pin_13 |
GPIO_Pin_14 | GPIO_Pin_15;
GPIO_Init(GPIOF, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 |
GPIO_Pin_4 | GPIO_Pin_5;
GPIO_Init(GPIOG, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_Init(GPIOE, &GPIO_InitStructure);
/* NOE and NWE configuration */
// D4 <-> OUTPUT Enabled
// D5 <-> WRITE Enabled
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5; // 7-es PIN a FAMC_NE1
GPIO_Init(GPIOD, &GPIO_InitStructure);
/* NE3 configuration */
// CHIP Select
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_Init(GPIOG, &GPIO_InitStructure);
/* NBL0, NBL1 configuration */
// E0 <-> Byte Mode
// E1 <-> Word Mode
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
GPIO_Init(GPIOE, &GPIO_InitStructure);
/*-- FSMC Configuration ------------------------------------------------------*/
p.FSMC_AddressSetupTime = 0;
p.FSMC_AddressHoldTime = 0;
p.FSMC_DataSetupTime = 2;
p.FSMC_BusTurnAroundDuration = 0;
p.FSMC_CLKDivision = 0;
p.FSMC_DataLatency = 0;
p.FSMC_AccessMode = FSMC_AccessMode_A;
FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM3;
FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM;
FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;
FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;
FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;
FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;
FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;
FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p;
FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;
FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);
/* Enable FSMC Bank1_SRAM Bank */
FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM3, ENABLE);
}
/*******************************************************************************
* Function Name : FSMC_SRAM_WriteBuffer
* Description : Writes a Half-word buffer to the FSMC SRAM memory.
* Input : - pBuffer : pointer to buffer.
* - WriteAddr : SRAM memory internal address which the data
* will be written.
* - NumHalfwordToWrite : number of half-words to write.
*
* Output : None
* Return : None
*******************************************************************************/
void FSMC_SRAM_WriteBuffer(u16* pBuffer, u32 WriteAddr, u32 NumHalfwordToWrite)
{
for(; NumHalfwordToWrite != 0; NumHalfwordToWrite--) /* while there is data to write */
{
/* Transfer data to the memory */
*(u16 *) (Bank1_SRAM3_ADDR + WriteAddr) = *pBuffer++;
/* Increment the address*/
WriteAddr += 2;
}
}
/*******************************************************************************
* Function Name : FSMC_SRAM_ReadBuffer
* Description : Reads a block of data the FSMC SRAM memory.
* Input : - pBuffer : pointer to the buffer that receives the data read
* the SRAM memory.
* - ReadAddr : SRAM memory internal address to read .
* - NumHalfwordToRead : number of half-words to read.
* Output : None
* Return : None
*******************************************************************************/
void FSMC_SRAM_ReadBuffer(u16* pBuffer, u32 ReadAddr, u32 NumHalfwordToRead)
{
for(; NumHalfwordToRead != 0; NumHalfwordToRead--) /* while there is data to read */
{
/* Read a half-word the memory */
*pBuffer++ = *(vu16*) (Bank1_SRAM3_ADDR + ReadAddr);
/* Increment the address*/
ReadAddr += 2;
}
}
/******************* (C) COPYRIGHT 2008 STMicroelectronics *****END OF FILE****/
/* Write/read to/ FSMC SRAM memory *************************************/
/* Enable the FSMC Clock */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE);
// SRAM init
FSMC_SRAM_Init();
// ezzel probálkozom, ha csak 1 címet akarok írni
*(u16 *) (((u32)0x68000000) + 0x10) = 0xF11F;
u16 temp = *(vu16*) (((u32)0x68000000) + 0x10);
/* Write data to FSMC SRAM memory */
/* Fill the buffer to send */
Fill_Buffer(TxBuffer, BUFFER_SIZE, 0x00); // Eredménye: 0, 1, 2, 3, 4, 5...1024
FSMC_SRAM_WriteBuffer(TxBuffer, WRITE_ADDR, BUFFER_SIZE);
/* Read data FSMC SRAM memory */
FSMC_SRAM_ReadBuffer(RxBuffer, WRITE_ADDR, BUFFER_SIZE);
Nem igen értem mi lehet a gond.
Ha megnézed a kapcsolási rajzot, akkor látszik, hogy az FSMC_NE2-re van kötve az SRAM (nálam az FSMC_NE3-ra volt). Ezért a kódodban rosszul konfigurálod a memóriát.
mindenhol FSMC_Bank1_NORSRAM3 => FSMC_Bank1_NORSRAM2
cím változás 0x68000000 => 0x64000000
és természetesen a PG9-et kell konfigurálni nem pedig a PG10-et.
Igen, igazad van, ezt nem vettem észre..
Át írtam G9-re, így az NE2-re került a ChipSelect.
A memória nem tiszta.
Hová kell az mutasson?
Nem értem a felosztást, hogy melyik mire kell mutasson.
Nézd meg a mellékelt képet. Látszik rajta, hogy attól függően milyen hardvert csatlakoztatsz az FSMC-n keresztül, különböző memóriacímeken lehet elérni. Az SRAM-ot (és pl. az LCD-t is) a 0x60000000 területre osztja le. Azonban tovább bonyolítja, hogy ezt a területet is 4db 64MB-os részterületre osztja fel, annak függvényében melyik chip select-et használod. Mivel a hardvered az NE2-t használja ezért a memóriád a 0x64000000-os címtől lesz elérhető. Ez azért hasznos, mert akár 4db SRAM-ot (vagy egyéb hardvert) is csatlakoztathatsz egyszerre (sőt, nagy sebességű logikai kapuval és a nem használt address line-ok segítségével még többet is ). A hozzászólás módosítva: Ápr 1, 2018
Igen, rá is varázsoltam, de system halted-re kiáll a program, amikor írni akarok a területre.
Lehet még valami nincs a helyén?
Értem már, a memória elosztást.
Milyen memóriád van a vason ténylegesen?
p.FSMC_AddressSetupTime = 3;
p.FSMC_AddressHoldTime = 0;
p.FSMC_DataSetupTime = 3;
p.FSMC_BusTurnAroundDuration = 0;
p.FSMC_CLKDivision = 0;
p.FSMC_DataLatency = 0;
p.FSMC_AccessMode = FSMC_AccessMode_A;
ne legyél az időzítésekkel túl agresszív az elején, később ráérsz belőni. A hozzászólás módosítva: Ápr 1, 2018
CY62157EV30 - Bővebben: Link
Gyárilag ez van rajta.
Éppen most ellenőrzöm a lábkiosztást és a bekötést, hogy minden a helyén van e.
Szerk: a lábak biztosan jó helyen vannak, azt most műszerrel ellenőriztem. A hozzászólás módosítva: Ápr 1, 2018
Ez a memória elég lassú. Azokat az időket növeld meg inkább 5-6-ra. Később esetleg megnézheted 4-el is (gondolom 72MHz-en futsz).
Igen, 72MHz-en ketyeg, de a portokat le kellett vennem 10MHz-re mert 50MHz-en már nem volt jó, ennyit észlelek, mint működés.
Lejjebb veszem az időzítéseket.
Nekem sosem volt még problémán az 50MHz-es móddal. Viszont ez lehet további időzítési hibát okozhat. Innentől kábé nekem is elfogytak az ötleteim.
Ja igen, még valami. Ne használj -O1-nél nagyobb optimalizációt (bár az IAR-nek gondolom nem GCC alapú a fordítója). A hozzászólás módosítva: Ápr 1, 2018
Ezeket nézegetem akkor, mert szerintem is most már mennie kellene.
Egyelőre nem találom a hibát, az időket már 100-as nagyságrendben állítom, de semmi.
Gondolom csak valami kis dolog, amit megint nem veszek észre, 3 napja kínlódok már vele..
Szeretek egyedül spekuzin a dolgokon, de ez már kicsit kezd sok lenni.
Alapon van az optimalizáció. A hozzászólás módosítva: Ápr 1, 2018
Tedd be az aktuális kódot, gyorsan átfutom én is.
FSMC: /******************** (C) COPYRIGHT 2008 STMicroelectronics ********************
* File Name : fsmc_sram.c
* Author : MCD Application Team
* Version : V2.0.3
* Date : 09/22/2008
* Description : This file provides a set of functions needed to drive the
* IS61WV51216BLL SRAM memory
********************************************************************************
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
*******************************************************************************/
/* Includes ------------------------------------------------------------------*/
#include "fsmc_sram.h"
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
//#define Bank1_SRAM3_ADDR ((u32)0x60000000)
#define Bank2_SRAM3_ADDR ((u32)0x64000000)
//#define Bank3_SRAM3_ADDR ((u32)0x68000000)
//#define Bank4_SRAM3_ADDR ((u32)0x6C000000)
//#define Bank1_SRAM3_ADDR ((u32)0x68000000)
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
/*******************************************************************************
* Function Name : FSMC_SRAM_Init
* Description : Configures the FSMC and GPIOs to interface with the SRAM memory.
* This function must be called before any write/read operation
* on the SRAM.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void FSMC_SRAM_Init(void)
{
FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure;
FSMC_NORSRAMTimingInitTypeDef p;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOG | RCC_APB2Periph_GPIOE |
RCC_APB2Periph_GPIOF, ENABLE);
/*-- GPIO Configuration ------------------------------------------------------*/
/* SRAM Data lines configuration */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_8 | GPIO_Pin_9 |
GPIO_Pin_10 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 |
GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 |
GPIO_Pin_15;
GPIO_Init(GPIOE, &GPIO_InitStructure);
/* SRAM Address lines configuration */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 |
GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_12 | GPIO_Pin_13 |
GPIO_Pin_14 | GPIO_Pin_15;
GPIO_Init(GPIOF, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 |
GPIO_Pin_4 | GPIO_Pin_5;
GPIO_Init(GPIOG, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_Init(GPIOE, &GPIO_InitStructure);
/* NOE and NWE configuration */
// D4 <-> OUTPUT Enabled
// D5 <-> WRITE Enabled
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5; // 7-es PIN a FAMC_NE1
GPIO_Init(GPIOD, &GPIO_InitStructure);
/* NE2 configuration */
// CHIP Select
// G9 <-> CHIP Select
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_Init(GPIOG, &GPIO_InitStructure);
/* NBL0, NBL1 configuration */
// E0 <-> Byte Mode
// E1 <-> Word Mode
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
GPIO_Init(GPIOE, &GPIO_InitStructure);
/*-- FSMC Configuration ------------------------------------------------------*/
p.FSMC_AddressSetupTime = 5;
p.FSMC_AddressHoldTime = 0;
p.FSMC_DataSetupTime = 5;
p.FSMC_BusTurnAroundDuration = 0;
p.FSMC_CLKDivision = 0;
p.FSMC_DataLatency = 0;
p.FSMC_AccessMode = FSMC_AccessMode_A;
FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM2;
FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM;
FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;
FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;
FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;
FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;
FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;
FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p;
FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;
FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);
/* Enable FSMC Bank2_SRAM Bank */
FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM2, ENABLE);
}
/*******************************************************************************
* Function Name : FSMC_SRAM_WriteBuffer
* Description : Writes a Half-word buffer to the FSMC SRAM memory.
* Input : - pBuffer : pointer to buffer.
* - WriteAddr : SRAM memory internal address which the data
* will be written.
* - NumHalfwordToWrite : number of half-words to write.
*
* Output : None
* Return : None
*******************************************************************************/
void FSMC_SRAM_WriteBuffer(u16* pBuffer, u32 WriteAddr, u32 NumHalfwordToWrite)
{
for(; NumHalfwordToWrite != 0; NumHalfwordToWrite--) /* while there is data to write */
{
/* Transfer data to the memory */
*(u16 *) (Bank2_SRAM3_ADDR + WriteAddr) = *pBuffer++;
/* Increment the address*/
WriteAddr += 2;
}
}
/*******************************************************************************
* Function Name : FSMC_SRAM_ReadBuffer
* Description : Reads a block of data the FSMC SRAM memory.
* Input : - pBuffer : pointer to the buffer that receives the data read
* the SRAM memory.
* - ReadAddr : SRAM memory internal address to read .
* - NumHalfwordToRead : number of half-words to read.
* Output : None
* Return : None
*******************************************************************************/
void FSMC_SRAM_ReadBuffer(u16* pBuffer, u32 ReadAddr, u32 NumHalfwordToRead)
{
for(; NumHalfwordToRead != 0; NumHalfwordToRead--) /* while there is data to read */
{
/* Read a half-word the memory */
*pBuffer++ = *(vu16*) (Bank2_SRAM3_ADDR + ReadAddr);
/* Increment the address*/
ReadAddr += 2;
}
}
/******************* (C) COPYRIGHT 2008 STMicroelectronics *****END OF FILE****/
Main() /*************************************************************************
*
* DPTP System 2018-03-30
* SRAM
*
* Revision: 1.0
**************************************************************************/
#include "includes.h"
#define DLY_100US 450
#define BUFFER_SIZE 8
#define WRITE_ADDR 0
u16 TxBuffer[BUFFER_SIZE];
u16 RxBuffer[BUFFER_SIZE];
/* Private function prototypes -----------------------------------------------*/
void Fill_Buffer(u16 *pBuffer, u16 BufferLenght, u32 Offset);
void main(void){
GPIO_InitTypeDef GPIO_InitStructure; // IO struktúra
unsigned int i = 0;
ENTR_CRT_SECTION();
/* Setup STM32 system (clock, PLL and Flash configuration) */
SystemInit();
// NVIC init
#ifndef EMB_FLASH
/* Set the Vector Table base location at 0x20000000 */
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else /* VECT_TAB_FLASH */
/* Set the Vector Table base location at 0x08000000 */
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
EXT_CRT_SECTION();
// F prot beállítása (LED)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF, ENABLE);
//RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOF, DISABLE);
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_Init(GPIOF, &GPIO_InitStructure);
/* Write/read to/ FSMC SRAM memory *************************************/
/* Enable the FSMC Clock */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE);
// SRAM init
FSMC_SRAM_Init();
//*(u16 *) ((u32)0x64000000 + 0x10) = 0xF11F;
//u16 temp = *(vu16*) ((u32)0x64000000 + 0x10);
/* Write data to FSMC SRAM memory */
/* Fill the buffer to send */
Fill_Buffer(TxBuffer, BUFFER_SIZE, 0xFF00);
FSMC_SRAM_WriteBuffer(TxBuffer, WRITE_ADDR, BUFFER_SIZE);
/* Read data FSMC SRAM memory */
FSMC_SRAM_ReadBuffer(RxBuffer, WRITE_ADDR, BUFFER_SIZE);
while(1){
// LED-et villogtatok, hogy lássam fut a program
if((i & 0xFFFFF) == 0){
if((GPIOF->IDR & GPIO_Pin_6) != 0){
GPIOF->BRR = GPIO_Pin_6;
}else{
GPIOF->BSRR = GPIO_Pin_6;
}
i=0;
}
i++;
}// while
}// main
void Fill_Buffer(u16 *pBuffer, u16 BufferLenght, u32 Offset)
{
u16 IndexTmp = 0;
/* Put in global buffer same values */
for (IndexTmp = 0; IndexTmp < BufferLenght; IndexTmp++ )
{
pBuffer[IndexTmp] = IndexTmp + Offset;
}
}
Ez a full kód.
Hmm, az RCC_APB2Periph_AFIO-t bekapcsolod valahol?
Szerintem nem, de utána nézek.. Nem is ismerős..
Nincs ilyen.
Hová érdemes beilleszteni a kódba?
Közben megtaláltam a FSMC init résznél az első Port initnél. A hozzászólás módosítva: Ápr 1, 2018
Hát, enélkül nem mennek az AFIO alapú perifériák... (azaz kb. minden)
Az én példámban az elején volt.
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOF |
RCC_APB2Periph_GPIOG | RCC_APB2Periph_AFIO, ENABLE);
|
|