STM32F0发现USART发送错误的值

时间:2014-11-12 20:27:15

标签: stm32 usart

我正在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;
}

2 个答案:

答案 0 :(得分:0)

HSI不是一个精确而不稳定的时钟。它有一个与温度和频率相关的大错误。完美&#34;温度也不好。如果这&#34;错误&#34;值是你计算的值的百分之几,那么你可以100%确定问题是HSI的准确性。

您唯一的选择就是使用外部水晶。如果你的错误&#34; value是你计算的倍数(比如小,小8倍,大8倍),那么我想你应该好好看一下设置时钟的SystemInit()中的代码。

答案 1 :(得分:0)

解决方案:STM32F0 Discovery板的输出为3.0 V.事实证明,USB-to-RS-232适配器还不够。 MAX232提供5 V的简单电路解决了这个问题。

案件已关闭。

相关问题