- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在通过以下类使用 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,配合Keil
uVision 5.0.5
的RTX OS
。
需要帮助。
最佳答案
在 STM 中,您可以为 usart/uart 传输指定字长,但字长是数据位和位奇偶校验的总和。因此,如果您想要 8 位数据甚至奇偶校验位,则必须指定 UART_WORDLENGTH_9B
和 UART_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/
http://opencv-code.com/quick-tips/implementation-of-guo-hall-thinning-algorithm/ 在看郭霍尔算法,但我不明白它说的那部分
我知道这个方法检查整数是否为偶数,但是具体如何检查呢?我理解斐波那契或阶乘等例子的递归是如何工作的,但不理解这个。我认为由于语法原因我不明白。 // Assume n >= 0 public stat
我被困在一个作业上,需要程序接受多个数字,然后如果是奇数则输出"is",如果是偶数则输出“否”,并且不知道如何让程序接受超过 1 个 int,然后输出正确的 println。这是我到目前为止的代码。
这个测试行得通吗?: if (testInt/2).ofType(Integer){ //to-do if even } 我假设它会 iff 编译器在 ofType() 之前解析 testIn
我正在尝试更好地排列图像,而不仅仅是 1 列中的图像。示例见附件,每篇文章的图片可以在左右。 这是我的代码。HTML: Content 1
DAY16共3题: 奇♂妙拆分(简单数学) 区区区间间间(单调栈) 小AA的数列(位运算dp) 🎈 作者:Eriktse 🎈 简介:19
我是一名优秀的程序员,十分优秀!