Stm32 seri porttan data gondermek icin kesme olusturma

Başlatan robikod, 08 Ağustos 2017, 12:10:41

robikod

Merhaba uart iletisimini saglayip kesme fonksiyonunu olusturdum. Ancak 1 gonderdigim zaman program kesmeyi algilamiyor neden olabilir ?



volkanunal


robikod


robikod

#include "main.h"
#include "common.h"
#include "io_periph_defs.h"
#include "conf.h"
void USART1_Init(void);
void led_toggle(void);

///////////////////////////////////////////
uint16_t USART_Temp_Data;
int main()
{
    Usart1_init();
    USART_PutString("Baglanti Saglandi\n");

    init_pin(DEBUG_LED_PORT, DEBUG_LED_PIN, GPIO_Mode_OUT, GPIO_Speed_50MHz, GPIO_OType_PP, GPIO_PuPd_UP); //led bilgileri tanımlandı.
                                                                                                           //  USART1_IRQHandler();
    while (1)
    {
        // USART_PutString("dongu basladi \n");
    }
}

void led_toggle()
{
    GPIO_Toggle(DEBUG_LED_PORT, DEBUG_LED_PIN);
}



void Usart1_init(void)
{
    // Usart ayarlarını yaptığımız kısım
    GPIO_InitTypeDef GPIO_InitStructure;   // Tx ve Rx ayarları için oluşturduğumuz struct
    USART_InitTypeDef USART_InitStrutcure; // Usart ayarları için oluşturduğumuz struct
    NVIC_InitTypeDef NVIC_InitStructure;   //nvic ayarları için oluşturulan struct
    // USART için Clock ayarlarını yapıyoruz
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

    // Datasheet bilgilerine baktığımızda A9-> TX, A10->RX pinleri olarak kullanılıyor.
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; // 9 ve 10. pinleri belirttik
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure); // A portu olduğunu belirttik

    GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_7); // datasheetinde USART1 için AF değeri 7 olarak verilmiş
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_7);
    // USART Ayarlamaları
    USART_InitStrutcure.USART_BaudRate = 9600;                  //iletişim hızı
    USART_InitStrutcure.USART_WordLength = USART_WordLength_8b; // kaç bitlik veri gönderileceği bilgisi
    USART_InitStrutcure.USART_Parity = USART_Parity_No;
    USART_InitStrutcure.USART_StopBits = USART_StopBits_1;
    USART_InitStrutcure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStrutcure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;

    USART_Init(USART1, &USART_InitStrutcure);
    //USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
    USART_Cmd(USART1, ENABLE); // Usart Aktif
    //                                                   //Bir kesme oluşturacağımız için kesme ayarlarını yapmamız gerekiyor
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //USART1 in kesmesi olduğunu belirttik
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_Init(&NVIC_InitStructure);
}

// void USART1_IRQHandler(void)
// {

//     if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
//     {

//         if ((char)USART_ReceiveData(USART1) == '1')
//         {
//             led_toggle();
//             USART_PutString("T");

//             //   while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)
//             // {
//             //}
//         }
//}
//}

void USART1_IRQHandler(void)
{
    if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //enter interrupt when STM32 receice data.
    {
                USART_PutString("T");

        USART_ClearITPendingBit(USART1, USART_IT_RXNE);
        USART_Temp_Data = (unsigned char)USART_ReceiveData(USART1); //receive a char
        if (USART_Temp_Data == '1')
        {
            led_toggle();
        }
    }
}

static void USART_SendString(USART_TypeDef *USARTx, char *s)
{
    while (*s)
    {
        while (!USART_GetFlagStatus(USARTx, USART_FLAG_TC))
            ;
        USART_SendData(USARTx, *s);
        s++;
    }
}

void USART_PutString(char *s)
{
    // Send a string
    while (*s)
    {
        USART_PutChar(*s++);
    }
}
void USART_PutChar(char c)
{
    // Wait until transmit data register is empty
    while (!USART_GetFlagStatus(USART1, USART_FLAG_TXE))
        ;
    // Send a char using USART1
    USART_SendData(USART1, c);
}

volkanunal

void USART1_IRQHandler(void) {
if ((USART1->SR & USART_FLAG_RXNE) != (u16)RESET)           
    {       char c 
            c= USART_ReceiveData(USART1);
            if(c== '1')
            led_toggle();
           
           
         
    }   
}
olarak dener misiniz?

robikod

Alıntı yapılan: volkanunal - 08 Ağustos 2017, 13:55:38
void USART1_IRQHandler(void) {
if ((USART1->SR & USART_FLAG_RXNE) != (u16)RESET)           
    {       char c 
            c= USART_ReceiveData(USART1);
            if(c== '1')
            led_toggle();
           
           
         
    }   
}
olarak dener misiniz?
Sorunu cozdum tanimlamadaki bir kodu aktif ettim.simdiyse sorun soyle mesela seri porttan 1 gonderiyorum led yaniyor 2 gonderdigimde port temizlenmiyor 2 oldugunu algilamiyor mesela 1 e bastigimda yakip 2 ye bastigimda nasil sondurebilir?

baran123

Bayrağı temizlemediğiniz için olabilir mi ?
if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET)           
{       
    USART_ClearITPendingBit(USART1, USART_IT_RXNE);
    
    char c;
    
    c = USART_ReceiveData(USART1);
    
    if(c == '1')
        led_on();
    else if(c == '2')
        led_off();
}