회원가입 ID/PW 찾기

1) 지식 창고는 본인이 작성한 콘텐츠(팁/노하우/리소스/강좌 등)을 무료 혹은 가상화폐인 납포인트를 통해 공유하는 공간입니다.
2) 본인이 작성한 콘텐츠에 대해서만 지식 창고에 등록할 수 있으며, 저작권에 위배되는 콘텐츠는 사전경고 없이 삭제될 수 있습니다.
3) 콘텐츠 구매 및 첨부파일 다운로드는 회원그룹 '연구원' 이상 가능하오니, 경험치를 쌓아 진급한 후에 이용 부탁드립니다.
4) 무료 콘텐츠의 본문은 구매절차 없이 즉시 이용할 수 있으며, 판매 납포인트가 있는 콘텐츠는 구매 후 이용할 수 있습니다.
5) 콘텐츠 판매에 따른 납포인트 수익은 지정한 비율(50%)에 따라 판매자에게 지급하며, 납포인트 수익을 통해 진급을 빨리할 수 있습니다.
6) 구매 후 평가를 하면 구매 납포인트의 20%를 돌려 드립니다.

콘텐츠 수 120
판매자 아크마 판매 납포인트 무료 평점 0점 / 총 0명 참여

The STM32 USART_Irq example program shows how to configure and use the USART1 of STMicroelectronics STM32F103xx microcontroller in interrupt driven mode.

The configuration of USART1 is 9600 Baud, 8 data bits, 1 stop bit, no parity and no flow control. Retargetting is used to read a character over the serial input and to print out a string to the serial output. A buffer handling is implemented for transmit / receive data.

The configuration of the clocks and USART is done using the Configuration Wizard in file STM32_Init.c.

 

 

 *----------------------------------------------------------------------------
 * Name:    Usart.c
 * Purpose: USART usage for STM32
 * Version: V1.00
 *----------------------------------------------------------------------------
 * This file is part of the uVision/ARM development tools.
 * This software may only be used under the terms of a valid, current,
 * end user licence from KEIL for a compatible version of KEIL software
 * development tools. Nothing else gives you the right to use this software.
 *
 * Copyright (c) 2005-2007 Keil Software. All rights reserved.
 *----------------------------------------------------------------------------*/
#include <stm32f10x_lib.h>                        // STM32F10x Library Definitions
#include <stdio.h>
#include "STM32_Init.h"                           // STM32 Initialization

/*----------------------------------------------------------------------------
  Notes:
  The length of the receive and transmit buffers must be a power of 2.
  Each buffer has a next_in and a next_out index.
  If next_in = next_out, the buffer is empty.
  (next_in - next_out) % buffer_size = the number of characters in the buffer.
 *----------------------------------------------------------------------------*/
#define TBUF_SIZE   256      /*** Must be a power of 2 (2,4,8,16,32,64,128,256,512,...) ***/
#define RBUF_SIZE   256      /*** Must be a power of 2 (2,4,8,16,32,64,128,256,512,...) ***/
/*----------------------------------------------------------------------------
 *----------------------------------------------------------------------------*/
#if TBUF_SIZE < 2
#error TBUF_SIZE is too small.  It must be larger than 1.
#elif ((TBUF_SIZE & (TBUF_SIZE-1)) != 0)
#error TBUF_SIZE must be a power of 2.
#endif
#if RBUF_SIZE < 2
#error RBUF_SIZE is too small.  It must be larger than 1.
#elif ((RBUF_SIZE & (RBUF_SIZE-1)) != 0)
#error RBUF_SIZE must be a power of 2.
#endif
/*----------------------------------------------------------------------------
 *----------------------------------------------------------------------------*/
struct buf_st {
  unsigned int in;                                // Next In Index
  unsigned int out;                               // Next Out Index
  char buf [RBUF_SIZE];                           // Buffer
};
static struct buf_st rbuf = { 0, 0, };
#define SIO_RBUFLEN ((unsigned short)(rbuf.in - rbuf.out))
static struct buf_st tbuf = { 0, 0, };
#define SIO_TBUFLEN ((unsigned short)(tbuf.in - tbuf.out))
static unsigned int tx_restart = 1;               // NZ if TX restart is required
/*----------------------------------------------------------------------------
  USART1_IRQHandler
  Handles USART1 global interrupt request.
 *----------------------------------------------------------------------------*/
void USART1_IRQHandler (void) {
  volatile unsigned int IIR;
  struct buf_st *p;
    IIR = USART1->SR;
    if (IIR & USART_FLAG_RXNE) {                  // read interrupt
      USART1->SR &= ~USART_FLAG_RXNE;           // clear interrupt
      p = &rbuf;
      if (((p->in - p->out) & ~(RBUF_SIZE-1)) == 0) {
        p->buf [p->in & (RBUF_SIZE-1)] = (USART1->DR & 0x1FF);
        p->in++;
      }
    }
    if (IIR & USART_FLAG_TXE) {
      USART1->SR &= ~USART_FLAG_TXE;           // clear interrupt
      p = &tbuf;
      if (p->in != p->out) {
        USART1->DR = (p->buf [p->out & (TBUF_SIZE-1)] & 0x1FF);
        p->out++;
        tx_restart = 0;
      }
      else {
        tx_restart = 1;
  USART1->CR1 &= ~USART_FLAG_TXE;        // disable TX interrupt if nothing to send
      }
    }
}
/*------------------------------------------------------------------------------
  buffer_Init
  initialize the buffers
 *------------------------------------------------------------------------------*/
void buffer_Init (void) {
  tbuf.in = 0;                                    // Clear com buffer indexes
  tbuf.out = 0;
  tx_restart = 1;
  rbuf.in = 0;
  rbuf.out = 0;
}
/*------------------------------------------------------------------------------
  SenChar
  transmit a character
 *------------------------------------------------------------------------------*/
int SendChar (int c) {
  struct buf_st *p = &tbuf;
                                                  // If the buffer is full, return an error value
  if (SIO_TBUFLEN >= TBUF_SIZE)
    return (-1);
                                                  
  p->buf [p->in & (TBUF_SIZE - 1)] = c;           // Add data to the transmit buffer.
  p->in++;
  if (tx_restart) {                               // If transmit interrupt is disabled, enable it
    tx_restart = 0;
 USART1->CR1 |= USART_FLAG_TXE;            // enable TX interrupt
  }
  return (0);
}
/*------------------------------------------------------------------------------
  GetKey
  receive a character
 *------------------------------------------------------------------------------*/
int GetKey (void) {
  struct buf_st *p = &rbuf;
  if (SIO_RBUFLEN == 0)
    return (-1);
  return (p->buf [(p->out++) & (RBUF_SIZE - 1)]);
}

/*----------------------------------------------------------------------------
  MAIN function
 *----------------------------------------------------------------------------*/
int main (void) {
  buffer_Init();                                  // init RX / TX buffers
  stm32_Init ();                                  // STM32 setup
  printf ("Interrupt driven Serial I/O Example\r\n\r\n");
  while (1) {                                     // Loop forever
    unsigned char c;
    printf ("Press a key. ");
    c = getchar ();
    printf ("\r\n");
    printf ("You pressed '%c'.\r\n\r\n", c);
  } // end while
} // end main


 

모르는 것이 무엇인지 스스로 정리하고 질문하는 습관을 가집시다.
무성의/광범위하거나 직접 해보지 않고 올리는 질문은 서로를 피곤하게 합니다.
질문쪽지는 사절이오니 게시판에 글을 남겨주세요. 그래야 다같이 공유할 수 있으니까요.

첨부

profile
leo 2010.01.13 18:36

좋은 자료 감사합니다.

profile
onlyme1118 2010.02.12 01:08

고마워요

profile
fairwind 2010.03.02 15:24

감사합니다.

profile
한석 2010.03.18 15:15

좋은자료 감사합니다

profile
부경공돌이 2010.03.23 20:07

어쩔..

profile
트맨이 2010.09.06 21:56

감사합니다.

profile
m카일 2011.12.01 14:53

필요한 부분이었는데 감사합니다.

profile
컴쟁이 2012.11.05 00:03
자료감사요
profile
빠른스네이크 2014.09.15 17:48
감사합니다
profile
시나브로69 2016.07.23 09:52

좋은 자료 감사합니다.

search
List of Articles
번호 분류 제목 평점 포인트 판매자 등록일 구매수 조회 수
공지 공공의 목적으로 공유하고자 하는 소프트웨어는 '소프트웨어 자료실'에 업로드를 요청드립니다.
공지 구매후 평점 댓글을 남겨주시면 구매포인트의 20%를 돌려드립니다.
118 강좌 & 팁 OP-amp의 특징과 설계시 주의사항 [3] 5P dmz1723 2019-06-24 15 362
117 강좌 & 팁 PCB 비용 절감을위한 기본 지침 [4] 무료 아크마 2018-06-17 0 715
116 강좌 & 팁 인쇄 회로 기판 (PCB)에 사용되는 개념과 용어 [6] 무료 아크마 2018-06-17 0 1192
115 강좌 & 팁 알티움을 유지보수하면 좋은 이유 (1) / Altium 17 Draftsman 무료 아크마 2018-01-06 0 271
114 강좌 & 팁 VHDL 기초이론 [2] 5P 태양인이제마 2017-12-26 14 287
113 강좌 & 팁 [국문번역] Programmable-Gain Transimpedance Amplifiers Maximize Dynamic Range in Spectroscopy Systems 5P 오로랏 2017-08-26 4 131
112 강좌 & 팁 이론상 가장 빠른 정렬 알고리즘 [1] 10P 오로랏 2017-08-26 4 362
111 강좌 & 팁 와이어 솔더링 노하우 [10] 5P 아그네스 2017-04-04 16 448
110 강좌 & 팁 vi Editor “Cheat Sheet” [2] 5P 아크마 2017-01-30 2 116
109 강좌 & 팁 AVR 기초강좌_1.보드에 프로그램 다운로드하기_퓨즈설정 [16] 무료 소중이 2010-05-18 0 3132
108 강좌 & 팁 미국 전선 규격 환산 5P 아크마 2012-12-30 2 241
107 강좌 & 팁 EMI 및 EMI 필터 설명, 설계, 주의사항 등 전반적인 내용 [1] 50P 솔개처럼 2016-12-16 8 306
106 강좌 & 팁 노이즈방지 PCB 설계법 [33] 5P 직장인 2016-07-21 31 761
105 강좌 & 팁 Fluorescent Lamps, Ballasts, and Fixtures [2] 5P 오로랏 2016-05-28 0 66
104 강좌 & 팁 [PCB설계] 전압에 따른 최소 도체 간격 & 패턴폭과 허용전류 & TH경에 따른 패턴폭 [6] 5P 킬유21 2015-11-06 13 555
103 강좌 & 팁 2015년 1월~2월에 진행을 하였던 모바일 로봇입니다. [1] 5P 한백금설 2015-05-14 8 460
102 강좌 & 팁 Rc Car를 이용하여 만든 자동주차시스템입니다. [3] 5P 한백금설 2015-05-14 5 627
101 강좌 & 팁 자작 라인 트레이서 [1] 무료 윤컴 2015-05-02 0 318
  • 서툰 의사는 한번에 한 사람을 해치지만, 서툰 교사는 130명을 해친다.
    - 보이어
  • * 납포인트 정보 *
  • 글 작성 : 3
  • 댓글 작성 : 1
저작권법에 위배되는 콘텐츠는 등록 불가하며, 저작물에 대한 권리는 저작자에게 있습니다.
Copyright 2006-2021 © hardwareis.com, All rights reserved.