stm32f103 / usart / usart interrupt



USART Polling 방식은 이전의 포스팅에서 구현을 했으니

이번엔 Interrupt 방식을 구현 할 차례이다.

쿼드콥터의 제어 코드가 돌아가는 중에 조종 데이터를 전송 받아야 하니

Polling 방식은 부적절 하다고 볼 수 있다.

그래서 Interrupt 방식의 USART 통신을 구현해야 한다.

#include "stm32f10x_conf.h"
//stm32f10x_conf.h 파일에는 필요한 각종 헤더를 포함시키는 코드를 삽입
//stm32f10x_gpio.h    ~_usart.h       ~_rcc.h
//misc.h

void USART2_IRQHandler(void);

int putchar(int ch);
u16 tmp;
 
int main()
{   
    SystemInit();
    
    NVIC_InitTypeDef NVIC_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;
 
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
 
    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
 
    /* Configure USARTx_Rx as input floating */
    GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_3;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    USART_InitStructure.USART_BaudRate  = 9600;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits  = USART_StopBits_1;
    USART_InitStructure.USART_Parity  = USART_Parity_No;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode  = USART_Mode_Rx | USART_Mode_Tx;
    USART_Init(USART2, &USART_InitStructure);
    
    USART_Cmd(USART2, ENABLE);
    
    NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
    
    USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
    
    /* Main While Loop */
    while(1)
    {
        while(!USART_GetFlagStatus(USART2, USART_FLAG_TXE));
        USART_SendData(USART2, 'A');
    }
}
 
void USART2_IRQHandler(void)
{
    if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
    {
        USART_SendData(USART2, 'B');
        USART_ClearITPendingBit(USART2, USART_IT_RXNE);
    }
}

테스트 할 당시 USART2에 연결한 블루투스로 테스트하고 구현한 소스

USART2 채널을 통해 A라는 글자가 무한히 출력되다가 USART2에 아무 input을 주게 되면 순간 B라는 글자가 출력됨

USARTx_IRQHandler 안의 구현하는 내용에 따라 다양하게 응용이 가능

다른 USART채널을 사용하려면 USART2라고 되어 있는 부분을 사용하고 싶은 USART 채널로 고치고 몇 부분만 더 고치면 사용 가능함

첨부 파일 : 구현한 프로젝트와 개인적으로 사용하려고 편집한 USART 헤더 파일

수정 및 배포 가능


2014 / 02 / 19 - 20:04 최초 작성

2014 / 02 / 19 - 20:14 SyntaxHighlighter 적용

2014 / 02 / 20 - 01:36 태그 정리

'Programming > Embedded' 카테고리의 다른 글

STM32F103 - PWM 소스  (0) 2014.02.19
FB155BC 설정 with USB2UART Downloader  (0) 2014.02.19
STM32F103 - Flash Downloader 에러  (0) 2014.02.19
ATmega128 - PWM Mode 14 소스  (0) 2014.02.19
ATmega128 - MPU6050 레지스터 읽기  (5) 2014.02.19
STM32F103 - USART Interrupt 소스  (2) 2014.02.19
  1. 이진구 2017.08.25 16:24

    안녕하세요? 혹시 UART 동작시킬때 사용자가 원하는 핀으로도 UART를 동작시킬수 있나요? 만약 가능 하다면 어떻게 하는지 설명을 부탁드려도 될까요?

    • Favicon of https://blog.komastar.kr BlogIcon Lord Komastar.Dev 2017.08.25 22:39 신고

      동작시킬 USART 번호의 레지스터에 마스킹 넣고 해당 USART의 TX RX핀에 데이터를 쏘고 읽고 하면 됩니다

+ Recent posts