我通過下面的類與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,Keil
uVision 5.0.5
的RTX OS
。
需要幫助。
嗨瓦西里,對不起,我不能在這裏看到你真正的問題。你說_USART開始忽略實際的第8位數據並將其設置爲奇偶校驗位(奇數奇偶校驗,具體而言)。但是你已經設置了USART_InitStruct.USART_Parity = USART_Parity_Odd;是這個問題嗎? – EricPb
不幸的不是。我後面提到「改變......奇偶校驗控制不起作用」:我已經嘗試了奇數模式和偶數模式,以及沒有奇偶校驗模式,8位或9位寬度的字 - 不,這種效應一旦到來就會停止。 –
雖然有趣的是,擺脫了我在CMSIS-RTOS資源泄漏的其他問題(http://stackoverflow.com/questions/32995099/cmsis-rtoss-osmailfree-returns-some-address-instead-of-osstatus-type )值得討論的問題也消失了。或者,至少,這種影響在相當長的時間內不再顯現。 –