0

我正在 STM32 世界中迈出第一步,而且非常艰难。我运行我的探索板。当我学会了如何控制 GPIO 并从中中断时,我决定使用 USART。地狱从这里开始。我花了两个晚上在串行通信这样简单的事情上苦苦挣扎!

我有的:

  • 配置的 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

解决方案:STM32F0 Discovery 板的输出为 3.0 V。结果对于 USB-to-RS-232 适配器来说是不够的。一个带有 5 V 供电的 MAX232 的简单电路解决了这个问题。

结案。

于 2014-11-14T19:25:38.470 回答
0

HSI 不是精确且不稳定的时钟。它与温度有关的误差很大,“完美”温度的频率也不好。如果这个“错误”值与您计算的值相差几个百分点,那么您可以 100% 确定问题出在 HSI 准确性上。

您唯一的选择是使用外部晶体。如果您的“错误”值是您计算的值的倍数(例如小/大 2、4、8 倍),那么我想您应该好好看看 SystemInit() 中设置时钟的代码。

于 2014-11-13T08:44:21.670 回答