0

我有 STM32F0DISCOVERY 板和 STM32F051R8T6 微控制器。我正在尝试使用 USART 与 PC 通信。

将数据从电路板发送到 PC 可以正常使用我的putChar()功能。

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;
    }
}
4

2 回答 2

0

您没有正确检查 RXNE 位。这行代码是错误的:

if ((USART2->ISR|(1UL<<5))==(1UL<<5)) {

您需要使用 AND 而不是 OR。这将允许您正确屏蔽并检查该位是否已设置。改用这个:

if ((USART2->ISR&(1UL<<5))==(1UL<<5)) {
于 2015-04-18T22:08:37.313 回答
0

在此您正在检查位的默认状态。检查它并将您的代码放入 else 如果数据存在,如果没有数据则进入 if 条件。

if ((USART2->ISR&(1UL<<5))==(1UL<<5)) {

} else {
    /***** operations *****/
}
于 2020-08-05T10:36:28.827 回答