gpt4 book ai didi

STM32F427 的 USART1 有时会设置第 8 个数据位,就好像它是奇偶校验位一样

转载 作者:行者123 更新时间:2023-12-01 10:35:42 25 4
gpt4 key购买 nike

我正在通过以下类使用 STM32F427 UASRT1:

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 转换器可以清楚地看到这种效果。一旦出现这种效果,甚至有可能对微 Controller 重新编程以传输测试数据集。比如0x00到0xFF,无限循环。它不影响问题。改变速度(低至 9600 bps)、每字位数、奇偶校验控制无济于事——即使在重新编程后效果仍然完好无损(例如导致每字节 2 个异常奇偶校验位)。或者,至少,在根据我的程序的工作流程以通常的顺序初始化和使用 UASRT 时。

修复它的唯一方法是让 main() 函数执行以下操作:

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

有了这个,在重新编程和重新启动后,前几个字节(最多 5 个)被传输为烂的,但随后一切都运行良好,并且通过进一步的重新启动和重新编程继续运行良好。

这种效果在 2 个不同的 STM32F427 上观察到,位于相同布局的 2 个物理不同的板上。它的外观没有规律性。信号极性和电平符合 USART 要求,在调查过程中未检测到噪声或接触不良。从我程序中使用的其他代码(无论是我的还是图书馆的代码)的方向来看,似乎对 UASRT1 没有任何影响,或者它被深深地掩埋了。项目中使用CMSIS-OS作为RTOS,配合KeiluVision 5.0.5RTX OS

需要帮助。

最佳答案

在 STM 中,您可以为 usart/uart 传输指定字长,但字长是数据位和位奇偶校验的总和。因此,如果您想要 8 位数据甚至奇偶校验位,则必须指定 UART_WORDLENGTH_9BUART_PARITY_EVEN

您也可以有 9 位数据,没有奇偶校验。在 F427 部分 30.6.4, Bit 12 的引用手册中,我们看到应该可以设置 9 个数据位,但是术语 data bits也适用于奇偶校验位。

Bit 12M: Word length
This bit determines the word length. It is set or cleared by software.
0: 1 Start bit, 8 Data bits, n Stop bit
1: 1 Start bit, 9 Data bits, n Stop bit

最终答案在 30.6.4, Bit 10

This bit selects the hardware parity control (generation and detection). When the parity control is enabled, the computed parity is inserted at the MSB position (9th bit if M=1; 8th bit if M=0) and parity is checked on the received data. This bit is set and cleared by software. Once it is set, PCE is active after the current byte (in reception and in transmission).

关于STM32F427 的 USART1 有时会设置第 8 个数据位,就好像它是奇偶校验位一样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33104169/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com