2014-11-12 7 views
0

저는 STM32 세계에서 첫발을 내딛고 있으며, 매우 어렵습니다. 디스커버리 보드를 운영합니다. GPIO와 인터럽트를 제어하는 ​​방법을 배웠을 때 나는 USART와 함께하기로 결심했다. 그리고 여기 지옥이 시작되었습니다. 시리얼 통신 같은 간단한 일로 고생하는 두 번의 저녁을 보냈습니다!STM32F0 발견 USART가 잘못된 값을 전송합니다.

내가 무엇을 가지고 :

  • 구성된 GPIO
  • 구성된 USART 표준 STM 라이브러리에서
  • 시계 -
  • 내가 테스트 PuTTY
  • 전송 매개 변수에 문자를 볼 HSI 48 MHz의 : 8N1 ​​9600 및 115200

코드에서 볼 수 있듯이 '_'을 얻는 동안 'A'문자를 볼 것으로 예상됩니다. 내 의견으로는 그것은 보오율 (baud rate)과 무언가이지만, 나는이 잘못된 문자를 얻는다. BRR을 완전히 잘못된 값으로 변경하면 일부 정크 문자가 표시됩니다.

어떤 아이디어라도 환영합니다!

#include <stm32f0xx.h> 

void putC(uint8_t Character) 
{ 
    while(!(USART1->ISR & USART_ISR_TXE)) 
    ; 

    USART1->TDR = Character; 
} 

int main(void) 
{ 
    int i; 

    RCC->APB2ENR |= RCC_APB2ENR_USART1EN | RCC_APB2ENR_SYSCFGCOMPEN; 
    RCC->AHBENR |= (RCC_AHBENR_GPIOCEN | RCC_AHBENR_GPIOAEN); 

    //ioSetup(); 
    GPIOA->MODER &= ~(GPIO_MODER_MODER9 | GPIO_MODER_MODER10); 
    GPIOA->MODER |= (GPIO_MODER_MODER9_1 | GPIO_MODER_MODER10_1); 

    GPIOA->OSPEEDR &= ~(GPIO_OSPEEDR_OSPEEDR9 | GPIO_OSPEEDR_OSPEEDR10); 
    GPIOA->OSPEEDR |= (GPIO_OSPEEDR_OSPEEDR9_0 | GPIO_OSPEEDR_OSPEEDR10_0); 

    GPIOA->PUPDR &= ~(GPIO_PUPDR_PUPDR9 | GPIO_PUPDR_PUPDR10); 
    GPIOA->PUPDR |= GPIO_PUPDR_PUPDR9_0 | GPIO_PUPDR_PUPDR10_0; 

    GPIOA->AFR[1] |= (0x00000110); 


    // USART 
    USART1->BRR = (uint32_t)(48000000/9600); // 9600 

    //USART1->CR2 = 0; 
    //USART1->CR3 = 0; 
    //USART1->GTPR = 0; 
    USART1->CR1 = USART_CR1_UE | USART_CR1_TE | USART_CR1_RE; 

    for (i = 0; i < 0x1000; i++) 
    __NOP(); 

    i = 0; 

    for(;;) { 
    putC('A'); 
    } 

    return 0; 
} 

답변

0

HSI는 정확하지 않고 안정된 시계가 아닙니다. 그것은 온도와 관련된 큰 오차를 가지고 있으며 "완벽한"온도에서의 빈도는 좋지 않습니다. 이 "잘못된"값이 계산 한 값에서 몇 퍼센트 떨어진 경우 문제가 HSI 정확도라는 것을 100 % 확신 할 수 있습니다.

그러면 외부 크리스탈을 사용하는 것이 좋습니다. "잘못된"값이 계산 된 값의 배수 (2, 4, 8 배 작은/큰 것) 인 경우 클럭을 설정하는 SystemInit() 코드를 잘 살펴 봐야합니다.

+0

HSE 8MHz로 변경했습니다. 불행하게도 증상은 동일했습니다. – PiotrK

0

솔루션 : STM32F0 디스커버리 보드의 출력은 3.0   V입니다. USB-RS-232 어댑터에는 충분하지 않습니다. 5   V와 함께 제공된 MAX232를 사용하는 간단한 회로로 문제가 해결되었습니다.

케이스가 닫혔습니다.