Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => ARM => Cortex ARM => Konuyu başlatan: NaMcHo - 10 Mayıs 2011, 09:05:27

Başlık: STM32 NVIC ve Harici kesme ile ilgili uygulamam
Gönderen: NaMcHo - 10 Mayıs 2011, 09:05:27
#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