Z kolei modyfikacja skryptu linkera ma tą wadę, że jeśli przeniosę kod na inny MCU to znowu bedę musiał ten skrypt modyfikować. Emulacja oparta na czystm C po prostu zadziała. No... bo każdy mikrokontroler ma dokładnie ten sam rozmiar strony i dokładnie ten sam kontroler pamięci, więc z pewnością zadziała Ci ten kod bez żadnych zmian... Ehe... Kupę,...
Pamięć BKP_SRAM w kontrolerach STM32F4xx zaczyna się od adresu fizycznego 0x40024000. Jak przypisać zmiennym które muszą się w tym obszarze mieścić adresy fizyczne? np. takie cos nie działa: [syntax=c] #define BKP_SRAM_BASE 0x40024000 uint32_t zmienna; void main(void) { &zmienna = BKP_SRAM_BASE; --- -- - [/syntax]
Witam, problem polega na tym że utworzyłem trzy zmienne globalne typu const uint8_t i kompilator przypisuje dwóm pierwszym ten sam adres 0x80030D4 . Trzecia zmienna już miała inny adres. Utworzyłem więc dwie kolejne zmienne do testów aby sprawdzić jaki otrzymają adres: const uint8_t ZMIENNA_TEST1=3; uint8_t zmiennaTest2=10; lecz niestety debugger ich...
Mam adresowane fizycznie obszary pamięci, jest to pamięć z podtrzymaniem bateryjnym (4kB w kontrolerze STM32F405). Dopóki używam w wyliczeniach stałe, wszystko jest ok, natomiast po umieszczeniu zmiennej program głupieje, np.: [syntax=c] *(ram+CONF_BASE+XSAMPLE+25)=dat; [/syntax] jest ok, natomiast: [syntax=c] uint32_t adr; *(ram+CONF_BASE+XSAMPLE+adr+25)=dat;...
Używam obszaru pamięci podtrzymywanej z baterii. Jeżeli mam coś takiego: [syntax=c] uint32_t adr; adr=*(ram+CONF_BASE+XSAMPLE); [/syntax] to jest ok, ale jeżeli zrobię tak: [syntax=c] uint32_t adr; adr=*(ram+CONF_BASE+XSAMPLE); if(adr>31 || adr==0) adr=1; zm1=*(ram+CONF_BASE+XSAMPLE+adr+1); [/syntax] to w ostatniej linijce program ląduje w HardFault_Handler...
const uint32_t data = (uint32_t)(&RCC->APB2... int main(void) { ... Gdzie RCC to wskaźnik na strukturę, a APB2ENR to jeden z jej elementów. #define RCC ((RCC_TypeDef *) RCC_BASE) -> ((RCC_TypeDef *) ((((uint32_t)0x40000... + 0x20000) + 0x1000))...
Witam Od niedawna zabieram sie za poznanie i2c. Przyznam że sprawia mi ono troche kołopotu. Drodzy forumowicze chciałbym się zapytać odnośnie jednej sprawy, którą znalazłem w książce "STM32 w praktyce". Mianowicie chodzi o poniższy fragment kodu. Posiadam urządzenie o adresie >7bitow i mam problem. W ww. ksiązce zastosowano fragment: http://obrazki.elektroda.pl/2479773100_1...
Witajcie. Avrgcc i plik nagłówkowy eeprom.h. Nie znalazłem prostego sposobu. Czy da się umieścić zmienne w pamięci EEPROM pod konkretnym adresem nie zostawiając pola dla linkera? Potrzebuję tablicę uint16_t Tablica[16] EEMEM umieścić (a potem odczytywać) od pierwszej komórki pamięci EEPROM (czy jakiejkolwiek innej). Da się to zrobić prosto bez pisania...
jest tak : są 2 pamieci fram 24c16 oraz 24c256 na szynie I2C wraz z atmega16,jak ustalić wejscia (A0,A1,A2) dla pamieci 24c256 aby miała inny adres niz pamiec 24c16 (adres 160 ,w nocie doczytałem ze niemozna go zmienic ) oraz jaki bedzie miała adres po ustaleniu tych wejsc ,niemogę znaleśc w jaki adres wynika z konfiguracji poziomu wejść :( ,było by...
Witam, Czy jest sposób na przeniesienie lokalizacji zmiennych w RAM dla jednego pliku .C. Linker umieszcza mi bufory transmisyjne dla ethernetu na granicy 64kB i przestaje mi działać ethernet. Na forum ST znalazłem wpis że przestaje jakoś działać DMA powyżej 64kB. Na screenie poniżej po prawej stronie widać bufor Tx_Buff który przekracza granicę 64kB...
Standard C nic nie mówi o kolejności zmiennynch w pamięci. Przyzwoity kompilator i linker będzie rozmieszczał dane w kolejności malejącego rozmiaru, a nieupywane będzei eliminował całkowicie. Chcesz mień znany rozkład danych - użyj struktury - kompilator nie ma prawa jej zoptymalizować, ale będzei stosował wyrównanie naturalne, czyli np. int32_t będzie...
Nawet dla takiego małego Miki jak ja już na pierwszy rzut oka jest jasne że te kody to potężne źródło problemów. Co widać bez wgłębienia się w szczegóły: * Funkcja main() jako rozbiegówka to słaby pomysł. Kolega stmx napisał coś na ten temat (nawet podaje link w promowanych tematach), warto to przeczytać. * Stos musi mieć odpowiednie wyrównanie, zwykle...
Nie. Architektura ARMv7-M obsługuje niewyrównany dostęp 16 i 32bitowy. Tylko dostęp na słowa większe niz 32bity (LDRD/STRD, LDM/STM) z niewyrównanym do 4 bajtów adresem rzucają fault. Inna sprawa, że w STM32 SFRy ogólnie nie lubią niewyrównanych zapisów lub zapisów o szerokości innej niz sam SFR. Ale to się nie kończy faultem, tylko dziwną wartością...
Problemem w M0 jest brak opcji unaligned access. Jeśli funkcja jako argument dostaje adres i jest to adres dowolny tzn. niekoniecznie wyrównany do 4(2) bajtów to w przypadku M0 próba odczytania danych 32b(16b) z pod takiego adresu skończy się wygenerowaniem wyjątku. M3 i M4 wspierają unaligned access i dlatego funkcje dla obydwu rdzeni mogą mieć jednakowe...
Wiesz że dane zapisane w ten sposób zajmują 2x lub 3x więcej pamięci flash niż rozmiar struktury? Chodzi o wyrównanie Flasha do 4 bajtów? Próbowałem zapisać rzutując na int a nie char i dać size jako: [syntax=c] int size = sizeof(EEPROM_Data)/sizeof(int); [/syntax] I zapisywać do Flasha po 4 bajty ale nie działało. Dostawałem śmieci. [/quote]
jak to zrobić aby te dane znajdowały się w drugiej połowie 128kB flash i zaczynały się dokładnie od początku drugiego 64kB?. A po co Ci takie coś? Adres wgranych danych możesz sobie pobrać ze wspomnianych symboli, nie musi to być więc jakaś stała wartość. No chyba że chodzi Ci o to, żeby dane nie zostały nigdy skasowane podczas wgrywania nowej wersji....
Co to są za brednie? Watchdog reset nie powoduje wyjątku HardFault , tylko SYSRESETREQ (sygnal wewnetrzny resetujący procesor). Po raz setny napiszę, kiedy hardfault wystepuje najczęsciej: - zapis nieprawidlowego adresu (instrukcje STR,STRB,STRH,STREX,STM...) - niedozwolone kombinacje przy PSR - wykrzaczenie się stosu lub źle wyrównany stos - użycie...
A dla czego? Pamiętam, że jak kiedyś przygotowywałem strukturę która miała różnej wielkości zmienne (1, 2 i 4 bajtowe), to przy wysyłce struktury nie były ułożone dokładnie jedne za 2 gimi tylko miały wyrównanie do 32 bitów. Ale to może kwestia kompilatora. Robiłem to w uvision. Przy strukturach to co innego - tutaj argument __packed__ jest użyty po...
Witam Mam mały problem z odczytem ramu IS61LV25616AL, ram jako 16 bitowy 10ns, ustawienia Stm32F2 120Mhz Bank3 is enabled: BCR3_MBKEN bit set to ‘1’ Memory type is SRAM: BCR3_MTYP is set to ‘00’ to select the SRAM memory type Databus width is 16 bits: BCR3_MWID is set to ‘01’ to select the 16-bit width The memory...
Przecież ten wyświetlacz pozwala zapalić i zgasić dowolny pixel. Tylko, że ram X adresujesz co 8 bitów, czyli na raz operujesz 8 pikselami. Jeżeli wyświetlacz ma w X 400 pikseli, to adresy w ram są od 0 do 49. Nie musisz się też ograniczać do znaków o szerokości będącej wielokrotnością 8 bitów. Możesz rozważyć drukowanie znaków proporcjonalnych do...
wyrównanie stm32 przeniesienie adresów kolizja adresów
słuchawki grania bateria życie halogeny przód
pilot universalny instrukcja czujnik temperatury
Zalety dysków SATA vs ATA/PATA – przepustowość, hot-plug, NCQ, okablowanie Gigabyte GA-970A-UD3 v1.2 – wymuszenie startu z zapasowego BIOS, DualBIOS, recovery