회원가입 ID/PW 찾기

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

콘텐츠 수 149
판매자 아크마 판매 납포인트 무료 평점 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%를 돌려드립니다.
149 Allego & OrCAD orcad16.0 필요합니다 64비트용 무료 내마음의일식 2017-06-27 0 357
148 Allego & OrCAD orcad 16.0 설치 주소입니다. [2] 무료 Xorcad 2017-05-16 0 1330
147 Allego & OrCAD OrCAD PCB Editor 프로그램 질문드립니다. [1] 무료 kmgn0 2017-05-16 0 286
146 Allego & OrCAD OrCAD Capture "N-CH MosFET" 라이브러리 찾습니다. [3] 무료 내일의나 2017-03-07 0 226
145 Allego & OrCAD Negative Planes에 대해 질문 드립니다. [2] 무료 Astro 2017-02-14 0 163
144 Allego & OrCAD Orcad Netlist 추출 문의 [1] 무료 YEJUN 2017-02-10 0 200
143 Allego & OrCAD allegro pcb designer) 부품 배치 단계에서 bottom에 배치를 하고 싶은데 [3] 무료 호차미♡ 2017-01-20 0 271
142 Allego & OrCAD 마우스 드래그 표시 문의 드립니다. [1] 무료 미소비 2017-01-04 0 176
141 Allego & OrCAD ORCAD(Allegro) 16.6 추천 도서 부탁드립니다. [2] 무료 knightoffire 2017-01-03 0 316
140 Allego & OrCAD ORCAD PCB 설계 입문자 입니다. [1] 무료 호차미♡ 2016-11-18 0 506
139 Allego & OrCAD 질문)PCB 부품 Mirror(v16.5) [2] 무료 0808161114 2016-11-14 0 320
138 Allego & OrCAD 질문) Capture 부품 라이브러리 생성_Relay [2] 무료 0808161114 2016-10-19 0 479
137 Allego & OrCAD 시뮬레이션 하려고 하니 'cannot initialize profile'란 오류가 뜨네요.... [4] 무료 ddjde 2016-05-23 0 873
136 Allego & OrCAD win 10 호환 [9] 무료 Surium 2016-04-27 0 3318
135 Allego & OrCAD orcad 16.5 그것이 알고싶다. 무료 불멸자 2016-03-28 0 966
134 Allego & OrCAD 도와주세요~ outline 오류 [1] 무료 앙팡융 2016-03-15 0 210
133 Allego & OrCAD OrCAD16.6 설치방법 [18] 무료 빼빼로 2015-11-19 0 5141
132 Allego & OrCAD Cadence.OrCad.Allegro.SPB.16.2 가지고 계신분 무료 systec 2015-10-31 0 561
131 Allego & OrCAD 공부를시작하기전에 무료 qwe9606 2015-09-02 0 385
130 Allego & OrCAD 4층 설계하기 무료 보라색 2015-08-04 0 735
  • 약속은 태산처럼 해놓고, 실천은 두더지 둔덕만큼 한다.
    - C.H.스퍼전
  • * 납포인트 정보 *
  • 글 작성 : 3
  • 댓글 작성 : 1
저작권법에 위배되는 콘텐츠는 등록 불가하며, 저작물에 대한 권리는 저작자에게 있습니다.
Copyright 2006-2021 © hardwareis.com, All rights reserved.