Skocz do zawartości

kamdz

Użytkownicy
  • Zawartość

    132
  • Rejestracja

  • Ostatnio

  • Wygrane dni

    1

kamdz zajął 1. miejsce w rankingu.
Data osiągnięcia: 11 listopada 2018.

Treści użytkownika kamdz zdobyły tego dnia najwięcej polubień!

Informacje

  • Płeć
    Mężczyzna

Ostatnio na profilu byli

Blok z ostatnio odwiedzającymi jest wyłączony i nie jest wyświetlany innym użytkownikom.

Osiągnięcia użytkownika kamdz

Eksplorator

Eksplorator (8/19)

  • Za 100 postów
  • Za 5 postów
  • Za 25 postów
  • Młodszy roboty
  • To już rok!

Odznaki

8

Reputacja

  1. Witam. Zapomniałem dodać dwóch rzeczy. Zarówno bt, jak i sam kod jest przetestowany, wzięty z mojej poprzedniej konstrukcji: Tak naprawdę jedyna zmiana to płytka nucleo zamiast bluepill. Poza tym krzaki lecą nawet wtedy, kiedy w programie nie ma nic o wysyłaniu przez uart... Odpowiadając na Twoje pytanie, @Treker to w programie nie ma żadnych opcji ustawiania prędkości. Ale jak już mówiłem, na dokładnie takich samych ustawieniach wszystko działa w poprzednim robocie.
  2. Witam W ostatnim czasie podczas robienia kursu Forbota dot. STM32F1 HAL napotkałem pewien problem. Gdy podłączam płytkę pod USB do komputera i korzystam z UART przez kabel na RealTermie to wszystko działa ładnie. Natomiast gdy pod UART2 podpinam bluetooth, to nic nie działa. Na wyjściu dostaję krzaki, a sterowanie nie działa. Nie mam pojęcia dlaczego. To samo na UART3. Załączam kod, oraz zdjęcia układu i SS z wyjścia na BT Dodam, że to nie jest moje pierwsze podejście do tematu. Kiedyś uruchomiłem już BT na STM32, jednak wtedy używałem BluePill. Nie Było żadnych tego typu problemów. Ktoś ma może pomysł co mogę robić źle? Pozdrawiam Kamil #include "stm32f1xx.h" #include "stm32f1xx_nucleo.h" TIM_HandleTypeDef tim1; UART_HandleTypeDef uart; uint8_t value; int vel; void send_string(char* s) { HAL_UART_Transmit(&uart, (uint8_t*)s, strlen(s), 1000); } int __io_putchar(int ch) { send_char(ch); return ch; } void send_char(char c) { HAL_UART_Transmit(&uart, (uint8_t*)&c, 1, 1000); } void drive(int left, int right){ if(right>=0){ HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOC, GPIO_PIN_6, GPIO_PIN_RESET); __HAL_TIM_SET_COMPARE(&tim1, TIM_CHANNEL_2, right); send_string("1\r\n"); } else if(right<0){ HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOC, GPIO_PIN_6, GPIO_PIN_SET); __HAL_TIM_SET_COMPARE(&tim1, TIM_CHANNEL_2, -right); send_string("2\r\n"); } if(left>=0){ HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_RESET); __HAL_TIM_SET_COMPARE(&tim1, TIM_CHANNEL_1, left); send_string("3\r\n"); } else if(left<0){ HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_SET); __HAL_TIM_SET_COMPARE(&tim1, TIM_CHANNEL_1, -left); send_string("4\r\n"); } } int main(void) { SystemCoreClock = 8000000; // taktowanie 8Mhz HAL_Init(); __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOD_CLK_ENABLE(); __HAL_RCC_TIM1_CLK_ENABLE(); __HAL_RCC_USART2_CLK_ENABLE(); GPIO_InitTypeDef gpio; gpio.Mode = GPIO_MODE_AF_PP; gpio.Pin = GPIO_PIN_8|GPIO_PIN_9; gpio.Pull = GPIO_NOPULL; gpio.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOA, &gpio); gpio.Mode = GPIO_MODE_AF_PP; gpio.Pin = GPIO_PIN_2; gpio.Pull = GPIO_NOPULL; gpio.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, &gpio); gpio.Mode = GPIO_MODE_AF_INPUT; gpio.Pin = GPIO_PIN_3; HAL_GPIO_Init(GPIOA, &gpio); gpio.Mode = GPIO_MODE_AF_PP; gpio.Pin = GPIO_PIN_10; gpio.Pull = GPIO_NOPULL; gpio.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOC, &gpio); gpio.Mode = GPIO_MODE_AF_INPUT; gpio.Pin = GPIO_PIN_11; HAL_GPIO_Init(GPIOC, &gpio); gpio.Mode = GPIO_MODE_AF_PP; gpio.Pin = GPIO_PIN_10; gpio.Pull = GPIO_NOPULL; gpio.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOB, &gpio); gpio.Mode = GPIO_MODE_AF_INPUT; gpio.Pin = GPIO_PIN_11; HAL_GPIO_Init(GPIOB, &gpio); gpio.Pin = GPIO_PIN_5|GPIO_PIN_6; gpio.Mode = GPIO_MODE_OUTPUT_PP; // jako wyjście gpio.Pull = GPIO_NOPULL; // rezystory podciągające są wyłączone gpio.Speed = GPIO_SPEED_FREQ_LOW; // wystarczą nieskie częstotliwości przełączania HAL_GPIO_Init(GPIOC, &gpio); // inicjalizacja modułu GPIOC gpio.Pin = GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_5; HAL_GPIO_Init(GPIOA, &gpio); gpio.Pin = GPIO_PIN_2|GPIO_PIN_1; HAL_GPIO_Init(GPIOB, &gpio); gpio.Mode = GPIO_MODE_AF_PP; gpio.Pin = GPIO_PIN_10; gpio.Pull = GPIO_NOPULL; gpio.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOC, &gpio); gpio.Mode = GPIO_MODE_AF_INPUT; gpio.Pin = GPIO_PIN_11; HAL_GPIO_Init(GPIOC, &gpio); tim1.Instance = TIM1; tim1.Init.Period = 1000 - 1; tim1.Init.Prescaler = 1; tim1.Init.ClockDivision = 0; tim1.Init.CounterMode = TIM_COUNTERMODE_UP; tim1.Init.RepetitionCounter = 0; tim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; HAL_TIM_PWM_Init(&tim1); TIM_OC_InitTypeDef oc; oc.OCMode = TIM_OCMODE_PWM1; oc.Pulse = 0; oc.OCPolarity = TIM_OCPOLARITY_HIGH; oc.OCNPolarity = TIM_OCNPOLARITY_LOW; oc.OCFastMode = TIM_OCFAST_ENABLE; oc.OCIdleState = TIM_OCIDLESTATE_SET; oc.OCNIdleState = TIM_OCNIDLESTATE_RESET; HAL_TIM_PWM_ConfigChannel(&tim1, &oc, TIM_CHANNEL_1); HAL_TIM_PWM_ConfigChannel(&tim1, &oc, TIM_CHANNEL_2); HAL_TIM_PWM_Start(&tim1, TIM_CHANNEL_1); HAL_TIM_PWM_Start(&tim1, TIM_CHANNEL_2); uart.Instance = USART2; uart.Init.BaudRate = 115200; uart.Init.WordLength = UART_WORDLENGTH_8B; uart.Init.Parity = UART_PARITY_NONE; uart.Init.StopBits = UART_STOPBITS_1; uart.Init.HwFlowCtl = UART_HWCONTROL_NONE; uart.Init.OverSampling = UART_OVERSAMPLING_16; uart.Init.Mode = UART_MODE_TX_RX; HAL_UART_Init(&uart); while (1) { HAL_UART_Receive(&uart, &value, 1, 100); switch (value) { case '0': vel = 0; break; case '1': vel = 100; break; case '2': vel = 200; break; case '3': vel = 300; break; case '4': vel = 400; break; case '5': vel = 500; break; case '6': vel = 600; break; case '7': vel = 700; break; case '8': vel = 800; break; case '9': vel = 900; break; case '10': vel = 1000; break; case 'F': drive(vel, vel); break; case 'B': drive(-vel, -vel); break; case 'R': drive(vel,-vel); break; case 'L': drive(-vel,vel); break; case 'G': drive(0, vel); break; case 'I': drive(vel, 0); break; case 'H': drive(-vel, 0); break; case 'J': drive(0, -vel); break; case 'S': drive(0,0); break; case 'D': drive(0,0); break; case 'W': HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); break; case 'w': HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); break; } //send_string("Hello world!\r\n"); HAL_Delay(100); } }
  3. kamdz

    RetroBot

    Dalsze plany to skomplikowane 🙂 Po pierwsze chciałbym jednak dopracować trochę bardziej ten program bo szybkość jazdy przez której jeździ ładnie mnie średnio satysfakcjonuje. Na zawody napewno się będę wybierał, z tym że raczej nie po całej Polsce, pewnie się skończy na Robocompie bo mam blisko 😉 ale nie wiadomo może mi się uda naciągnąć szkołę na jakiś wyjazd na zawody 😉 A poza tym to jak na dniu otwartym dyrektor zobaczył jeździdełko to powiedział że dostanę jeszcze z tysiąc złotych i mam zrobić 2 roboty do wyścigów 🙂 tzn tam by były tylko 2 silniki i bt do sterowania. No i oczywiście zupełnie inna konstrukcja niż lf... Bardziej zwarta żeby były bardziej odporne na zderzenia 🙂 Bo to ma być dodatkowa atrakcja na następny dzień otwarty 🙂 A oprócz tego to nauczyciel od informatyki ma dla mnie jeszcze jakaś niezidentyfokowaną platformę za 2 tysiace, na której podobno jest podwozie gąsienicowe i jakieś ramię. Nie wiem dokładnie co to bo jeszcze tego nie dostałem do łapek 🙂 także mam do uruchomienia jeszcze 3 robociki z których można się spodziewać jakichś relacji itp 😉 Ale muszę to jakoś jeszcze rozłożyć w czasie żeby przy tym nie zawalić szkoly... 😞
  4. kamdz

    RetroBot

    Tzn to są w sumie filmy z takiego niby dnia otwartego. Dlatego jeździ po korytarzu no i dlatego jest dużo kurzu. Tutaj nie miały miejsce żadne modyfikacje parametrów poza zmniejszeniem prędkości - żeby nie wypadał z toru.
  5. kamdz

    RetroBot

    Właśnie on generalnie reaguje dużo bardziej żwawo niż na tych filmikach 🙂 tylko myślę że to wina kurzu... Przyspiesza jednym kołem ale kolonai3 poprostu ślizga i nie ma skrętu. Bo na porządnej czystej trasie reagował dużo lepiej.
  6. kamdz

    Akumulator i ładowarka

    Normalne kabelki do płytek stykowych. Pasują zarówno do JST(czyli tego czerwonego) Jak i do Goldpinów w Arduino.
  7. kamdz

    Akumulator i ładowarka

    Arduino ma swój własny moduł zasilania, więc wystarczy wpiąć pakiet w złącze Vin plusem i Gnd minusem. Tylko najlepiej przez to czerwone złącze, nie przez port balancera.
  8. kamdz

    Akumulator i ładowarka

    Witaj Pasują do siebie, ale kupno tej ładowarki to jeden z najgorszych pomysłów... Ładuje ona przez port balancera, co oznacza małe prądy ładowania. Poza tym ogranicza od 2 do 3 cel. Lepiej doinwestować i kupić mikroprocesorową ładowarkę, nawet taką jak ta: https://botland.com.pl/pl/ladowarki-lipol-sieciowe/646-ladowarka-li-pol-li-fe-li-ion-ni-cd-ni-mh-z-balanserem-redox-alpha-v2.html Sam taką posiadam i sprawuje się bardzo dobrze. Ma wybór trybów ładowania, prądu, funkcję rozładowywania, storage i wiele więcej. Co prawda trzeba do niej jeszcze kupić zasilacz, ale naprawdę warto. Dobra ładowarka przedłuży Ci żywotność pakietów jak i jest po prostu bezpieczniejsza. Pozdrawiam
  9. kamdz

    RetroBot

    Witam ponownie 🙂 Dzisiaj nowe testy w trudnych warunkach: Zielone, a nie białe podłoże, Mocno zakurzona podłoga:) Jakoś sobie radził: A po małym zmniejszeniu prędkości jeszcze lepiej: Program już po wstępnej regulacji PIDa i wag czujników. Pozdrawiam
  10. kamdz

    RetroBot

    Tak myślałem 🙂 No ale chyba robot inaczej reaguje na tą samą trasę z różnymi prędkościami... Czyli jak nawet go ustawię idealnie na małych prędkościach, to na większych już będzie miał większy bezwład i będzie zupełnie inaczej jeździł... Choć oczywiście na sam początek wstępnego ustawiania PIDa pewnie lepiej wolniej...
  11. kamdz

    RetroBot

    Witam ponownie. MDF kupione, trasa zrobiona i pierwsze testy za mną 🙂 Wrzucam filmik z testów. Co do trasy to wrzucam foto w załącznikach. W miejscu, w którym jest mniejsze czerwone kółko, trasa była pod takim kątem jak zielona linia. Wtedy robot w ogóle nie wykrywał, że ma zakręt i jechał prosto aż znowu złapał trasę. To trochę dziwne, bo w kodzie jest liczona średnia ze wszystkich czujników, więc powinien choć trochę odbić w lewo... W miejscu gdzie jest duże czerwone kółko... no to na filmie widać jak się zachowuje. To norma, czy błąd programu? może robię za ciasne zakręty na takiego dużego robota? Oczywiście PIDa nawet nie zacząłem jeszcze regulować, a prędkość mam zamiar zwiększać 🙂 to takie testowe przejazdy na razie. Liczę na opinie i sugestie jak można jeszcze usprawnić robota, co można poprawić 🙂
  12. kamdz

    Emulacja EEPROM w HAL. STM32 F1

    Okej zrobiłem nowy projekt, dokładnie taki jak od ST i działa. Jednak gdy w dokładnie tym samym programie zmieniłem strony na 2 ostatnie (żeby nie było problemów przy większych objętościach programów) to program utyka w jakimś infinite loop. write protection nie ma na żadnej stronie, sprawdzałem ST-LINK Utility Wrzucam jeszcze eeprom.h /** ****************************************************************************** * @file EEPROM_Emulation/inc/eeprom.h * @author MCD Application Team * @version V1.5.0 * @date 14-April-2017 * @brief This file contains all the functions prototypes for the EEPROM * emulation firmware library. ****************************************************************************** * @attention * * <h2><center>&copy; COPYRIGHT(c) 2016 STMicroelectronics</center></h2> * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. Neither the name of STMicroelectronics nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************** */ /* Define to prevent recursive inclusion -------------------------------------*/ #ifndef __EEPROM_H #define __EEPROM_H /* Includes ------------------------------------------------------------------*/ #include "stm32f1xx_hal.h" /* Exported constants --------------------------------------------------------*/ /* Base address of the Flash sectors */ #define ADDR_FLASH_PAGE_0 ((uint32_t)0x08000000) /* Base @ of Page 0, 1 Kbytes */ #define ADDR_FLASH_PAGE_1 ((uint32_t)0x08000400) /* Base @ of Page 1, 1 Kbytes */ #define ADDR_FLASH_PAGE_2 ((uint32_t)0x08000800) /* Base @ of Page 2, 1 Kbytes */ #define ADDR_FLASH_PAGE_3 ((uint32_t)0x08000C00) /* Base @ of Page 3, 1 Kbytes */ #define ADDR_FLASH_PAGE_4 ((uint32_t)0x08001000) /* Base @ of Page 4, 1 Kbytes */ #define ADDR_FLASH_PAGE_5 ((uint32_t)0x08001400) /* Base @ of Page 5, 1 Kbytes */ #define ADDR_FLASH_PAGE_6 ((uint32_t)0x08001800) /* Base @ of Page 6, 1 Kbytes */ #define ADDR_FLASH_PAGE_7 ((uint32_t)0x08001C00) /* Base @ of Page 7, 1 Kbytes */ #define ADDR_FLASH_PAGE_8 ((uint32_t)0x08002000) /* Base @ of Page 8, 1 Kbytes */ #define ADDR_FLASH_PAGE_9 ((uint32_t)0x08002400) /* Base @ of Page 9, 1 Kbytes */ #define ADDR_FLASH_PAGE_10 ((uint32_t)0x08002800) /* Base @ of Page 10, 1 Kbytes */ #define ADDR_FLASH_PAGE_11 ((uint32_t)0x08002C00) /* Base @ of Page 11, 1 Kbytes */ #define ADDR_FLASH_PAGE_12 ((uint32_t)0x08003000) /* Base @ of Page 12, 1 Kbytes */ #define ADDR_FLASH_PAGE_13 ((uint32_t)0x08003400) /* Base @ of Page 13, 1 Kbytes */ #define ADDR_FLASH_PAGE_14 ((uint32_t)0x08003800) /* Base @ of Page 14, 1 Kbytes */ #define ADDR_FLASH_PAGE_15 ((uint32_t)0x08003C00) /* Base @ of Page 15, 1 Kbytes */ #define ADDR_FLASH_PAGE_16 ((uint32_t)0x08004000) /* Base @ of Page 16, 1 Kbytes */ #define ADDR_FLASH_PAGE_17 ((uint32_t)0x08004400) /* Base @ of Page 17, 1 Kbytes */ #define ADDR_FLASH_PAGE_18 ((uint32_t)0x08004800) /* Base @ of Page 18, 1 Kbytes */ #define ADDR_FLASH_PAGE_19 ((uint32_t)0x08004C00) /* Base @ of Page 19, 1 Kbytes */ #define ADDR_FLASH_PAGE_20 ((uint32_t)0x08005000) /* Base @ of Page 20, 1 Kbytes */ #define ADDR_FLASH_PAGE_21 ((uint32_t)0x08005400) /* Base @ of Page 21, 1 Kbytes */ #define ADDR_FLASH_PAGE_22 ((uint32_t)0x08005800) /* Base @ of Page 22, 1 Kbytes */ #define ADDR_FLASH_PAGE_23 ((uint32_t)0x08005C00) /* Base @ of Page 23, 1 Kbytes */ #define ADDR_FLASH_PAGE_24 ((uint32_t)0x08006000) /* Base @ of Page 24, 1 Kbytes */ #define ADDR_FLASH_PAGE_25 ((uint32_t)0x08006400) /* Base @ of Page 25, 1 Kbytes */ #define ADDR_FLASH_PAGE_26 ((uint32_t)0x08006800) /* Base @ of Page 26, 1 Kbytes */ #define ADDR_FLASH_PAGE_27 ((uint32_t)0x08006C00) /* Base @ of Page 27, 1 Kbytes */ #define ADDR_FLASH_PAGE_28 ((uint32_t)0x08007000) /* Base @ of Page 28, 1 Kbytes */ #define ADDR_FLASH_PAGE_29 ((uint32_t)0x08007400) /* Base @ of Page 29, 1 Kbytes */ #define ADDR_FLASH_PAGE_30 ((uint32_t)0x08007800) /* Base @ of Page 30, 1 Kbytes */ #define ADDR_FLASH_PAGE_31 ((uint32_t)0x08007C00) /* Base @ of Page 31, 1 Kbytes */ #define ADDR_FLASH_PAGE_32 ((uint32_t)0x08008000) /* Base @ of Page 32, 1 Kbytes */ #define ADDR_FLASH_PAGE_33 ((uint32_t)0x08008400) /* Base @ of Page 33, 1 Kbytes */ #define ADDR_FLASH_PAGE_34 ((uint32_t)0x08008800) /* Base @ of Page 34, 1 Kbytes */ #define ADDR_FLASH_PAGE_35 ((uint32_t)0x08008C00) /* Base @ of Page 35, 1 Kbytes */ #define ADDR_FLASH_PAGE_36 ((uint32_t)0x08009000) /* Base @ of Page 36, 1 Kbytes */ #define ADDR_FLASH_PAGE_37 ((uint32_t)0x08009400) /* Base @ of Page 37, 1 Kbytes */ #define ADDR_FLASH_PAGE_38 ((uint32_t)0x08009800) /* Base @ of Page 38, 1 Kbytes */ #define ADDR_FLASH_PAGE_39 ((uint32_t)0x08009C00) /* Base @ of Page 39, 1 Kbytes */ #define ADDR_FLASH_PAGE_40 ((uint32_t)0x0800A000) /* Base @ of Page 40, 1 Kbytes */ #define ADDR_FLASH_PAGE_41 ((uint32_t)0x0800A400) /* Base @ of Page 41, 1 Kbytes */ #define ADDR_FLASH_PAGE_42 ((uint32_t)0x0800A800) /* Base @ of Page 42, 1 Kbytes */ #define ADDR_FLASH_PAGE_43 ((uint32_t)0x0800AC00) /* Base @ of Page 43, 1 Kbytes */ #define ADDR_FLASH_PAGE_44 ((uint32_t)0x0800B000) /* Base @ of Page 44, 1 Kbytes */ #define ADDR_FLASH_PAGE_45 ((uint32_t)0x0800B400) /* Base @ of Page 45, 1 Kbytes */ #define ADDR_FLASH_PAGE_46 ((uint32_t)0x0800B800) /* Base @ of Page 46, 1 Kbytes */ #define ADDR_FLASH_PAGE_47 ((uint32_t)0x0800BC00) /* Base @ of Page 47, 1 Kbytes */ #define ADDR_FLASH_PAGE_48 ((uint32_t)0x0800C000) /* Base @ of Page 48, 1 Kbytes */ #define ADDR_FLASH_PAGE_49 ((uint32_t)0x0800C400) /* Base @ of Page 49, 1 Kbytes */ #define ADDR_FLASH_PAGE_50 ((uint32_t)0x0800C800) /* Base @ of Page 50, 1 Kbytes */ #define ADDR_FLASH_PAGE_51 ((uint32_t)0x0800CC00) /* Base @ of Page 51, 1 Kbytes */ #define ADDR_FLASH_PAGE_52 ((uint32_t)0x0800D000) /* Base @ of Page 52, 1 Kbytes */ #define ADDR_FLASH_PAGE_53 ((uint32_t)0x0800D400) /* Base @ of Page 53, 1 Kbytes */ #define ADDR_FLASH_PAGE_54 ((uint32_t)0x0800D800) /* Base @ of Page 54, 1 Kbytes */ #define ADDR_FLASH_PAGE_55 ((uint32_t)0x0800DC00) /* Base @ of Page 55, 1 Kbytes */ #define ADDR_FLASH_PAGE_56 ((uint32_t)0x0800E000) /* Base @ of Page 56, 1 Kbytes */ #define ADDR_FLASH_PAGE_57 ((uint32_t)0x0800E400) /* Base @ of Page 57, 1 Kbytes */ #define ADDR_FLASH_PAGE_58 ((uint32_t)0x0800E800) /* Base @ of Page 58, 1 Kbytes */ #define ADDR_FLASH_PAGE_59 ((uint32_t)0x0800EC00) /* Base @ of Page 59, 1 Kbytes */ #define ADDR_FLASH_PAGE_60 ((uint32_t)0x0800F000) /* Base @ of Page 60, 1 Kbytes */ #define ADDR_FLASH_PAGE_61 ((uint32_t)0x0800F400) /* Base @ of Page 61, 1 Kbytes */ #define ADDR_FLASH_PAGE_62 ((uint32_t)0x0800F800) /* Base @ of Page 62, 1 Kbytes */ #define ADDR_FLASH_PAGE_63 ((uint32_t)0x0800FC00) /* Base @ of Page 63, 1 Kbytes */ #define ADDR_FLASH_PAGE_64 ((uint32_t)0x08010000) /* Base @ of Page 64, 1 Kbytes */ #define ADDR_FLASH_PAGE_65 ((uint32_t)0x08010400) /* Base @ of Page 65, 1 Kbytes */ #define ADDR_FLASH_PAGE_66 ((uint32_t)0x08010800) /* Base @ of Page 66, 1 Kbytes */ #define ADDR_FLASH_PAGE_67 ((uint32_t)0x08010C00) /* Base @ of Page 67, 1 Kbytes */ #define ADDR_FLASH_PAGE_68 ((uint32_t)0x08011000) /* Base @ of Page 68, 1 Kbytes */ #define ADDR_FLASH_PAGE_69 ((uint32_t)0x08011400) /* Base @ of Page 69, 1 Kbytes */ #define ADDR_FLASH_PAGE_70 ((uint32_t)0x08011800) /* Base @ of Page 70, 1 Kbytes */ #define ADDR_FLASH_PAGE_71 ((uint32_t)0x08011C00) /* Base @ of Page 71, 1 Kbytes */ #define ADDR_FLASH_PAGE_72 ((uint32_t)0x08012000) /* Base @ of Page 72, 1 Kbytes */ #define ADDR_FLASH_PAGE_73 ((uint32_t)0x08012400) /* Base @ of Page 73, 1 Kbytes */ #define ADDR_FLASH_PAGE_74 ((uint32_t)0x08012800) /* Base @ of Page 74, 1 Kbytes */ #define ADDR_FLASH_PAGE_75 ((uint32_t)0x08012C00) /* Base @ of Page 75, 1 Kbytes */ #define ADDR_FLASH_PAGE_76 ((uint32_t)0x08013000) /* Base @ of Page 76, 1 Kbytes */ #define ADDR_FLASH_PAGE_77 ((uint32_t)0x08013400) /* Base @ of Page 77, 1 Kbytes */ #define ADDR_FLASH_PAGE_78 ((uint32_t)0x08013800) /* Base @ of Page 78, 1 Kbytes */ #define ADDR_FLASH_PAGE_79 ((uint32_t)0x08013C00) /* Base @ of Page 79, 1 Kbytes */ #define ADDR_FLASH_PAGE_80 ((uint32_t)0x08014000) /* Base @ of Page 80, 1 Kbytes */ #define ADDR_FLASH_PAGE_81 ((uint32_t)0x08014400) /* Base @ of Page 81, 1 Kbytes */ #define ADDR_FLASH_PAGE_82 ((uint32_t)0x08014800) /* Base @ of Page 82, 1 Kbytes */ #define ADDR_FLASH_PAGE_83 ((uint32_t)0x08014C00) /* Base @ of Page 83, 1 Kbytes */ #define ADDR_FLASH_PAGE_84 ((uint32_t)0x08015000) /* Base @ of Page 84, 1 Kbytes */ #define ADDR_FLASH_PAGE_85 ((uint32_t)0x08015400) /* Base @ of Page 85, 1 Kbytes */ #define ADDR_FLASH_PAGE_86 ((uint32_t)0x08015800) /* Base @ of Page 86, 1 Kbytes */ #define ADDR_FLASH_PAGE_87 ((uint32_t)0x08015C00) /* Base @ of Page 87, 1 Kbytes */ #define ADDR_FLASH_PAGE_88 ((uint32_t)0x08016000) /* Base @ of Page 88, 1 Kbytes */ #define ADDR_FLASH_PAGE_89 ((uint32_t)0x08016400) /* Base @ of Page 89, 1 Kbytes */ #define ADDR_FLASH_PAGE_90 ((uint32_t)0x08016800) /* Base @ of Page 90, 1 Kbytes */ #define ADDR_FLASH_PAGE_91 ((uint32_t)0x08016C00) /* Base @ of Page 91, 1 Kbytes */ #define ADDR_FLASH_PAGE_92 ((uint32_t)0x08017000) /* Base @ of Page 92, 1 Kbytes */ #define ADDR_FLASH_PAGE_93 ((uint32_t)0x08017400) /* Base @ of Page 93, 1 Kbytes */ #define ADDR_FLASH_PAGE_94 ((uint32_t)0x08017800) /* Base @ of Page 94, 1 Kbytes */ #define ADDR_FLASH_PAGE_95 ((uint32_t)0x08017C00) /* Base @ of Page 95, 1 Kbytes */ #define ADDR_FLASH_PAGE_96 ((uint32_t)0x08018000) /* Base @ of Page 96, 1 Kbytes */ #define ADDR_FLASH_PAGE_97 ((uint32_t)0x08018400) /* Base @ of Page 97, 1 Kbytes */ #define ADDR_FLASH_PAGE_98 ((uint32_t)0x08018800) /* Base @ of Page 98, 1 Kbytes */ #define ADDR_FLASH_PAGE_99 ((uint32_t)0x08018C00) /* Base @ of Page 99, 1 Kbytes */ #define ADDR_FLASH_PAGE_100 ((uint32_t)0x08019000) /* Base @ of Page 100, 1 Kbytes */ #define ADDR_FLASH_PAGE_101 ((uint32_t)0x08019400) /* Base @ of Page 101, 1 Kbytes */ #define ADDR_FLASH_PAGE_102 ((uint32_t)0x08019800) /* Base @ of Page 102, 1 Kbytes */ #define ADDR_FLASH_PAGE_103 ((uint32_t)0x08019C00) /* Base @ of Page 103, 1 Kbytes */ #define ADDR_FLASH_PAGE_104 ((uint32_t)0x0801A000) /* Base @ of Page 104, 1 Kbytes */ #define ADDR_FLASH_PAGE_105 ((uint32_t)0x0801A400) /* Base @ of Page 105, 1 Kbytes */ #define ADDR_FLASH_PAGE_106 ((uint32_t)0x0801A800) /* Base @ of Page 106, 1 Kbytes */ #define ADDR_FLASH_PAGE_107 ((uint32_t)0x0801AC00) /* Base @ of Page 107, 1 Kbytes */ #define ADDR_FLASH_PAGE_108 ((uint32_t)0x0801B000) /* Base @ of Page 108, 1 Kbytes */ #define ADDR_FLASH_PAGE_109 ((uint32_t)0x0801B400) /* Base @ of Page 109, 1 Kbytes */ #define ADDR_FLASH_PAGE_110 ((uint32_t)0x0801B800) /* Base @ of Page 110, 1 Kbytes */ #define ADDR_FLASH_PAGE_111 ((uint32_t)0x0801BC00) /* Base @ of Page 111, 1 Kbytes */ #define ADDR_FLASH_PAGE_112 ((uint32_t)0x0801C000) /* Base @ of Page 112, 1 Kbytes */ #define ADDR_FLASH_PAGE_113 ((uint32_t)0x0801C400) /* Base @ of Page 113, 1 Kbytes */ #define ADDR_FLASH_PAGE_114 ((uint32_t)0x0801C800) /* Base @ of Page 114, 1 Kbytes */ #define ADDR_FLASH_PAGE_115 ((uint32_t)0x0801CC00) /* Base @ of Page 115, 1 Kbytes */ #define ADDR_FLASH_PAGE_116 ((uint32_t)0x0801D000) /* Base @ of Page 116, 1 Kbytes */ #define ADDR_FLASH_PAGE_117 ((uint32_t)0x0801D400) /* Base @ of Page 117, 1 Kbytes */ #define ADDR_FLASH_PAGE_118 ((uint32_t)0x0801D800) /* Base @ of Page 118, 1 Kbytes */ #define ADDR_FLASH_PAGE_119 ((uint32_t)0x0801DC00) /* Base @ of Page 119, 1 Kbytes */ #define ADDR_FLASH_PAGE_120 ((uint32_t)0x0801E000) /* Base @ of Page 120, 1 Kbytes */ #define ADDR_FLASH_PAGE_121 ((uint32_t)0x0801E400) /* Base @ of Page 121, 1 Kbytes */ #define ADDR_FLASH_PAGE_122 ((uint32_t)0x0801E800) /* Base @ of Page 122, 1 Kbytes */ #define ADDR_FLASH_PAGE_123 ((uint32_t)0x0801EC00) /* Base @ of Page 123, 1 Kbytes */ #define ADDR_FLASH_PAGE_124 ((uint32_t)0x0801F000) /* Base @ of Page 124, 1 Kbytes */ #define ADDR_FLASH_PAGE_125 ((uint32_t)0x0801F400) /* Base @ of Page 125, 1 Kbytes */ #define ADDR_FLASH_PAGE_126 ((uint32_t)0x0801F800) /* Base @ of Page 126, 1 Kbytes */ #define ADDR_FLASH_PAGE_127 ((uint32_t)0x0801FC00) /* Base @ of Page 127, 1 Kbytes */ /* Define the size of the sectors to be used */ #define PAGE_SIZE (uint32_t)FLASH_PAGE_SIZE /* Page size */ /* EEPROM start address in Flash */ #define EEPROM_START_ADDRESS ((uint32_t)ADDR_FLASH_PAGE_126) /* EEPROM emulation start address */ /* Pages 0 and 1 base and end addresses */ #define PAGE0_BASE_ADDRESS ((uint32_t)(EEPROM_START_ADDRESS + 0x0000)) #define PAGE0_END_ADDRESS ((uint32_t)(EEPROM_START_ADDRESS + (PAGE_SIZE - 1))) #define PAGE0_ID ADDR_FLASH_PAGE_126 #define PAGE1_BASE_ADDRESS ((uint32_t)(EEPROM_START_ADDRESS + 0x400)) #define PAGE1_END_ADDRESS ((uint32_t)(EEPROM_START_ADDRESS + 0x400 + PAGE_SIZE - 1)) #define PAGE1_ID ADDR_FLASH_PAGE_127 /* Used Flash pages for EEPROM emulation */ #define PAGE0 ((uint16_t)0x0000) #define PAGE1 ((uint16_t)0x0040) /* No valid page define */ #define NO_VALID_PAGE ((uint16_t)0x00AB) /* Page status definitions */ #define ERASED ((uint16_t)0xFFFF) /* Page is empty */ #define RECEIVE_DATA ((uint16_t)0xEEEE) /* Page is marked to receive data */ #define VALID_PAGE ((uint16_t)0x0000) /* Page containing valid data */ /* Valid pages in read and write defines */ #define READ_FROM_VALID_PAGE ((uint8_t)0x00) #define WRITE_IN_VALID_PAGE ((uint8_t)0x01) /* Page full define */ #define PAGE_FULL ((uint8_t)0x80) /* Variables' number */ #define NB_OF_VAR ((uint8_t)0x03) /* Exported types ------------------------------------------------------------*/ /* Exported macro ------------------------------------------------------------*/ /* Exported functions ------------------------------------------------------- */ uint16_t EE_Init(void); uint16_t EE_ReadVariable(uint16_t VirtAddress, uint16_t* Data); uint16_t EE_WriteVariable(uint16_t VirtAddress, uint16_t Data); #endif /* __EEPROM_H */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ Po powrocie do starych stron działa, no ale jednak chciałbym na tych większych, żeby móc wgrać większy program. Co ciekawe nawet jak dałem strony 62 i 126 żeby zachować ten odstęp 0x10000 to działało. a jak daję 2 sąsiednie strony i odstęp 0x400 (tak liczy kalkulator) to Infinite Loop...
  13. kamdz

    Emulacja EEPROM w HAL. STM32 F1

    Strona jest tak jak w przykładzie 32 i 96
  14. kamdz

    Emulacja EEPROM w HAL. STM32 F1

    /** ****************************************************************************** * @file EEPROM_Emulation/Src/main.c * @author MCD Application Team * @version V1.5.0 * @date 14-April-2017 * @brief Main program body ****************************************************************************** * @attention * * <h2><center>&copy; COPYRIGHT(c) 2016 STMicroelectronics</center></h2> * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. Neither the name of STMicroelectronics nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************** */ /* Includes ------------------------------------------------------------------*/ #include "eeprom.h" /** @addtogroup STM32F1xx_HAL_Applications * @{ */ /** @addtogroup EEPROM_Emulation * @{ */ /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ /* Private macro -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ /* Virtual address defined by the user: 0xFFFF value is prohibited */ uint16_t VirtAddVarTab[NB_OF_VAR] = {0x5555, 0x6666, 0x7777}; uint16_t VarDataTab[NB_OF_VAR] = {0, 0, 0}; uint16_t VarValue = 0; /* Private function prototypes -----------------------------------------------*/ static void SystemClock_Config(void); /* Private functions ---------------------------------------------------------*/ /** * @brief Main program. * @param None * @retval None */ int main(void) { /* STM32F103xB HAL library initialization: - Configure the Flash prefetch - Systick timer is configured by default as source of time base, but user can eventually implement his proper time base source (a general purpose timer for example or other time source), keeping in mind that Time base duration should be kept 1ms since PPP_TIMEOUT_VALUEs are defined and handled in milliseconds basis. - Set NVIC Group Priority to 4 - Low Level Initialization */ HAL_Init(); /* Configure the system clock to 64 MHz */ SystemClock_Config(); /* Unlock the Flash Program Erase controller */ HAL_FLASH_Unlock(); /* EEPROM Init */ EE_Init(); /* --- Store successively many values of the three variables in the EEPROM ---*/ /* Store 0x1000 values of Variable1 in EEPROM */ for (VarValue = 1; VarValue <= 0x1000; VarValue++) { EE_WriteVariable(VirtAddVarTab[0], VarValue); } /* read the last stored variables data*/ EE_ReadVariable(VirtAddVarTab[0], &VarDataTab[0]); /* Store 0x2000 values of Variable2 in EEPROM */ for (VarValue = 1; VarValue <= 0x2000; VarValue++) { EE_WriteVariable(VirtAddVarTab[1], VarValue); } /* read the last stored variables data*/ EE_ReadVariable(VirtAddVarTab[0], &VarDataTab[0]); EE_ReadVariable(VirtAddVarTab[1], &VarDataTab[1]); /* Store 0x3000 values of Variable3 in EEPROM */ for (VarValue = 1; VarValue <= 0x3000; VarValue++) { EE_WriteVariable(VirtAddVarTab[2], VarValue); } /* read the last stored variables data*/ EE_ReadVariable(VirtAddVarTab[0], &VarDataTab[0]); EE_ReadVariable(VirtAddVarTab[1], &VarDataTab[1]); EE_ReadVariable(VirtAddVarTab[2], &VarDataTab[2]); while (1) { }; } /** * @brief System Clock Configuration * The system Clock is configured as follow : * System Clock source = PLL (HSI) * SYSCLK(Hz) = 64000000 * HCLK(Hz) = 64000000 * AHB Prescaler = 1 * APB1 Prescaler = 2 * APB2 Prescaler = 1 * PLLMUL = 16 * Flash Latency(WS) = 2 * @param None * @retval None */ void SystemClock_Config(void) { RCC_ClkInitTypeDef clkinitstruct = {0}; RCC_OscInitTypeDef oscinitstruct = {0}; /* Configure PLL ------------------------------------------------------*/ /* PLL configuration: PLLCLK = (HSI / 2) * PLLMUL = (8 / 2) * 16 = 64 MHz */ /* PREDIV1 configuration: PREDIV1CLK = PLLCLK / HSEPredivValue = 64 / 1 = 64 MHz */ /* Enable HSI and activate PLL with HSi_DIV2 as source */ oscinitstruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; oscinitstruct.HSEState = RCC_HSE_OFF; oscinitstruct.LSEState = RCC_LSE_OFF; oscinitstruct.HSIState = RCC_HSI_ON; oscinitstruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; oscinitstruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1; oscinitstruct.PLL.PLLState = RCC_PLL_ON; oscinitstruct.PLL.PLLSource = RCC_PLLSOURCE_HSI_DIV2; oscinitstruct.PLL.PLLMUL = RCC_PLL_MUL16; if (HAL_RCC_OscConfig(&oscinitstruct)!= HAL_OK) { /* Initialization Error */ while(1); } /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 clocks dividers */ clkinitstruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2); clkinitstruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; clkinitstruct.AHBCLKDivider = RCC_SYSCLK_DIV1; clkinitstruct.APB2CLKDivider = RCC_HCLK_DIV1; clkinitstruct.APB1CLKDivider = RCC_HCLK_DIV2; if (HAL_RCC_ClockConfig(&clkinitstruct, FLASH_LATENCY_2)!= HAL_OK) { /* Initialization Error */ while(1); } } #ifdef USE_FULL_ASSERT /** * @brief Reports the name of the source file and the source line number * where the assert_param error has occurred. * @param file: pointer to the source file name * @param line: assert_param error line source number * @retval None */ void assert_failed(uint8_t *file, uint32_t line) { /* User can add his own implementation to report the file name and line number, ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ /* Infinite loop */ while (1) { } } #endif /** * @} */ /** * @} */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ Ten kod (czyli ten od ST) zadziałał... po zrobieniu tajemniczej funkcji Full Chip Erase i wgraniu programu jeszcze raz 😉 Potem próbowałem dodać do tego UART i Program łapał Hard Fault A jak teraz z powrotem próbuję debugować ten program co wyżej to dostaję Error in final launch sequence... Ten temat to jednak jest dla mnie chyba nie do pojęcia.
  15. kamdz

    Emulacja EEPROM w HAL. STM32 F1

    Tak i pisałęm o tym w pierwszym poście 🙂 No to właśnie chciałem sprawdzić wysyłając dane na UART ST by miał dać kod z błędem? dziwne ale OK, spróbuję przeczytać i zrozumieć ten dokument 😉
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.