USART RXNE 未在 STM32F0 中设置
USART RXNE not being set in STM32F0
我有带有 STM32F051R8T6 微控制器的 STM32F0DISCOVERY 开发板。我正在尝试使用 USART 与 PC 通信。
我的 putChar()
功能可以很好地从电路板向 PC 发送数据。
使用我的 getChar()
功能接收从 PC 发送到电路板的数据 无法正常工作。问题是 RXNE 标志(读取数据寄存器不为空)未设置。然而,我已经看到在 Keil uVision4 中使用调试器,数据确实在 RDR(接收数据寄存器)中。
我试过 运行 它没有调试,以防调试器在我的程序读取 RXNE 标志之前读取 RDR 寄存器并且它仍然无法工作。
这是我的代码:
#include <STM32F0xx.h>
uint8_t data;
int main (void) {
RCC->AHBENR |= (1UL<<17); // PortA clock enable
GPIOA->MODER &= ~((3UL<<2*2)|(3UL<<2*3));
GPIOA->MODER |= ((2UL<<2*2)|(2UL<<2*3)); // Alt func on PA2, PA3
GPIOA->AFR[0] &= ~((15UL<<4*2)|(15UL<<4*2));
GPIOA->AFR[0] |= (( 1UL<<4*2)|( 1UL<<4*3)); // Alt func 1 on PA2, PA3
RCC->APB1ENR |= (1UL<<17); // USART clock enable
USART2->BRR = 5000; // Baud rate 48 000 000 / BRR -> 9600
USART2->CR1 |= (1UL<<0); // Enable USART
while (1) {
data = getChar();
if (data!=0xFF) {
putChar(data);
}
}
}
这是正常工作的 putChar()
函数。
void putChar (uint8_t data) {
USART2->CR1 |= (1UL<<3); // Transmitter enable
USART2->TDR = data;
while ((USART2->ISR|(1UL<<7))==(1UL<<7)); // Wait until sent
}
这里是 getChar()
函数,它不起作用并不断返回 0xFF
。
uint8_t getChar (void) {
USART2->CR1 |= (1UL<<2); // Receiver enable
if ((USART2->ISR|(1UL<<5))==(1UL<<5)) { // Check RXNE to see if there is data
return USART2->RDR;
} else {
return 0xFF;
}
}
您没有正确检查 RXNE 位。您的这行代码是错误的:
if ((USART2->ISR|(1UL<<5))==(1UL<<5)) {
您需要使用 AND 而不是 OR。这将允许您正确屏蔽并检查该位是否已设置。改用这个:
if ((USART2->ISR&(1UL<<5))==(1UL<<5)) {
在此您正在检查位的默认状态。
检查它并将您的代码放入 else 如果数据存在如果没有数据则它进入 if 条件。
if ((USART2->ISR&(1UL<<5))==(1UL<<5)) {
} else {
/***** operations *****/
}
我有带有 STM32F051R8T6 微控制器的 STM32F0DISCOVERY 开发板。我正在尝试使用 USART 与 PC 通信。
我的 putChar()
功能可以很好地从电路板向 PC 发送数据。
使用我的 getChar()
功能接收从 PC 发送到电路板的数据 无法正常工作。问题是 RXNE 标志(读取数据寄存器不为空)未设置。然而,我已经看到在 Keil uVision4 中使用调试器,数据确实在 RDR(接收数据寄存器)中。
我试过 运行 它没有调试,以防调试器在我的程序读取 RXNE 标志之前读取 RDR 寄存器并且它仍然无法工作。
这是我的代码:
#include <STM32F0xx.h>
uint8_t data;
int main (void) {
RCC->AHBENR |= (1UL<<17); // PortA clock enable
GPIOA->MODER &= ~((3UL<<2*2)|(3UL<<2*3));
GPIOA->MODER |= ((2UL<<2*2)|(2UL<<2*3)); // Alt func on PA2, PA3
GPIOA->AFR[0] &= ~((15UL<<4*2)|(15UL<<4*2));
GPIOA->AFR[0] |= (( 1UL<<4*2)|( 1UL<<4*3)); // Alt func 1 on PA2, PA3
RCC->APB1ENR |= (1UL<<17); // USART clock enable
USART2->BRR = 5000; // Baud rate 48 000 000 / BRR -> 9600
USART2->CR1 |= (1UL<<0); // Enable USART
while (1) {
data = getChar();
if (data!=0xFF) {
putChar(data);
}
}
}
这是正常工作的 putChar()
函数。
void putChar (uint8_t data) {
USART2->CR1 |= (1UL<<3); // Transmitter enable
USART2->TDR = data;
while ((USART2->ISR|(1UL<<7))==(1UL<<7)); // Wait until sent
}
这里是 getChar()
函数,它不起作用并不断返回 0xFF
。
uint8_t getChar (void) {
USART2->CR1 |= (1UL<<2); // Receiver enable
if ((USART2->ISR|(1UL<<5))==(1UL<<5)) { // Check RXNE to see if there is data
return USART2->RDR;
} else {
return 0xFF;
}
}
您没有正确检查 RXNE 位。您的这行代码是错误的:
if ((USART2->ISR|(1UL<<5))==(1UL<<5)) {
您需要使用 AND 而不是 OR。这将允许您正确屏蔽并检查该位是否已设置。改用这个:
if ((USART2->ISR&(1UL<<5))==(1UL<<5)) {
在此您正在检查位的默认状态。 检查它并将您的代码放入 else 如果数据存在如果没有数据则它进入 if 条件。
if ((USART2->ISR&(1UL<<5))==(1UL<<5)) {
} else {
/***** operations *****/
}