Advertisement
Slightom

SW-PS4-zad3-main

Mar 19th, 2017
136
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.83 KB | None | 0 0
  1. #include "stm32f10x.h"
  2. #include "stdbool.h"
  3. #define SysTick_Frequency 9000000
  4.  
  5. void GPIO_Config(void);
  6. void RCC_Config(void);
  7. uint16_t intTo7seg(uint8_t, bool dot);      // konwersja na kod wyswietlacza 7-segmentowego
  8. void Delay (uint32_t ms);                   // powoduje wywolywanie przerwania z czestotliwoscia okreslona w parametrze
  9. void step(void);                            // wykonuje sie w kazdym przerwaniu
  10. void displayDigitOnNextDisplay(uint8_t x);  // wyswietla cyfre na jednym wyswietlaczu, pozostale gasi
  11. void Stoper(void);                                                  // logika stopera
  12. uint8_t  displayNumber = 0;           // numer wyswietlacza ktory ma byc aktualnie zapalony 0..3
  13. uint32_t interruptCounter = 0;        // zlicza przerwania 0..changeDigitTime/interruptTime
  14. uint8_t  digitNumber = 0;             // numer wyswietlanej cyfry 0..15
  15. uint32_t changeDigitTime = 99;          // co ile ms ma zmienic sie wyswietlana cyfra
  16. uint32_t interruptfrequency = 1;      // co ile ms ma sie wywolac przerwanie
  17.  
  18. bool isStoper = false;                              //czy stoper jest aktywny
  19. uint8_t m=0;  //minuty
  20. uint8_t s1=0; //dziesiatki sekund
  21. uint8_t s2=0; //jednosci sekund
  22. uint8_t c=0;     //milisekundy
  23. uint8_t button_state=0xFF, temp=0, port_data ; //do obslugi przycisków
  24.  
  25. int main(void)
  26. {  
  27.     //konfiguracja systemu
  28.     RCC_Config();  
  29.     GPIO_Config();
  30.  
  31.     Delay(interruptfrequency);
  32.    
  33.     while (1)
  34.     {
  35.     };
  36. }
  37.  
  38.  
  39.  
  40. void step()
  41. {  
  42.         // standardowy sposób na odczytanie wcisniecia przycisków
  43.         port_data = GPIO_ReadInputData(GPIOA);// czytaj port GPIOA
  44.         temp = port_data ^ button_state;            // czy stan przycisków sie zmienil?
  45.         temp &= button_state;                               // czy to byla zmiana z 1 na 0?
  46.         button_state = port_data;                       // zapamietaj nowy stan
  47.         if (temp & 0x01){               // jesli wcisniety 1 przycisk, to pauza/kontynuacja zliczania stopera
  48.                 isStoper = !isStoper;
  49.         }
  50.         if (temp & 0x02){               // jesli wcisniety 2 przycisk, to zatrzymaj stoper i wyzeruj wartosci
  51.                 isStoper = false;
  52.                 c=0;
  53.                 s1=0;
  54.                 s2=0;
  55.                 m=0;
  56.         }
  57.    
  58.         displayDigitOnNextDisplay(displayNumber++);
  59.         if(displayNumber == 4) { displayNumber=0; };
  60.         if(interruptCounter++ == changeDigitTime)
  61.         {
  62.                 interruptCounter = 0;
  63.                 if(isStoper)                // jesli stoper jest aktywny to dodanie kolejnych 100 milisekund do odmierzonego czasu
  64.                 {
  65.                         Stoper();
  66.                 }
  67.         }
  68. }
  69.  
  70.  
  71.  
  72. void displayDigitOnNextDisplay(uint8_t x)
  73. {
  74.     uint16_t d1, d2, d3; // trzy wyswietlacze które nalezy zgasic
  75.     uint16_t d0;         // wyswietlacz, ktory nalezy zapalic
  76.  
  77.     switch(x)
  78.     {
  79.         case 0: GPIO_Write(GPIOB, intTo7seg(m, true)); // zapal minuty z kropka
  80.                         d0 = GPIO_Pin_11;
  81.                         d1 = GPIO_Pin_8;
  82.                         d2 = GPIO_Pin_9;
  83.                         d3 = GPIO_Pin_10;
  84.                         break; 
  85.         case 1: GPIO_Write(GPIOB, intTo7seg(s2, false)); // zapal 'dziesiatki' sekund bez kropki
  86.                         d0 = GPIO_Pin_10;
  87.                         d1 = GPIO_Pin_8;
  88.                         d2 = GPIO_Pin_9;
  89.                         d3 = GPIO_Pin_11;
  90.                         break; 
  91.         case 2: GPIO_Write(GPIOB, intTo7seg(s1, true)); // zapal 'jednosci' sekund z kropka
  92.                         d0 = GPIO_Pin_9;
  93.                         d1 = GPIO_Pin_8;
  94.                         d2 = GPIO_Pin_10;
  95.                         d3 = GPIO_Pin_11;
  96.                         break; 
  97.         case 3: GPIO_Write(GPIOB, intTo7seg(c, false)); // zapal milisekundy bez kropki
  98.                         d0 = GPIO_Pin_8;
  99.                         d1 = GPIO_Pin_9;
  100.                         d2 = GPIO_Pin_10;
  101.                         d3 = GPIO_Pin_11;
  102.                         break;
  103.     }
  104.     GPIO_ResetBits(GPIOB, d0); // wlacz wyswietlacz DS3
  105.     GPIO_SetBits(GPIOB,  d1 |  d2 | d3); // wylacz pozostale
  106. }
  107.  
  108. void Stoper(void)
  109. {
  110.     //prosta implementacja stopera - funkcja stoper jest wywolywana do 100 milisekund
  111.     if(++c > 9) // dodawanie co 100 milisekund od 0 do 9
  112.     {
  113.         c = 0;
  114.         if(++s1 > 9) // dodawanie jednosci sekund od 0 do 9
  115.         {
  116.             s1 = 0;
  117.             if(++s2 > 5) // dodawanie dziesiatek sekund od 0 do 5 (0 - 59)
  118.             {
  119.                 s2 = 0;
  120.                 if(++m > 9) // dodawanie minut od 0 do 9, jesli stoper zliczyl 9 minut
  121.                                         // 59 sekund 900 milisekund (9:59:9) to zacznie liczyc od zera (0:00:0)
  122.                 {
  123.                     c=0;
  124.                     s1=0;
  125.                     s2=0;
  126.                     m=0;
  127.                 }
  128.             }
  129.         }
  130.     }
  131. }
  132.  
  133. uint16_t intTo7seg(uint8_t cyfra, bool dot)
  134. {
  135.         // zmodyfikowana funkcja konwertujaca liczby z systemu dziesietnego na system szesnastkowy
  136.         // z drugim parametrem typu bool:
  137.         // false - zwykla konwersja
  138.         // true  - konwesrja z dopisaniem kropi do wyswietlenia
  139.         uint16_t result;
  140.         switch (cyfra){
  141.                 case 0:  result=0xC0; break; // 11000000 0
  142.                 case 1:  result=0xF9; break; // 11111001 1
  143.                 case 2:  result=0xA4; break; // 10100100 2
  144.                 case 3:  result=0xB0; break; // 10110000 3
  145.                 case 4:  result=0x99; break; // 10011001 4
  146.                 case 5:  result=0x92; break; // 10010010 5
  147.                 case 6:  result=0x82; break; // 10000010 6
  148.                 case 7:  result=0xF8; break; // 11111000 7
  149.                 case 8:  result=0x80; break; // 10000000 8
  150.                 case 9:  result=0x90; break; // 10010000 9
  151.                 case 10: result=0x88; break; // 10001000 a
  152.                 case 11: result=0x83; break; // 10000011 b
  153.                 case 12: result=0xC6; break; // 11000110 c
  154.                 case 13: result=0xA1; break; // 10100001 d
  155.                 case 14: result=0x86; break; // 10000110 e
  156.                 case 15: result=0x8E; break; // 10001110 f
  157.                 default: result=0xFF; break; // 11111111 - nic do wyswietlenia
  158.         }
  159.         if(dot) result -= 128;      // jesli ma wyswietlic z kropka to ustawiamy zero na najstarszym bicie
  160.            
  161.         return result;
  162. }
  163.  
  164.  
  165. void Delay (uint32_t ms) // nasza funkcja opóznienia wykorzystujaca timer SysTick
  166. {
  167.         if (SysTick_Config(SysTick_Frequency / 1000 * ms))
  168.         {
  169.                 while(1);
  170.         }
  171.         SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
  172. }
  173.  
  174.  
  175.    
  176. void RCC_Config(void)
  177. {
  178.         //konfigurowanie sygnalow taktujacych
  179.         ErrorStatus HSEStartUpStatus;                          //zmienna opisujaca rezultat uruchomienia HSE
  180.         //
  181.         RCC_DeInit();                                          //Reset ustawien RCC
  182.         RCC_HSEConfig(RCC_HSE_ON);                             //Wlaczenie HSE
  183.         HSEStartUpStatus = RCC_WaitForHSEStartUp();            //Odczekaj az HSE bedzie gotowy
  184.         if(HSEStartUpStatus == SUCCESS)
  185.         {
  186.                 FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//
  187.                 FLASH_SetLatency(FLASH_Latency_2);                   //ustaw zwloke dla pamieci Flash; zaleznie od taktowania rdzenia
  188.                 //0:<24MHz; 1:24~48MHz; 2:>48MHz
  189.                 RCC_HCLKConfig(RCC_SYSCLK_Div1);                     //ustaw HCLK=SYSCLK
  190.                 RCC_PCLK2Config(RCC_HCLK_Div1);                      //ustaw PCLK2=HCLK
  191.                 RCC_PCLK1Config(RCC_HCLK_Div2);                      //ustaw PCLK1=HCLK/2
  192.                 RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); //ustaw PLLCLK = HSE*9 czyli 8MHz * 9 = 72 MHz
  193.                 RCC_PLLCmd(ENABLE);                                  //wlacz PLL
  194.                 while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);  //odczekaj na poprawne uruchomienie PLL
  195.                 RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);           //ustaw PLL jako zrodlo sygnalu zegarowego
  196.                 while(RCC_GetSYSCLKSource() != 0x08);                //odczekaj az PLL bedzie sygnalem zegarowym systemu
  197.                 /*Tu nalezy umiescic kod zwiazany z konfiguracja sygnalow zegarowych potrzebnych w programie peryferiow*/
  198.                 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);//wlacz taktowanie portu GPIO A
  199.         } else {
  200.         }
  201. }
  202.  
  203.  
  204.  
  205. void GPIO_Config(void)
  206. {
  207.         //konfigurowanie portow GPIO
  208.         GPIO_InitTypeDef  GPIO_InitStructure;
  209.    
  210.         // disable JTAG
  211.         GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
  212.    
  213.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;;
  214.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  215.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;      //wyjscie push-pull
  216.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  217.            
  218.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 ;
  219.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  220.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;      //wyjscie open drain
  221.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  222. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement