首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >STM32F0 Discovery发送错误值

STM32F0 Discovery发送错误值
EN

Stack Overflow用户
提问于 2014-11-12 20:27:14
回答 2查看 1.5K关注 0票数 0

我在STM32世界里迈出了第一步,这是相当困难的。我负责我的发现板。当我学会了如何控制GPIO,并被他们打断时,我决定和USART一起玩。地狱开始了。我花了两个晚上都在为像串行通信这样简单的事情而奋斗!

我所拥有的:

  • 配置GPIO
  • 配置USART
  • 来自标准STM库的时钟- HSI 48 MHz
  • 我在PuTTY中看到了字符
  • 传输参数测试: 8N1 9600和115200

正如您可以从代码中看到的那样,我希望在得到“_”时看到'A‘字符。在我看来,这是波特率的东西,但我只得到了这个错误的性格。当我将BRR更改为一个完全错误的值时,它将显示一些垃圾字符。

任何想法都欢迎!

代码语言:javascript
复制
#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;
}
EN

回答 2

Stack Overflow用户

发布于 2014-11-13 08:44:21

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

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

票数 0
EN

Stack Overflow用户

发布于 2014-11-14 19:25:38

解决方案:来自STM32F0发现板的输出为3.0V。结果证明,对于USBto-RS-232适配器来说,这是不够的。一个由5V提供MAX232的简单电路解决了这个问题。

案子结了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26895939

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档