Szukam kogoś kto odpowie mi na pytania odnośnie kodów podobnych do tego który wstawiam. Generalnie chodzi o opisanie jak działają timery na podstawie prostych i krótkich programów.
Zainteresowanych proszę o wiadomość na PW.
Kod:
void main(void){
clock_config();
GLCD_Initialize(); //GLCD to wyswietlacz
RCC->AHB1ENR |= ((1<<0) | (1<<6)); // wlacz zegar dla GPIO A i G
//TIMER krok 1.
RCC->APB1ENR |= (1<<0); // wlacz zegar dla TIM2
GPIOG->MODER |= (1<<(2*13)) | (1<<(2*14)); // linie G13 i G14 jako wyjscia
GPIOA->MODER |= (2<<2*0); // linia A0 - ALTERNATE FUNCTION AF1 TIM2 CH1
GPIOA->AFR[0] |= (1<<4*0);
//Adding an interrupt involves configuring the NVIC (Nested Vectored Interrupt Controller).
//different flags are used to trigger and clear an interrupt
NVIC->ISER[0] |= ((1<<28)); // wlacz przerwanie dla TIM2 //enable interrupts
//zlicza do góry od 0 do wpisanej wartosci dlatego jest 7999 a nie 8000
//prescaler - dzelnik zegara wejsciowego
// 16-bitowy rejestr umozliwiajacy podzielenie czestotliwosci taktowania licznika przez wartosc od 1 do 65536
TIM2->PSC = 7999; // preskaler TIM2 = wpisana wartosc+1
//TIM2->ARR = 65535; // wykorzystaj pelna pojemnosc licznika /// moze zliczac w takim zakresie
TIM2->CCMR1 |= 1; // CC1S = 01 - Capture Compare ch. 1 jako wejscie, linia T1
TIM2->SMCR |= 5<<4 | 4; // bity SMS=100 - Slave Reset Mode
// bity TS =101 - Trigger Selection - Timer Input 1
TIM2->CCER |= ((0<<3) | (0<<1) | (1<<0)); // reakcja na zbocze rosnace
// CC1E=1 - Capture Enabled, ch. 1
TIM2->DIER |= (1<<1); // CC1IE - wlacz przerwanie dla Capture ch. 1
TIM2->CR1 |= 1; // wlacz licznik
//cos do wyswietlacza
GLCD_Clear(White);
GLCD_SetBackColor(White);
GLCD_SetTextColor(Black);
// ==
licznik=0;
pomiar=0;
for(;;) {
if (pomiar) GLCD_DisplayString(1, 0, __FI,"Pomiar! ");
else {
sprintf(tekst,"Licznik :D = %u",licznik);
GLCD_DisplayString(1, 0, __FI,tekst);
}
}
}
//obsluga przerwania
void TIM2_IRQHandler(void)
{
licznik=TIM2->CCR1;
GPIOG->ODR ^=(1<<13); //rejestr danych wychodzacych
TIM2->CCER ^= (1<<1); //zmien reakcje na zbocze rosnace<->opadajace
pomiar = ~pomiar;
}
void clock_config(void)
{
//wybor oscylatora
RCC->CR &= ~(1<<0); //HSI OFF
RCC->CR |= (1<<16); //HSE ON
while (!(RCC->CR & 1<<17)); //czekaj az sie HSE ustabilizuje
//konfiguracja PLL: fout = (fin/M)*(N/P)
RCC->PLLCFGR &= 0xF0BC0000; //zostaw tylko bity reserved, reszta 0
RCC->PLLCFGR |= 8; //M (2-63)
RCC->PLLCFGR |= 256<<6; //N (192-432) Mhz
RCC->PLLCFGR |= 0<<16; //P 0=/2 1=/4 2=/6 3=/8 //indeks ktory odpowiada dzielnikowi
//RCC->PLLCFGR |= 2<<24; //Q (2-15) USB SDIO random number generator
RCC->PLLCFGR |= 1<<22; //wejscie PLL 1=HSE, 0=HSI
RCC->CR |= 1<<24; // 1 - PLL ON, 0 - PLL OFF
while (!(RCC->CR & 1<<25)); //czekaj az PLL sie zatrzasine
RCC->CFGR |= 2; //0 - HSI, 1 - HSE, 2 - PLL jako SYSCLK
RCC->CFGR |= 8<<4; //AHB PRESCALER 8 - /2, 9 - /4 ,10 - /8 ...
RCC->CFGR |= 7<<10; //APB1 PRESCALER LOW SPEED 4 - /2, 5- /4, 6 - /8, 7 - /16
RCC->CFGR |= 0<<13; //APB2 PRESCALER HI SPEED
}