0

STM32F051R8T6 マイクロコントローラを搭載した STM32F0DISCOVERY ボードを持っています。USART を使用して PC と通信しようとしています。

ボードから PC へのデータの送信は、私の機能では正常にputChar()機能します。

getChar()マイ機能でPCからボードに送信されたデータの受信がうまくいきません。問題は、RXNE フラグ(Read Data Register Not Empty)が設定されていないことです。しかし、Keil uVision4 のデバッガーを使用して、データが実際に RDR (Receive Data Register) にあることを確認しました。

プログラムが 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)) {

OR の代わりに AND を使用する必要があります。これにより、正しくマスクし、ビットが設定されているかどうかを確認できます。代わりにこれを使用してください:

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