2015-10-13 27 views
2

我通過下面的類與STM32F427 UASRT1工作:STM32F427的USART1有時將第8個數據位,就好像它是校驗位

void DebugUartOperator::Init() { 
    // for USART1 and USART6 
    ::RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); 
    // USART1 via PORTA 
    ::RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); 

    ::GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1); 
    ::GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1); 

    GPIO_InitTypeDef GPIO_InitStruct; 

    // fills the struct with the default vals: 
    // all pins, mode IN, 2MHz, PP, NOPULL 
    ::GPIO_StructInit(&GPIO_InitStruct); 

    // mission-specific settings: 
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; 
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF; 
    ::GPIO_Init (GPIOA, &GPIO_InitStruct); 

    USART_InitTypeDef USART_InitStruct; 

    // 9600/8/1/no parity/no HWCtrl/rx+tx 
    ::USART_StructInit(&USART_InitStruct); 

    USART_InitStruct.USART_BaudRate = 921600; 
    USART_InitStruct.USART_WordLength = USART_WordLength_9b; 
    USART_InitStruct.USART_StopBits = USART_StopBits_1; 
    USART_InitStruct.USART_Parity = USART_Parity_Odd; 
    ::USART_Init(USART1, &USART_InitStruct); 

    ::USART_Cmd(USART1, ENABLE); 
    } 

void DebugUartOperator::SendChar(char a) { 
    // wait for TX register to become empty 
    while(::USART_GetFlagStatus(USART1, USART_FLAG_TXE) != SET); 
    ::USART_SendData(USART1, static_cast<uint8_t>(a)); 
    } 

的問題是,每一個現在,然後USART開始忽略實際的第8個數據位並將其設置爲奇偶校驗位(奇數奇偶校驗,具體而言)。最奇怪的是,即使經過長時間的關機,它有時也會發生,沒有任何預先重新編程或什麼。例如,昨天晚上一切正常,第二天早上我開始工作,打開設備,開始按照上述方式工作。但它並不侷限於此,它可能會在下次重新啓動後隨機出現。

使用示波器和使用不同程序的不同UART-USB轉換器可以清楚地看到這種效果。甚至有可能,一旦出現這種效應,重新編程一個微控制器來傳輸測試數據集。例如,無限循環中的0x00到0xFF。它不會影響問題。更改速度(低至9600 bps),每字的位數,奇偶校驗控制無助於 - 即使在重新設計後(例如由於每個字節的奇偶校驗位確實不正常),效果也會保持不變。或者,至少在UASRT按照我的程序工作流程進行初始化和使用的情況下。

解決它的唯一方法是使main()函數執行以下操作:

int main() { 
    DebugUartOperator dua; 
    dua.Init(); 
    while(1) { 
     uint8_t i; 
     while(++i) 
      dua.SendChar(i); 
     dua.SendChar(i); 
     } 
    } 

有了這個,重新編程和重新啓動後,前幾個字節(最多5個)被髮送爛了,但那麼一切運作良好,並通過進一步的重新啓動和重新編程繼續良好運作。

在2個不同的STM32F427 s上觀察到這種效應,在2個物理不同的相同佈局的電路板上。沒有規律性的外觀。信號極性和電平符合USART要求,在調查過程中無噪音或接觸不良。從我的程序中使用的其他代碼(無論是我的程序還是庫中的代碼)的方向來看,UASRT1似乎沒有任何影響,或者它被深深地埋葬了。該項目使用CMSIS-OS作爲RTOS,KeiluVision 5.0.5RTX OS

需要幫助。

+0

嗨瓦西里,對不起,我不能在這裏看到你真正的問題。你說_USART開始忽略實際的第8位數據並將其設置爲奇偶校驗位(奇數奇偶校驗,具體而言)。但是你已經設置了USART_InitStruct.USART_Parity = USART_Parity_Odd;是這個問題嗎? – EricPb

+0

不幸的不是。我後面提到「改變......奇偶校驗控制不起作用」:我已經嘗試了奇數模式和偶數模式,以及沒有奇偶校驗模式,8位或9位寬度的字 - 不,這種效應一旦到來就會停止。 –

+0

雖然有趣的是,擺脫了我在CMSIS-RTOS資源泄漏的其他問題(http://stackoverflow.com/questions/32995099/cmsis-rtoss-osmailfree-returns-some-address-instead-of-osstatus-type )值得討論的問題也消失了。或者,至少,這種影響在相當長的時間內不再顯現。 –

回答

0

在STM中,您可以爲usart/uart傳輸指定字長,但字長是數據位和位奇偶校驗的總和。所以如果你想有8位數據和偶校驗位,你必須指定UART_WORDLENGTH_9BUART_PARITY_EVEN

你也可以有9位數據,沒有奇偶校驗。在F427部分的參考手冊30.6.4, Bit 12中,我們看到應該可以設置9個數據位,但術語data bits也適用於奇偶校驗位。

位12M:字長
該位確定字長。它由軟件設置或清除。
0:1個起始位,8個數據位,正停止位
1:1個起始位,9個數據位中,n停止位

最終答案是30.6.4, Bit 10

該位選擇硬件奇偶校驗控制(生成和 檢測)。當啓用奇偶校驗控制時,在MSB位置插入的計算奇偶校驗爲 (如果M = 1,則爲第9位;如果M = 0,則爲第8位)並且在接收數據上檢查奇偶校驗。該位由 軟件設置和清除。一旦設置,PCE在當前字節之後激活(在 接收和發送中)。