본문 바로가기
코스웨어/14년 스마트컨트롤러

20141106업무일지 출석번호 1번 고윤석

by 알 수 없는 사용자 2014. 11. 6.
728x90
반응형

UART

UART(범용 비동기화 송수신기: Universal asynchronous receiver/transmitter)는 병렬 직렬 방식으로 데이터를 전송하는 컴퓨터 하드웨어의 일종이다. UART는 일반적으로 EIA RS-232, RS-422, RS-485 와 같은 통신 표준과 함께 사용한다. UART의 U는 범용을 가리키는데 이는 자료 형태나 전송 속도를 직접 구성할 수 있고 실제 전기 신호 수준과 방식(이를테면 차분신호)이 일반적으로 UART 바깥의 특정한 드라이버 회로를 통해 관리를 받는다는 뜻이다.

UART는 일반적으로 컴퓨터나 주변 기기 직렬 포트의 직렬 통신 을 위해 사용되는 개별 집적회로 이다. UART는 보통 마이크로컨트롤러에도 포함되어 있다. 듀얼 UART, 곧 DUART는 두 개의 UART를 하나의 칩에 합친 것이다. 수많은 현대의 집적 회로(IC)는 동기화 통신도 지원하는 UART와 함께한다. 이러한 장치들은USARTs(범용 동기화 송수신기: universal synchronous/asynchronous receiver/transmitter)로 부른다.

수신측과 송신측의 약속이 있어야 한다

baud rate 가 서로 맞아야한다
AFIO 에서 UART 를 쓰겠다고 설정을 해줘야한다

오늘 짠 소스

#include "stm32f1x.h"
#include "stm32f10x_usart.h"
#define fck          8000000
#define BaudRate     115200
#define USART_HardwareFlowControl_None   ((uint16_t)0x0000)
#define USART_WordLength_8b                                                        ((uint16_t)0x0000)
#define USART_Parity_No                                                                                 ((uint16_t)0x0000)
#define USART_Mode_Rx                                                                                      ((uint16_t)0x0004)
#define USART_Mode_Tx                                                                                      ((uint16_t)0x0008)
#define CR1_UE_Set                                                                                                          ((uint16_t)0x2000)



void USART1_Configuration(void)
{
     //Baud Rate 설정
     uint32_t temp=0x0;
     uint_t USARTDIV=0x0, FractionDevider=0x0;  
     USARTDIV=fck/((0x10)*BaudRate));
     temp=(USARTDIV/0x64)<<4;
     FractionDevider=USARTDIV-(0x64*(temp>>4));
     temp |=(((FractionDevider*0x10)+0x32)/0x64)&0x0F;
    
     USART1->BRR=(uint16_t)temp;//보레에트 값을 집어넣는 공간 temp
     //그외세팅 (페리티 설정 같은)
     //USART1->CR1_WordLength_|USART_Parity_No|USART_HardwareFlowControl_None|8b USART_Mode_Rx | USART_Mode_Tx;
     temp=USART1->CR1;
     temp &=~(0x160c);
     temp |= (USART_WordLength_8b | USART_Parity_No | USART_HardwareFlowControl_None|USART_Mode_Rx | USART_Mode_Tx;
     USART1->CR1 =  (uint16_t)temp;
//USART_WordLength_8b,USART_Parity_No 이것들에는 별도의 디파인이 있어야한다
     //Stop bit:1 
     temp=USART1->CR2;
     temp&=~(0x3000);
     temp |=((uint16_t)0x0000);          //USART_StopBit_1  엄밀하게는 지금 해놓은것이 들어가는것이다  
     USART1->CR2=(uint16_t)temp;
    
    
     //Hardware Flow Control None
     temp=USART1->CR3;
     temp&=~(0x300);
     temp |=USART_HardwareFlowControl_None;
     USART1->CR3=(uint16_t)temp;
//Enable USART1
USART1->CR1 |=CR1_UE_Set;

}
     int main()
{
    
while(1)
     {
          //예를 들어서 헬로 월드를 보내줄려면 함수하나를 만들어서 던져주게 하면 된다
    
     }
     return 0;







이 위에 있는 Tx/Rx baud=fck/16*USARTDIV 를 이용해서 설정을 해준다



X 표시가 되어있는것이 가능하다는 것들인데 거의다가 가능한 모드라는것을 알수있다


우리가 하려는 UART 에서는 이 Baud rate register 이 중요하다

여기있는 레지스터를 참고해서 작업을 하면 된다고 하신다.


 

우리는 Idle Line으로 설정한다고 한다














728x90

'코스웨어 > 14년 스마트컨트롤러' 카테고리의 다른 글

20141110 일일보고 김재성  (5) 2014.11.10
2014.11.10 USART / ASSERT()  (0) 2014.11.10
assert함수 설명 / 김진철  (0) 2014.11.10
1107 김상엽 출석번호 5번 업무일지  (7) 2014.11.07
keil usart  (0) 2014.11.06
2014.11.05 업무일지 - 한솔  (7) 2014.11.06
ARM  (0) 2014.11.05
2014.11.04. 업무일지 22번 허수웅  (8) 2014.11.05