Facebook
From Beige Matamata, 3 Years ago, written in Plain Text.
Embed
Download Paste or View Raw
Hits: 62
  1. #include "stm32f10x.h"
  2.  
  3. uint32_t counter,cc_register;
  4. uint16_t duty_tab[8]={10,100,250,500,750,10,900,500};
  5.  
  6. int main ()  {
  7.  
  8. //--- RCC - Reset Clock Control
  9.        
  10.   RCC->APB2ENR |= (1<<2) | (1<<0);                      //wlacz sygnal zegarowy GPIOA i AFIO
  11.         RCC->APB1ENR |= (1<<1) | (1<<0);                        //wlacz sygnal zegarowy timer TIM2 i TIM3
  12.  
  13. //--- 1 wlacz DMA1
  14.        
  15.         RCC->AHBENR |= (1 << 0);
  16.  
  17. //--- konfiguracja portu A
  18. //linia A6 - alternate function output push-pull
  19.        
  20.         GPIOA->CRL  &= ~(15<<24);
  21.         GPIOA->CRL  |= (1<<24);
  22.         GPIOA->CRL  |= (2<<26);
  23.  
  24. // taktowanie timerow - 9 MHz
  25. //--- konfiguracja timera TIM2 - inicjowanie transferow DMA co 0.5 sekundy
  26.        
  27.         TIM2->PSC                       = 8999;                                                                 // preskaler    
  28.   TIM2->ARR                     = 499;                                                                  // pojemnosc licznika (Auto Reload)
  29.   TIM2->DIER            |= 1<<8;                                                                // DMA/IRQ Enable Register - enable update DMA request
  30.   TIM2->CR1    
  31.         |= 1;                                                                           // wlacz timer TIM2
  32.  
  33. //--- konfiguracja timera TIM3 - generowanie fali prostokatnej + Pulse Width Modulation (PWM)
  34.  
  35.         TIM3->PSC = 899;
  36.         TIM3->ARR = 999;
  37.         TIM3->CCMR1 |= (6<<4);                                                          // bity 6:4 PWM mode 1
  38.         TIM3->CCER |= (0<<1)|(1<<0);                                    // wlacz kanal 1, ustaw polaryzacje wyjscia    
  39.         TIM3->CR1 |=                            1;                                                              // wlacz timer TIM3
  40.  
  41. //--- konfiguracja DMA Direct Memory Access
  42.  
  43. //--- 2 - ustaw w CCR bity:
  44.  
  45. // 4 - kierunek przeplywu danych
  46.         DMA1_Channel2->CCR |= 1<<4;
  47. // 5 - wlacz tryb pierscieniowy
  48.         DMA1_Channel2->CCR |= 1<<5;
  49. // 7 - modyfikuj wskaznik adresu w pamieci
  50.         DMA1_Channel2->CCR |= 1<<7;
  51. // 11-10 i 9-8 - okresl typ danych - na podstawie typu elementow tablicy duty_tab
  52.         DMA1_Channel2->CCR |= 0<<9;
  53.         DMA1_Channel2->CCR |= 1<<8;
  54.        
  55.         DMA1_Channel2->CCR |= 0<<11;
  56.         DMA1_Channel2->CCR |= 1<<10;
  57. //      DMA1_Channel2->CCR =
  58.  
  59. //--- 3 ustaw liczbe elementow (tablicy)
  60.  
  61.         DMA1_Channel2->CNDTR = 0x08;
  62.                
  63.         DMA1_Channel2->CPAR =(uint32_t)&(TIM3->CCR1);           // wskaznik na adres docelowy - urzadzenia peryferyjnego
  64.         DMA1_Channel2->CMAR =(uint32_t)duty_tab;                                // wskaznik na adres zdrodlowy - tablice (w pamieci RAM)
  65.         DMA1_Channel2->CCR |= 1;                                                                                                // wlacz odpowiedni kanal DMA
  66.  
  67.  
  68.  
  69.         for(;;) {
  70. // skopiuj rejestry timera 3 do zmiennych globalnych - tylko w celu wizualizacji w symulatorze
  71.                 counter = TIM3->CNT;
  72.                 cc_register=TIM3->CCR1;                
  73.         }
  74.  
  75. }
  76.