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로 해야 제대로 작동함.