#include "stm32f10x.h" uint32_t counter,cc_register; uint16_t duty_tab[8]={10,100,250,500,750,10,900,500}; int main () { //--- RCC - Reset Clock Control RCC->APB2ENR |= (1<<2) | (1<<0); //wlacz sygnal zegarowy GPIOA i AFIO RCC->APB1ENR |= (1<<1) | (1<<0); //wlacz sygnal zegarowy timer TIM2 i TIM3 //--- 1 wlacz DMA1 RCC->AHBENR |= (1 << 0); //--- konfiguracja portu A //linia A6 - alternate function output push-pull GPIOA->CRL &= ~(15<<24); GPIOA->CRL |= (1<<24); GPIOA->CRL |= (2<<26); // taktowanie timerow - 9 MHz //--- konfiguracja timera TIM2 - inicjowanie transferow DMA co 0.5 sekundy TIM2->PSC = 8999; // preskaler TIM2->ARR = 499; // pojemnosc licznika (Auto Reload) TIM2->DIER |= 1<<8; // DMA/IRQ Enable Register - enable update DMA request TIM2->CR1 |= 1; // wlacz timer TIM2 //--- konfiguracja timera TIM3 - generowanie fali prostokatnej + Pulse Width Modulation (PWM) TIM3->PSC = 899; TIM3->ARR = 999; TIM3->CCMR1 |= (6<<4); // bity 6:4 PWM mode 1 TIM3->CCER |= (0<<1)|(1<<0); // wlacz kanal 1, ustaw polaryzacje wyjscia TIM3->CR1 |= 1; // wlacz timer TIM3 //--- konfiguracja DMA Direct Memory Access //--- 2 - ustaw w CCR bity: // 4 - kierunek przeplywu danych DMA1_Channel2->CCR |= 1<<4; // 5 - wlacz tryb pierscieniowy DMA1_Channel2->CCR |= 1<<5; // 7 - modyfikuj wskaznik adresu w pamieci DMA1_Channel2->CCR |= 1<<7; // 11-10 i 9-8 - okresl typ danych - na podstawie typu elementow tablicy duty_tab DMA1_Channel2->CCR |= 0<<9; DMA1_Channel2->CCR |= 1<<8; DMA1_Channel2->CCR |= 0<<11; DMA1_Channel2->CCR |= 1<<10; // DMA1_Channel2->CCR = //--- 3 ustaw liczbe elementow (tablicy) DMA1_Channel2->CNDTR = 0x08; DMA1_Channel2->CPAR =(uint32_t)&(TIM3->CCR1); // wskaznik na adres docelowy - urzadzenia peryferyjnego DMA1_Channel2->CMAR =(uint32_t)duty_tab; // wskaznik na adres zdrodlowy - tablice (w pamieci RAM) DMA1_Channel2->CCR |= 1; // wlacz odpowiedni kanal DMA for(;;) { // skopiuj rejestry timera 3 do zmiennych globalnych - tylko w celu wizualizacji w symulatorze counter = TIM3->CNT; cc_register=TIM3->CCR1; } }