STM32F427的USART1有时将第8个数据位设置为奇偶校验位

时间:2015-10-13 13:36:49

标签: stm32 usart parity cmsis

我正在通过以下课程与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转换器可以清楚地看到这种效果。一旦出现这种效应,甚至可以重新编程微控制器以传输测试数据集。例如,无限循环中的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个物理上不同的板上的2个不同STM32F427上观察到这种效应。在外观上没有注意到规律性。信号极性和电平符合USART要求,在调查期间不会检测到噪声或接触不良。从我的程序中使用的其他代码(无论是我的或库中的代码)的方向看起来对UASRT1似乎没有任何感情,或者它被深埋。 CMSIS-OS在项目中用作RTOS,Keil uVision 5.0.5RTX OS

需要帮助。

1 个答案:

答案 0 :(得分:0)

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

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

  

位12M:字长
  该位决定字长。它由软件设置或清除   0:1起始位,8个数据位,n停止位
  1:1起始位,9个数据位,n停止位

最终答案在30.6.4, Bit 10

  

该位选择硬件奇偶校验控制(生成和   检测)。启用奇偶校验控制时,计算的奇偶校验为   插入MSB位置(如果M = 1,则为第9位;如果M = 0,则为第8位)和   在接收的数据上检查奇偶校验。该位置1和清零   软件。一旦设置,PCE在当前字节之后有效(in   接待和传输)。