Facebook
From Szymon , 3 Years ago, written in Plain Text.
Embed
Download Paste or View Raw
Hits: 73
  1. #include "stm32f10x.h"
  2.  
  3. volatile uint32_t main_counter, mask=1<<7;
  4.  
  5. int main() {
  6.  
  7. //--- Independent Watchdog
  8.  
  9.         IWDG->KR = 0x5555;
  10.         IWDG->PR = 2;
  11.         IWDG->RLR = 0xFFF;
  12. //--- 4 ----    uruchom Watchdoga
  13.         IWDG->KR = 0xCCCC;
  14.        
  15. //--- RCC - Reset Clock Control
  16.        
  17.   RCC->APB2ENR |= (1<<3)|(1<<2);                                //wlacz sygnal zegarowy portow GPIO A i B
  18.         RCC->APB1ENR |= (1<<0);                                                         //wlacz sygnal zegarowy timer TIM2
  19.  
  20. //--- Konfiguracja portow IO
  21.        
  22.         GPIOA->CRL = 0x44444444;                                                        // mlodsze 8 linii portu A - wejscia
  23.         GPIOA->CRH = 0x22222222;                                                        // starsze 8 linii portu A - wyjscia
  24.         GPIOB->CRL = 0x22222222;                                                        // caly port B - wyjscia
  25.         GPIOB->CRH = 0x22222222;
  26.        
  27. //--- NVIC Nested Vectored Interrupt Controller
  28. //--- 2 ----
  29.        
  30.         NVIC->ISER[0] |= ( 1<< 6);                                                      //wlacz przerwanie zewnetrzne EXTI0
  31.         NVIC->ISER[0] |= ( 1<< 28);                                                     //wlacz przerwanie od timera TIM2
  32.  
  33. //--- 3 ----
  34.  
  35.         NVIC->IP[6] = 0x90;
  36.         NVIC->IP[28] = 0x10;
  37.  
  38. //--- EXTI External Interrupt Controller
  39.  
  40.         EXTI->IMR |= 1;
  41.         EXTI->RTSR |= 1;       
  42.  
  43. //--- Konfiguracja timera TIM2
  44. //--- 1 ----
  45.  
  46.         TIM2->PSC               = 998;                                                                  // preskaler    
  47.   TIM2->ARR             = 999;                                                                  // pojemnosc licznika (Auto Reload)
  48.   TIM2->DIER    |= 1;                                                                                   // wlacz generowanie przerwan w chwili pzepelnienia licznika
  49.   TIM2->CR1             |= 1;                                                                                   // wlacz timer
  50.  
  51. //--- Petla glowna
  52.         for(;;){
  53. //--- 5 ----
  54. //potencjalne miejsce przeladowania Watchdoga          
  55.  
  56.                 IWDG->KR = 0xAAAA;
  57.  
  58.                 main_counter++;
  59.                 while (GPIOA->IDR & 128);              
  60.         }
  61.  
  62. }
  63.  
  64. //--- Procedura obslugi przerwania timera
  65.  
  66. void TIM2_IRQHandler(void) {
  67.        
  68.         TIM2->SR &= ~1;
  69.  
  70. //--- 5 ----
  71. //potencjalne miejsce przeladowania Watchdoga          
  72.  
  73.         mask = ((mask << 1) | (mask >> 7)) & 0xFF;     
  74.         GPIOB->ODR &= 0xFF00;
  75.         GPIOB->ODR |= mask;            
  76. }
  77.  
  78. //--- Procedura obslugi przerwania zewnetrznego linia - A0
  79.  
  80. void EXTI0_IRQHandler(void){
  81.  
  82.         EXTI->PR |= 1;
  83.  
  84. //--- 5 ----
  85. //potencjalne miejsce przeladowania Watchdoga          
  86.        
  87.         while (GPIOA->IDR & 1) GPIOA->ODR |= 0xFF00;
  88.         GPIOA->ODR &= 0x00FF;  
  89. }