Skocz do zawartości

STM32F302r8 Timer1 encoder mode jak ustawić?


Pomocna odpowiedź

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.

Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • 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.