0

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

2 に答える 2

0

HSI は正確ではなく、安定したクロックでもありません。温度に関連する大きな誤差があり、「完全な」温度での周波数も良くありません。この「間違った」値が計算した値から数パーセント離れている場合、問題は HSI の精度にあると 100% 確信できます。

唯一の選択肢は、外部クリスタルを使用することです。「間違った」値が計算した値の倍数 (2、4、8 倍小さい/大きいなど) である場合は、クロックを設定する SystemInit() のコードをよく見てください。

于 2014-11-13T08:44:21.670 に答える
0

解決策: STM32F0 Discovery ボードからの出力は 3.0 V です。USB-to-RS-232 アダプタには不十分であることが判明しました。MAX232 に 5 V を供給する単純な回路が問題を解決しました。

ケースを閉じました。

于 2014-11-14T19:25:38.470 に答える