STM32 NVIC ve Harici kesme ile ilgili uygulamam

Başlatan NaMcHo, 10 Mayıs 2011, 09:05:27

NaMcHo

#include <stm32f10x.h>
#include "LCD.h"

void rcc_init(void);
void delay(unsigned long delay);
void interrupt_init(void);

volatile unsigned char x=0;

void EXTI0_IRQHandler(void)
{
	
	if(EXTI->PR & 0x00000001)								//Bayrak kontrolü. bunu yapmaya gerek yok zaten bayrak set olunca bu fonksiyona dallanılıyor.
	{	
		if(x==0)
		{
			GPIOA->BSRR = 0x00000100;  						//PA8 set edildi.
			x++;
		}	
		else
		{
			GPIOA->BRR = 0x00000100;						//PA8 temizleniyor	
			x=0;						 		
		}
		EXTI->PR = 0x00000001;								//Bayrak temizleniyor.					 
	}
}
void EXTI1_IRQHandler(void)
{
	if(EXTI->PR & 0x00000002) 								//bayrak kontrolü
	{
		lcd_temizle();
		GPIOC->BSRR = 0x00000200;							//PC9 set 	
	}	
	EXTI->PR = 0x00000002; 									//bayrak temizleniyor.
}
const char string[]={"PAMUKKALE"},string1[]={"UNIVERSITESI"};	   	//paü->9  Uni->12
char k=12,i,j;
int main(void)
{
	rcc_init();	

	GPIOA->CRL &= 0x00000000;
	GPIOA->CRL |= 0x00000008;
	GPIOA->CRH &= 0x00000000;
	GPIOA->CRH |= 0x00000002;			
	GPIOC->CRH &= 0x00000000;
	GPIOC->CRH |= 0x00000022;
	GPIOC->CRL &= 0x00000000;
	GPIOC->CRL =  0x22222222;

	interrupt_init(); 				
	lcd_hazirla();
	delay(0x0000FFFF);
	
	//Kayan yazı.
	for(j=8;j>=0;j--)
	{
		for(i=3;i<k;i++)
		{
			imlec(1,i);
			lcd_karakter(string[j]);
			delay(0x0006FFFF);
			if((k-i)!=1)
			{
				imlec(1,i);
				lcd_karakter(' ');
			}			
		}
		k--;
	}
//	GPIOC->ODR |= 0xFF00;
	k=14;
	for(j=11;j>=0;j--)
	{
		for(i=2;i<k;i++)
		{
			imlec(2,i);
			lcd_karakter(string1[j]);
			delay(0x0006FFFF);
			if((k-i)!=1)
			{
				imlec(2,i);
				lcd_karakter(' ');
			}	
		}
		k--;	
	}									 

	for(;;)
	{
		if(GPIOA->IDR & 0x00000001)
			GPIOC->ODR |= 0x00000100; 				//PC8
		else
			GPIOC->BRR = 0x00000100;
	}		
}
void rcc_init(void)
{		  
	RCC->CR |= 0x00030000;					//HSEON=1
	while(!(RCC->CR & 0x00020000));	  		//Wait to HSE be stabilized
	RCC->CIR |= 0x00080000;					//HSERDYC: HSE ready interrupt cleared
	RCC->CR |= 0x00080000; 					//Clock security system Enabled.
	RCC->CIR |= 0x00800000;					//CSSC: Clock security system interrupt cleared.
	RCC->CR |= 0x00040000;					//HSE bypassed.

	RCC->CFGR |= 0x00000001; 				//SW[1:0]=01: HSE selected as system clock 
	RCC->CFGR |= 0x06000000; 
											
	RCC->CFGR |= 0x00000080;				//AHB configuration -> 1000: SYSCLK divided by 2
	RCC->CFGR |= 0x00002000; 				//APB2 configuration -> 100: HCLK divided by 2
	RCC->APB2ENR |= 0x0000001C;	 			//PORT C,A,B Clock Enabled.	
}
void delay(unsigned long delay)
{
	while(delay--);
}
void interrupt_init(void)
{
	RCC->APB2ENR |= 0x00000001;				//AFIO clock aktif.

	//AFIO clock resetlenip serbest bırakıldı.
	RCC->APB2RSTR |= 0x00000001;	 									   
	RCC->APB2RSTR &= 0xFFFFFFFE;
	
	GPIOB->CRL &= 0x00000000; 
	GPIOB->CRL |= 0x00000088;				//PB0,PB1 giriş olarak ayarlandı (pull-up / pull-down)
	AFIO->EXTICR[0] = 0x0001;					//Harici kesme olarak PB0 pini seçildi.
	AFIO->EXTICR[0] |= 0x0010;					//PB1 Harici kesme.
	EXTI->IMR |= 0x00000001;				//Kanal 1'in maskesi kaldırıldı EXTICR1 de PB0 ı seçebilmek için.
	EXTI->IMR |= 0x00000002;				//Kanal 2'in maskesi kaldırıldı EXTICR1 de PB1 ı seçebilmek için.
	EXTI->RTSR |= 0x00000001; 			  	//PB0 kesmesi için yükselen kenarda tetikleme seçildi.
	EXTI->RTSR |= 0x00000002;				//PB1 kesmesi için yükselen kenarda tetikleme seçildi.
	EXTI->PR = 0x000FFFFF;					//Reset şartı sağlandı ve ilk anda kesme oluşmucağı için resetledik bayrakları.
	NVIC->ISER[0] = 0x00000040;						//EXTI0 'ın aktif ediyoruz bunun için SETENA' ların her bir biti bir kesme numarasına karsılık gelir(0100 0000 şeklinde yazılmalı.)
	NVIC->ISER[0] = 0x00000000; 					//EXTI0 kesme numarası 6 dır(datasheette yazıyoruz veya programming manuldende bakabilirsiniz) yani 6.bit set edilmeli
	NVIC->ISER[0] = 0x00000080;						//EXTI1 interruptı aktif edildi.
	NVIC->ISER[0] = 0x00000000;
}						
		     


EXTI0 kesmesiyle PA8 set ediliyor ve BC547(beyzinde 8.2k)  ile röle(5V , 70mA) çektirilip led yaktırılıyor