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