
KrzyMr
-
Zawartość
7 -
Rejestracja
-
Ostatnio
Posty napisane przez KrzyMr
-
-
Tak wiem czytam właśnie ten poradnik ale używa tam F103 i wykorzystuje przerwania od przepełnienia, a ja chce po prostu odczytywać wartość licznika.
-
Witam.
Od 3 dni walczę z uruchomieniem encoder mode na timerze1 lub 2, wszystko ustawione tak jak RM.
Dla pewności robiłe obsługę encodera na jednym przerwaniu na pinie PC0 i działał w miarę ok. Ale chce uzyskać taki efekt na timerze.
Oto aktualny kod:
#include "stm32f3xx.h" #include "main.h" void GPIO_Init(void); void Make_buffor(void); uint32_t Segmenty[8] = {SA, SB, SC, SD, SE, SF, SG, Sdp}; uint32_t Wyswietlacz[4] = {C1, C2, C3, C4}; uint32_t Liczby[10] = {L0, L1, L2, L3, L4, L5, L6, L7, L8, L9}; uint8_t wyswietlana_liczba = 0; uint32_t liczba = 10; uint16_t bufor_do_wyswietlenia[4]; int main(void){ RCC -> AHBENR = RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOCEN | RCC_AHBENR_GPIOBEN; RCC -> APB2ENR = RCC_APB2ENR_SYSCFGEN | RCC_APB2ENR_TIM1EN; __DSB(); GPIO_Init(); TIM1 -> ARR = 100; TIM1 -> CCMR1 |= (TIM_CCMR1_CC1S_0 | TIM_CCMR1_CC2S_0); TIM1 -> CCER &= ~(TIM_CCER_CC1P | TIM_CCER_CC2P); TIM1 -> SMCR |= TIM_SMCR_SMS_1 | TIM_SMCR_SMS_0; TIM1 -> CR1 |= TIM_CR1_CEN; //TIM1 -> CNT = 26; //SYSCFG -> EXTICR[0] = 0x2; //EXTI -> FTSR |= EXTI_FTSR_TR0; //EXTI -> IMR |= EXTI_IMR_MR0; //NVIC_EnableIRQ(EXTI0_IRQn); SysTick_Config(4000); while(1){ } } void GPIO_Init(void){ GPIOB -> MODER = MODE_SA | MODE_SB | MODE_SC | MODE_SD | MODE_SE | MODE_SF | MODE_SG | MODE_Sdp; GPIOC -> MODER = MODE_C1 | MODE_C2 | MODE_C3 | MODE_C4; //GPIOC -> PUPDR |= GPIO_MODER_MODER0_0 | GPIO_MODER_MODER1_0; //GPIOC -> AFR[0] |= GPIO_AFRL_AFRL0 | GPIO_AFRL_AFRL1; } void SysTick_Handler(void){ liczba = TIM1 -> CNT; Make_buffor(); GPIOB -> ODR &= ~ALL; GPIOC -> ODR = Wyswietlacz[wyswietlana_liczba]; GPIOB -> ODR = Liczby[bufor_do_wyswietlenia[wyswietlana_liczba]]; wyswietlana_liczba ++; if(wyswietlana_liczba > 3) wyswietlana_liczba = 0; } /* void EXTI0_IRQHandler(void){ EXTI -> PR = EXTI_PR_PR0; if(!(GPIOC -> IDR & GPIO_IDR_1)){ liczba ++; if(liczba > 9999) liczba = 0; } else if(GPIOC -> IDR & GPIO_IDR_1){ liczba --; if(liczba <= 0) liczba = 9999; } Make_buffor(); } */ void Make_buffor(void){ if(liczba < 10){ bufor_do_wyswietlenia[0] = 0; bufor_do_wyswietlenia[1] = 0; bufor_do_wyswietlenia[2] = 0; bufor_do_wyswietlenia[3] = liczba % 10; } else if(liczba < 100){ bufor_do_wyswietlenia[0] = 0; bufor_do_wyswietlenia[1] = 0; bufor_do_wyswietlenia[2] = liczba / 10; bufor_do_wyswietlenia[3] = liczba % 10; } else if(liczba < 1000){ bufor_do_wyswietlenia[0] = 0; bufor_do_wyswietlenia[1] = liczba / 100; bufor_do_wyswietlenia[2] = (liczba % 100) / 10; bufor_do_wyswietlenia[3] = liczba % 10; } else if(liczba <= 9999){ bufor_do_wyswietlenia[0] = liczba / 1000; bufor_do_wyswietlenia[1] = (liczba % 1000) / 100; bufor_do_wyswietlenia[2] = (liczba % 100) / 10; bufor_do_wyswietlenia[3] = liczba % 10; } }
Podłączony mam też wyświetlacz 7 segmentowy. Nie jestem pewien jak ustawić piny, w // jest to czego próbowałem.
Jakieś pomysły co jest źle, albo czego brakuje?
Enkoder jest podpięty do masy, +3,3v i kanały odpowiednio do PC0 i PC1.
-
Problem w sumie rozwiązany, w VSCode można też użyć wtyczki PlatformIO do programowania STM na frameworku STM32Cube ale nie ma żadnych plików main trzeba je sobie samemu zrobić.
-
Witam.
Programowałem trochę avr, ale przesiadałem się na stm32, avr programowałem w VS Code i lubię to środowisko.
Moje pytanie to czy ktoś programuje stm32 w ty środowisku, albo umie je skonfigurować tak żeby można było budować i wgrywać program? Wiem że jest wtyczka do tego ale nie potrafię jej używać. Otwieram folder z projektem wygenerowanym z CubeMX i kiedy daje "buduj" to wychodzą błędu ze brakuje jakiegoś Patha, kiedy dodam wszystko i klikam "buduj" to kompletnie nic się nie dzieję. I jeszcze w programie podkreślone są linijki tak jakby nie wykrywało biblioteki.
Ktoś potrafi pomoc, bo w internetach nic konkretnego nie znalazłem co by działało i było zrozumiałe.
-
po zamianie na __flash wyrzuca mi błędy "oczekiwano na znaku ";"" dla wszystkich 3 linijek
const __flash char T1[] = "DS1307"; const __flash char T2[] = "TESTER"; const __flash char * const __flash menu[2] = {T1, T2};
dlaczego? nawet po skopiowaniu linijki ze strony tak jest.
-
Witam próbuje zrobić proste menu ale zajmuje za dużo pamięci SRAM, dlatego postanowiłem umieścić je w pamięci FLSAH mikrokontroler,
niestety nie dział to poprawnie mianowicie nie wyświetla nic albo po kolei wszystkie znaki (krzaki) bez przerwy.
kod :
const char T1[] PROGMEM = {"DS1307"}; const char T2[] PROGMEM = {"TESTER"}; const char * menu[2] PROGMEM = {T1, T2}; //odczytuje za pomocą: LCD_Write_Text((char *) pgm_read_word_near(& menu[1])); // funkcja wyświetlania bo może tu jest problem void LCD_Write_Text(uint8_t * Text){ while(* Text) Send_Data(* Text++); }
dodam że po skasowaniu wszystkich "PROGMEM", a do funkcji wyświetlania wpisania po prostu "menu[0]" działa bez zarzutu.
i jeszcze podkreśla mi "pgm........" i wyskakuje problem "nieznana nazwa rejestru r0".
Gdzie popełniam błąd.
Z góry dzięki za odpowiedz.
NUCLEO [STM32F302R8] Jak ustawić Piny USART2 jako zwykłe GPIO?
w Mikrokontrolery
Napisano
Witam
Pewnie banalne pytanie ale nie mam pojęcia jak to zrobić.
Mianowicie potrzebuje ustawić piny USART2 czyli PA2 i PA3 jako zwykłe wyjścia, ustawiam to w CubeMx, w programie pisze żeby zmieniała stan co 500ms, dla kontroli robię to samo dla wbudowanej diodzie na płytce, oczywiście do PA2 też podłączam diode led, i tutaj jest koniec ponieważ dioda nie miga.
Co mam zrobić jeszcze żeby to ustawić tak jak ma być?