Skocz do zawartości

MR1979

Użytkownicy
  • Zawartość

    5
  • Rejestracja

  • Ostatnio

Reputacja

6 Neutralna

O MR1979

  • Ranga
    2/10

Informacje

  • Płeć
    Mężczyzna
  • Lokalizacja
    Gdynia
  1. Dzięki! Jak tylko wymyślę jak sterować głośnikiem (obsługa DAC) to dodam loop z Dr Dre - "The Next Episode" do zwycięskiej planszy Przy kodowaniu PCM 8bit/8kHz dla 5s wyjdzie jakieś dodatkowe 40kB.
  2. Mając wyświetlacz od starej dobrej Nokii musiałem napisać grę w węże Poniżej rezultat:
  3. W zadaniu gdzie kopiowane są dane z pamięci do pamięci można jeszcze przyspieszyć cały proces 4-krotnie przez kopiowanie bloków po 4 bajty jednocześnie (DMA_PDATAALIGN_WORD zamiast DMA_PDATAALIGN_BYTE). Trzeba tylko pamiętać żeby zmieną BUFFER_SIZE podzielić przez 4 (przesunąć logicznie o 2 bity w prawo). Fragmenty kodu przed zmianą: void copy_dma() { HAL_DMA_Start(&dma, (uint32_t)src_buffer, (uint32_t)dst_buffer, BUFFER_SIZE); HAL_DMA_PollForTransfer(&dma, HAL_DMA_FULL_TRANSFER, HAL_MAX_DELAY); } dma.Instance = DMA1_Channel1; dma.Init.Direction = DMA_MEMORY_TO_MEMORY; dma.Init.PeriphInc = DMA_PINC_ENABLE; dma.Init.MemInc = DMA_MINC_ENABLE; dma.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; dma.Init.MemDataAlignment = DMA_PDATAALIGN_BYTE; dma.Init.Mode = DMA_NORMAL; dma.Init.Priority = DMA_PRIORITY_HIGH; HAL_DMA_Init(&dma); Fragmenty kodu po zmianie: void copy_DMA(void) { HAL_DMA_Start(&dma, (uint32_t)src_buffer, (uint32_t)dst_buffer, (BUFFER_SIZE >> 2)); HAL_DMA_PollForTransfer(&dma, HAL_DMA_FULL_TRANSFER, HAL_MAX_DELAY); } dma.Instance = DMA1_Channel1; dma.Init.Mode = DMA_NORMAL; dma.Init.Direction = DMA_MEMORY_TO_MEMORY; dma.Init.MemDataAlignment = DMA_MDATAALIGN_WORD; dma.Init.MemInc = DMA_MINC_ENABLE; dma.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD; dma.Init.PeriphInc = DMA_PINC_ENABLE; dma.Init.Priority = DMA_PRIORITY_HIGH; HAL_DMA_Init(&dma); Mam nadzieję że komuś się ta informacja przyda. Pozdrawiam
  4. Zamiast pisać: void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_5) == GPIO_PIN_RESET) HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); else HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); } Można napisać: void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); } Zrobiłem też mały eksperyment i postanowiłem sprawdzić jaka jest największa częstotliwość wywołania przerwania TIM2_IRQHandler. Okazuje się że nie za duża (też zależy do jakich zastosowań). Przy taktowaniu 64MHz udało mi się uzyskać stabilne 90kHz (czyli przerwanie wywoływane z częstotliwością 180kHz bo na pełen okres w przebiegu prostokątnym potrzeba dwóch wywołań) Dalsze zmniejszanie wartości Init.Prescaller lub Init.Period powodowało że układ oscylował z częstotliwością około 98KHz i wartość ta nie korespondowała z teoretyczną wartością wyliczoną dla zadanej konfiguracji Prescaller/Period. W przypadku sprzętowego PWM można podkręcić timer nawet do 4MHz (dla 64MHz zegara). Nawet przy tak dużej częstotliwości otrzymamy w miarę regularny sygnał prostokątny. Na oscyloskopie jednak widać już dość znaczący wpływ "signal overshoot" na poziomie 0.7V. Do większości zastosowań wystarczy jednak PWM o częstotliwości rzędu kHz. Pozdrawiam
  5. Witam, Również miałem podobny odczyt ADC=65. Debugger pokazał że nie udało się zainicjować przetwornika (HAL_ADC_Init(&adc); zwracał wartość HAL_ERROR). Sprawdziłem kod źródłowy, a nawet zrobiłem copy/paste ze strony kursu. Wciąż ten sam rezultat. Ostatecznie wygenerowałem kod inicjacji przetwornika z CubeMX i niespodzianka... wszystkie parametry zainicjowane w taki sam sposób. Była jednak mała różnica która rzuciła się w oczy. Otóż w kodzie generowanym przez CubeMX wszystkie zmienne konfiguracyjne (np ADC_HandleTypeDef) są zerowane podczas deklaracji. Dodanie "= {0}" do deklaracji ADC_HandleTypeDef rozwiązało problem. Wygląda na to że przy deklaracji zmiennej wcale nie ma gwarancji że wszystkie jej wartości będą wynosić 0. Warto więc o to zadbać. Poza tym bardzo fajny kurs. Pozdrawiam, Marek.
×
×
  • Utwórz nowe...