0

现在我有一个 stm32f4-discovery。我为uart制作了一个max232来连接stm32f4。我使用usb-rs232连接max232。我希望我可以通过uart通信stm32f4和PC。我在 Linux 中打开 putty。但是我有一个关于设置 uart 波特率的大问题。如果我设置相同的波特率,它就无法接收到正确的消息。我用示波器观察。最后,我设置了 7680(stm32f4) 和 3200(putty)。然后我可以得到正确的信息。但我不知道为什么它以不同的波特率工作。谁能告诉我为什么?这是我的代码,谢谢https://gitcafe.com/ctc8631/stm32f4-test-uart

4

4 回答 4

3

您可能需要检查您的时钟设置。发现板有一个 8MHz 晶振,而标准外设库中的相关配置文件 (Libraries/CMSIS/Device/ST/STM32F4xx/Source/Templates/system_stm32f4xx.c) 似乎是为 25MHz 晶振设置的。它有这些定义

#define PLL_M      25
#define PLL_N      336
#define PLL_P      2
#define PLL_Q      7

从 25MHz 生成 168Mhz,而发现板的工作以太网示例在网络外使用

#define PLL_M      8
#define PLL_N      288
#define PLL_P      2
#define PLL_Q      6

从 8MHz 获得 144Mhz。

编辑:事实证明这样做还不够,因为 stm32f4xx.h 将“HSE_VALUE”定义为 25000000 (25MHz),除非在包含文件时已经定义了它。因此,我查看的正常工作示例未定义并将其重新定义为 stm32f4xx_conf.h 中的 8000000 (8MHz)。但我想正确的做法是在编译器命令行上定义它(即,如果您使用 IDE,则在某些属性框中)。至少这在 IAR EWARM 中运行良好。

于 2014-01-31T16:34:17.347 回答
1

在文件 stm32f4xx.h 你需要修复

HSE_VALUE from 25000000 to 8000000

然后在文件 system_stm32f4xx.c 中设置如下:

/* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */
#define PLL_M      8
#define PLL_N      336

/* SYSCLK = PLL_VCO / PLL_P */
#define PLL_P      2

/* USB OTG FS, SDIO and RNG Clock =  PLL_VCO / PLLQ */
#define PLL_Q      7
于 2014-09-19T09:22:46.320 回答
0

我有完全相同的问题。我在我的项目中使用了各种库并包含文件。它们中的大多数都比 ST 提供的原始版本更新。那是我“升级”它们的动机,但我犯了一个大错误。

我的解决方案/解决方法是:

使用真工作室。制作一个新的 Embedded C 应用程序。正确设置向导(这是明确的,但这里有一个关于它的视频:http ://www.youtube.com/watch?v=mT5bAgpW3jU )。它将生成所有必要的文件并设置好一切(项目结构、调试界面等)。添加您自己的源并修改必要的源,然后 USARTx 将运行所需的波特率。

我猜问题是外围时钟速度设置错误,这就是为什么运行速度不匹配。这只是我的意见,我找不到问题的根源,但如果您使用不同的 IDE,我建议将特定于板的库更改回原始库。

于 2013-09-26T19:04:25.103 回答
0

可能你在腻子上使用自动波特率。停用自动波特率,然后重试。如果仍然有效,apb1/apb2-bus 频率可能是错误的。您可以通过 stm32f4xx_rcc.c 编辑总线频率

于 2013-08-03T16:38:30.327 回答