#include "stm32f10x.h" volatile uint32_t main_counter, mask=1<<7; int main() { //--- Independent Watchdog IWDG->KR = 0x5555; IWDG->PR = 2; IWDG->RLR = 0xFFF; //--- 4 ---- uruchom Watchdoga IWDG->KR = 0xCCCC; //--- RCC - Reset Clock Control RCC->APB2ENR |= (1<<3)|(1<<2); //wlacz sygnal zegarowy portow GPIO A i B RCC->APB1ENR |= (1<<0); //wlacz sygnal zegarowy timer TIM2 //--- Konfiguracja portow IO GPIOA->CRL = 0x44444444; // mlodsze 8 linii portu A - wejscia GPIOA->CRH = 0x22222222; // starsze 8 linii portu A - wyjscia GPIOB->CRL = 0x22222222; // caly port B - wyjscia GPIOB->CRH = 0x22222222; //--- NVIC Nested Vectored Interrupt Controller //--- 2 ---- NVIC->ISER[0] |= ( 1<< 6); //wlacz przerwanie zewnetrzne EXTI0 NVIC->ISER[0] |= ( 1<< 28); //wlacz przerwanie od timera TIM2 //--- 3 ---- NVIC->IP[6] = 0x90; NVIC->IP[28] = 0x10; //--- EXTI External Interrupt Controller EXTI->IMR |= 1; EXTI->RTSR |= 1; //--- Konfiguracja timera TIM2 //--- 1 ---- TIM2->PSC = 998; // preskaler TIM2->ARR = 999; // pojemnosc licznika (Auto Reload) TIM2->DIER |= 1; // wlacz generowanie przerwan w chwili pzepelnienia licznika TIM2->CR1 |= 1; // wlacz timer //--- Petla glowna for(;;){ //--- 5 ---- //potencjalne miejsce przeladowania Watchdoga IWDG->KR = 0xAAAA; main_counter++; while (GPIOA->IDR & 128); } } //--- Procedura obslugi przerwania timera void TIM2_IRQHandler(void) { TIM2->SR &= ~1; //--- 5 ---- //potencjalne miejsce przeladowania Watchdoga mask = ((mask << 1) | (mask >> 7)) & 0xFF; GPIOB->ODR &= 0xFF00; GPIOB->ODR |= mask; } //--- Procedura obslugi przerwania zewnetrznego linia - A0 void EXTI0_IRQHandler(void){ EXTI->PR |= 1; //--- 5 ---- //potencjalne miejsce przeladowania Watchdoga while (GPIOA->IDR & 1) GPIOA->ODR |= 0xFF00; GPIOA->ODR &= 0x00FF; }