私は STM32 の世界で最初の一歩を踏み出していますが、かなり大変です。私はディスカバリーボードを運営しています。それらからGPIOと割り込みを制御する方法を学んだとき、USARTで遊ぶことにしました。そしてここから地獄が始まりました。シリアル通信のような単純なことに 2 晩格闘しました!
私が持っているもの:
- 構成された GPIO
- 構成された USART
- 標準 STM ライブラリからのクロック - HSI 48 MHz
- PuTTYに文字が表示されます
- テスト済みの伝送パラメータ: 8N1 9600 および 115200
コードからわかるように、「_」が表示されている間に「A」の文字が表示されることを期待しています。私の意見では、ボーレートの問題ですが、この間違った文字しか得られません。BRR を完全に間違った値に変更すると、いくつかのジャンク文字が表示されます。
どんなアイデアでも大歓迎です!
#include <stm32f0xx.h>
void putC(uint8_t Character)
{
while(!(USART1->ISR & USART_ISR_TXE))
;
USART1->TDR = Character;
}
int main(void)
{
int i;
RCC->APB2ENR |= RCC_APB2ENR_USART1EN | RCC_APB2ENR_SYSCFGCOMPEN;
RCC->AHBENR |= (RCC_AHBENR_GPIOCEN | RCC_AHBENR_GPIOAEN);
//ioSetup();
GPIOA->MODER &= ~(GPIO_MODER_MODER9 | GPIO_MODER_MODER10);
GPIOA->MODER |= (GPIO_MODER_MODER9_1 | GPIO_MODER_MODER10_1);
GPIOA->OSPEEDR &= ~(GPIO_OSPEEDR_OSPEEDR9 | GPIO_OSPEEDR_OSPEEDR10);
GPIOA->OSPEEDR |= (GPIO_OSPEEDR_OSPEEDR9_0 | GPIO_OSPEEDR_OSPEEDR10_0);
GPIOA->PUPDR &= ~(GPIO_PUPDR_PUPDR9 | GPIO_PUPDR_PUPDR10);
GPIOA->PUPDR |= GPIO_PUPDR_PUPDR9_0 | GPIO_PUPDR_PUPDR10_0;
GPIOA->AFR[1] |= (0x00000110);
// USART
USART1->BRR = (uint32_t)(48000000/9600); // 9600
//USART1->CR2 = 0;
//USART1->CR3 = 0;
//USART1->GTPR = 0;
USART1->CR1 = USART_CR1_UE | USART_CR1_TE | USART_CR1_RE;
for (i = 0; i < 0x1000; i++)
__NOP();
i = 0;
for(;;) {
putC('A');
}
return 0;
}