现在我有一个stm32f4-discovery。我为uart创建了一个max232来连接stm32f4。我使用usb-rs232连接max232。我希望我可以通过uart与stm32f4和PC进行通信。我在Linux中打开putty。但是关于设置uart波特率我有一个很大的问题。如果我设置相同的波特率,则无法接收正确的消息。我用示波器观察。最后,我设置了7680(stm32f4)和3200(putty)。然后我就能得到正确的信息。但我不知道为什么它适用于不同的波特率。谁能告诉我为什么?这是我的代码,thx https://gitcafe.com/ctc8631/stm32f4-test-uart
答案 0 :(得分: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中运行良好。
答案 1 :(得分: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
答案 2 :(得分:0)
可能你在腻子上使用自动波特率。取消激活自动波特率,然后重试。如果仍然有效,apb1 / apb2-bus频率可能是错误的。您可以通过stm32f4xx_rcc.c
编辑总线频率答案 3 :(得分:0)
我有完全相同的问题。我在项目中使用了各种库和包含文件。其中大多数比ST提供的原件更新。这是我“升级”它们的动机,但我这是一个很大的错误。
我的解决方案/解决方法是:
使用TRUEStudio。制作新的嵌入式C应用程序。正确设置向导(这是明确的,但这是一个关于它的视频:http://www.youtube.com/watch?v=mT5bAgpW3jU)。它将生成所有必要的文件并设置好一切(项目结构,调试接口等)。添加您自己的源并修改必要的源,并且USARTx将运行所需的波特率。
我想问题是外围时钟速度设置错误,这就是操作速度不匹配的原因。我只是觉得我找不到问题的根源,但是如果你使用不同的IDE,我建议将特定于板的库更改回原来的。