J 창고

[ARM] stm32f103c8 USART1 뚫기 및 삽질 정리 본문

컴퓨터/Firmware

[ARM] stm32f103c8 USART1 뚫기 및 삽질 정리

JSFamily 2015. 4. 26. 11:09




RCC 설정


GPIO 설정


USART 설정


VNIC 설정


순으로 설정하면 분명히 된다고 나와있는데...


일단 통신이 오는 것 까진 확인했다..


여기까지 대략 6시간 본 것 같은...

(아 정말 뭔가 이상한거 없었는데 안되다가 갑자기 되서 이건 뭐지 했음....)




그런데 또 문제는 여기서 발생..


분명히 통신은 되는데 주고 받고도 되는데 쓰레기값으로 나오는 것임..







위의 터미널처럼....


요상하게 안되는 문제가...



그러다 문득.. USART 찾아보면서 어느 한 블로그에서 본 글이였는데..


클럭 설정이 이상해서 뭔가 찾아서 고쳐야 해야 제대로 동작했다는 글이였다..


그래서 지금 클럭이 얼마인지를 확인하려고 보니


지금 시리얼 통신도 안되는데 뭐 어찌 확인하지.....



해서 디버그모드로 확인 


RCC_ClocksTypeDef RCC_Clocks; 전달 구조체와

RCC_GetClocksFreq(); 라는 함수를 제공해 주기에


구조체에 받아서 디버그모드에서 인자 확인을 진행






해보니....


0x2DC6C00 라는 값이 나옴....   즉 10진수로 48000000 이라는 48Mhz 였다는 것..


아...


72Mhz로 동작해야 하는데 이건 뭐....



그래서 다시 검색을 통해서 SysClk를 설정하는 함수를 넣어서 72Mhz로 돌게 만든 후 디버깅 해 보니






이번엔


0x044AA200 라는 값 10진수로 72000000 이라는 값이 제대로 나오고





터미널에도 잘 찍힌다.






이것때문에 개고생 했네... 덜덜


System Clock 설정이 Startup 코드에 다 들어가 있어서 굳이 설정 안해줘도 된다는 주석을 봤었는데..


그게 아닌가보다.......   (아니면 주석이 잘못했거나......)






1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#include "stm32f10x_conf.h"
 
void USART1_IRQHandler(void);
 
NVIC_InitTypeDef     NVIC_InitStructure;
USART_InitTypeDef USART_InitStructure;
GPIO_InitTypeDef    GPIO_InitStructure;
RCC_ClocksTypeDef    RCC_Clocks;
ErrorStatus HSEStartUpStatus;
 
int main()
{
    SystemInit();
    
    RCC_DeInit();                                     //RCC system reset(for debug purpose)
      RCC_HSEConfig(RCC_HSE_ON);                         //Enable HSE
     HSEStartUpStatus = RCC_WaitForHSEStartUp();        //Wait till HSE is ready
      if (HSEStartUpStatus == SUCCESS)
      {
     
        FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //Enable Prefetch Buffer
     
        FLASH_SetLatency(FLASH_Latency_2);                // Flash 2 wait state 
    
           RCC_HCLKConfig(RCC_SYSCLK_Div1);                //HCLK = SYSCLK
        RCC_PCLK2Config(RCC_HCLK_Div1);               //PCLK2 = HCLK
        RCC_PCLK1Config(RCC_HCLK_Div2);                    //PCLK1 = HCLK/2
        RCC_PLLConfig(RCC_PLLSource_PREDIV1, RCC_PLLMul_9); //PLLCLK = 8MHz * 9 = 72 MHz
        RCC_PLLCmd(ENABLE);                             //Enable PLL
        
    
    while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET){}//Wait till PLL is ready
   
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);        //Select PLL as system clock source
 
    while(RCC_GetSYSCLKSource() != 0x08){}    //Wait till PLL is used as system clock source
  }
  
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);
 
    GPIO_InitStructure.GPIO_Pin            = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Speed        = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode        = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    GPIO_InitStructure.GPIO_Pin         = GPIO_Pin_10;
    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(USART1, &USART_InitStructure);
    USART_Cmd(USART1, ENABLE);
    
    NVIC_InitStructure.NVIC_IRQChannel         = USART1_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelCmd    = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
    
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
    
    RCC_GetClocksFreq(&RCC_Clocks);
 
    while(1)
    {
        while(!USART_GetFlagStatus(USART1, USART_FLAG_TXE));
        USART_SendData(USART1, 'a');
    }
}
 
void USART1_IRQHandler()
{
    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
    {
        USART_SendData(USART1, 'B');
        USART_ClearITPendingBit(USART1, USART_IT_RXNE);
    }
}
 
 
cs











=============================================================


15.04.26 12:09


왠지 프로젝트 생성할 때 stm32f10x_md 로 해야 하는데...


stm32f10x_md_vl 으로 해서 그런것 같기도 하고...


vl 이 value line이라고 하는데 이게 뭔가 하다가 찾아보니 제품 안에 들어가는 저 클럭의 컨트롤러네...


vl로 사용해버리니 저 클럭으로 설정될 수 밖에 없었네......    ;ㅁ;




================================================================


15.04.27 19:55


예상했던 바가 맞는듯..


Startup 코드를 md_vl이 아닌 md로 해야 제대로 작동함.






Comments