2014-02-26 42 views
0

我想請點擊此鏈接的答案來配置我的我的STM32F0探索板的USART: stm32f0 uart programmingPC從STM32F0 USART接收到錯誤的數據

我用USART2將數據發送到我的電腦與波特率9600和115200都試過。

我從'0' - >'9'發送字符到PC,但我收到'cg3fe2d'和一些不可見的字符總是,似乎有一些規定,任何人都可以幫忙嗎?

我的STM32F0配置爲使用內部osc,48MHz。

enter image description here

我的參考代碼如下:

void test_uart() 
{ 
    USART_InitTypeDef USART_InitStructure; 
    GPIO_InitTypeDef GPIO_InitStructure; 
    uint16_t usart_data; 

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE); 
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); 

    GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_1); 
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_1); 

    //Configure USART2 pins: Rx and Tx ---------------------------- 
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3; 
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; 
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; 
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; 
    GPIO_Init(GPIOA, &GPIO_InitStructure); 
    //Configure USART2 setting:  ---------------------------- 
    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(USART2, &USART_InitStructure); 

    USART_Cmd(USART2,ENABLE); 

    usart_data = '0'; 
    while(1) 
    { 
     while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET); 
     if (usart_data > '9') 
      usart_data = '0'; 
     USART_SendData(USART2, usart_data++); 
    } 
} 
+0

有沒有人看過這個? – yunfei

+0

看看收到的字符與發送的字符的比特串,如果波特率真的是正確的,我懷疑你的邏輯電平可能會變得太多(或太少)一個倒數。 – Notlikethat

+0

是的,可能。我現在懷疑在OSC上,可能會嘗試一個外側獨立的OSC。 – yunfei

回答

0

問題已解決,我非常感謝您的善意幫助,我想與您分享結果。原因是我使用USBtoRS232,我使用3根線直接連接到發現板,我不知道RS232使用12V,這是根本原因。所以在使用RS232適配器後,問題解決了。再次感謝大家

0

我懷疑它的東西做有關於時鐘不同的想法庫比你做的。特別是如果你用不同的波特率得到相同的輸出。

你需要告訴圖書館你目前的時鐘是什麼?

+0

我認爲波特率對時鐘是正確的,因爲: 1.它工作,數據以該波特率接收,如果我改變爲其它波特率,則不會收到數據 2.在usart驅動程序中,有apbclock = RCC_ClocksStatus.PCLK_Frequency; 看起來時鐘是根據當前PCLK自動配置的 – yunfei

+0

您應該告訴「1.」在原來的職位。你確定收到了正確的數據嗎?怎麼樣?你可能只是做一個簡單的回聲(發送收到的內容),看看會發生什麼? – domen

+0

不要認爲它的工作原理,因爲你得到的數據!由於您複製了上述代碼,因此請通過檢查數據表確保您的系統時鐘和驅動UART的時鐘有效。再次檢查。在某些情況下,並非所有設置都是有效的,並且某些設置可能會產生較高的誤碼率。也可以通過直接連接到主機的UART端口(如果有的話)來執行測試。這從設置中消除了其他因素,即USB-UART變差。 –