带有 HAL 库的 STM32F4-Discovery (STM32F429ZIT6) 上的 RS232 (UART)?

Posted

技术标签:

【中文标题】带有 HAL 库的 STM32F4-Discovery (STM32F429ZIT6) 上的 RS232 (UART)?【英文标题】:RS232 (UART) on STM32F4-Discovery (STM32F429ZIT6) with HAL library? 【发布时间】:2016-04-28 13:18:59 【问题描述】:

背景

这是我的一些背景,以便您的人可以知道我拥有或不拥有的相关知识。我完全是这种嵌入式系统的新手。而且我对电子学一无所知,我是一个纯粹的软件人。

我唯一的嵌入式系统经验是树莓派,和STM32F4 Discovery有很大的不同。

我可以通过在 Raspberry Pi 上使用标准 Linux C 库来实现 UART 读/写编程,该库通过带有电压转换器 IC 的 USB-to-RS232 适配器连接到 PC。

我的设备和开发环境

带有 STM32F429ZIT6 MCU 的 STM32F429I-DISCO 板 USB 转 RS232 电缆和电压转换器 IC,在 Raspberry Pi 上运行良好。 Keil uVision 5 IDE。

我想要达到的目标

我想在 STM32F429 Discovery 板上实现一个可以向/从 PC 发送/接收消息的编程。 (例如,发送一个字符串到 PC。当收到来自 PC 的字符串时,点亮板上的 LED)

我现在做了什么

现在我已经设置了我的 Keil uVision IDE,并且可以编译/运行闪烁 LED 示例,我还可以编辑该示例以按照我想要的方式控制 LED。 (例如,按下用户按钮时 LED 亮,松开按钮时 LED 熄灭)

所以 LED 部分已经完成了,缺少的部分是如何使用 RS232 电缆与 STM32F4 Discovery 板通信。

我的问题

    首先,我想知道我是否正确理解了此板的 PIN 定义。根据datasheet,我应该将 DB9 上的 TX 引脚连接到 PD2(UART5_RX),DB9 上的 RX 引脚连接到 PC12(UART5_TX),DB9 上的 VCC 引脚连接到 3.3V,DB9 上的 GND 连接到 GND。这种连接是否正确?

    是否有任何关于如何在来自最新版本的 Keil uVision 的新 HAL 库上使用 UART 的示例代码?我在网上搜索过,但大多数示例代码或tutorial 都使用了一个名为RCC_AHB1PeriphClockCmd 的函数,该函数似乎不存在于来自 Keil uVision 的新 HAL 库中。

更新

    我的 USB 转串口适配器是 067b:2303 Prolific Technology, Inc. PL2303 Serial Port,并附有电平转换器 IC。看起来像这样:

    连接树莓派时,我一直关注这个instruction,所以IC上的VCC / GND连接到树莓派上的3.3V / GND,我不确定是否需要这样做.

    通过“HAL”库,我的意思是这个stm32f4xx_hal_usart.c 文件,根据 cmets 中的许可证声明,它似乎来自 STMicroelectronics。虽然这个文件中有一些说明,但我仍然很难弄清楚如何使用这个驱动程序。比如我分不清Enable USARTx interface clockEnable the clock for USART GPios的区别,也不知道怎么实现这些功能。因此,如果有示例代码,那将是一个很大的帮助,因为我可以将其与这些说明进行比较。

【问题讨论】:

你可以只走裸机路线,通常就像尝试让一些库工作一样快速和容易github.com/dwelch67/stm32_samples我没有那个确切的电路板,但 stm32 外围设备在芯片上的相似之处多于不同. 为什么涉及5V?根本不需要,树莓派也不需要。你有什么样的 USB 电缆 RS232 电压水平会破坏这些芯片中的任何一个,你永远不能使用 RS232。或者您是否错误地使用术语 RS232 来暗示串行协议而不是电压标准。我使用基于 usb ftdi 的分线器和提供 3.3v UART 接口的电缆,只需要连接 rx 和 tx,真的想使用同一台计算机来避免浮动接地,而且你真的不需要接地。如果你觉得有需要的话,rx、tx 和接地。 如果您想使用他们的库,请联系 st 技术支持和/或浏览代码并弄清楚。 yes UART5_TX 使用 PC12,复用功能 8 和 UART5_RX 使用 PD2 复用功能 8。还有其他 uart。 uart5基地址为0x40005000 GPIOC基地址为0x40020800,GPIOD基地址为0x40020C00。需要设置 RCC_APB1ENR 位 20 以启用 uart5,RCC_AHB1ENR 位 2 和 3 启用 GPIOC 和 D 逻辑。 rcc基地址是0x40023800等等…… 这个库是为 Keil 还是为 gnu 或其他编写的?这个问题是关于我想为 HAL 使用不同的编译器还是我不知道如何使用 HAL 的问题。 【参考方案1】:

我已经将Code for this answer推送到以下github地址。

代码很简单,回答了问题,主要由STM-Cube生成。 .ioc 文件也可供您修改。

还有许多其他外围设备可供使用,但未经测试,包括

USB VCport 
Timers set for RC hobby servos, just change pulse width 500-1500
ADC  in DMA mode
SPI  for flash etc
I2C  for port expansion or whatever

我与 OP 一样感到沮丧,因为他们花了很多天、几周和几个月的时间来努力让这些东西在新旧库上都能正常工作。 终于在 2016 年似乎有来自 ST 的一些曙光,我可以继续为这些出色的电路板制作真正的应用程序。

事实上,在执行此任务时,我必须重新安装我的多维数据集及其所有库,然后才能正常工作,这可能会给其他人带来痛苦。

我将在这个“模板”中添加 LCD 和触摸屏,以制作一个很棒的小“droidlet”。

我通常将蓝牙模块连接到其中一个 UART 并通过那里进行调试。

Andy Brown Andy Brown 为一些 ST 提供了一些很棒的 C++ 库。它们似乎基于 StdPeripheral 库,需要更新,以便我们可以通过 Cube 和 HAL 在新(和旧)设备上使用它们。作为一个社区,我们可以更有效地做到这一点。有什么想法和接受者吗?

玩得开心。


规范的解决方案
Update your Cube and HAL libraries to the latest
Generate a cube project
Setup all your peripherals in the dialogs
Generate code
Compile
Add your application
Test  & Debug
Optimise
Release

您只需要注意不同系列的类似外围设备存在不一致之处,例如 F0 上的 ADC 与 F1 和 F4 不同。 F3 可能具有 16 位 ADC。


除了 RTFM 之外,您可能正在正确地做所有事情。 (阅读手册中的精美印刷品)

除非您想与 UART 抗争,否则最好实施使用标准 USB 电缆的 Virtual Comport 演示。让 ST 成为设备。

获取 STCube 的副本,在项目/外围设备目录中查找 USB 和 Virtual comport。 HAL库也是一样,也有这段代码。

在任何 Discovery 板上工作时,启动 STM32 Cube (free from ST) 的副本,并在那里创建您的配置。它向您展示了什么是使用的,什么是免费的,一个很棒的工具,并将设置 USB 作为奖励。

然后使用代码生成器为 KEIL 项目创建骨架。编译,运行添加你的应用代码和:-)

您可能想在这里查看Embitz.org 他们有一个很棒的 IDE 和更好的 F429iDisco 示例或ST AC6 IDE 和ST page 以获得更多示例。这些 IDE 没有代码大小限制,您在此设备上使用 LCD、触摸等会遇到一些问题。


答案的其余部分

不幸的是,STM 不得不将这一发现的大部分引脚分配给板载 LCD、触摸和内存芯片。剩下的异步功能非常少 - 他们可能认为 USB 可以。

Q1) - 这些通常标记的方式需要通过将 Rx 连接到 TX 来“交叉”,反之亦然。

通过在 UART 引脚上连接“环回”来检查您的代码并检查 LED。

Q2) - STM Cube 将为您生成一个工作的 Keil 项目。

有可以编译和运行的演示代码 带有 Keil 项目 (MDK-ARM) 的 stm32cube_fw_f4_v130\STM32Cube_FW_F4_V1.3.0\Projects\STM32F429I-Discovery\Examples\UART。您需要更改为 UART5 - 它配置为 USART1 PA9(Tx) /PA10(RX),一旦工作交换到 UART5,或在本地测试 USART1 -> UART5。

通过在发现时将 RX 连接到 Tx 进行测试,设置 Rx 然后 TX 一个字符串都应该工作并且 Rxbuffer 应该反映这一点。

然后连接到您的适配器一切都应该工作。LED应该闪烁。

如果不是,则交换 Tx 和 Rx。

检查 DB9 上的环回。

如果您在 DB9 上有调制解调器或 PC,则需要先管理调制解调器控制信号,然后才能进行任何操作。 (RTC、CTS、DCD、DTR、DTE)See here。 Raspberry 会为您做到这一点。

断开 STM 与适配器的连接,然后在 DB9 上检查来自 PC 的环回,然后在 Tx Rx 引脚上检查。

如果您走到这一步,STM 会闪烁一个 LED,远程闪烁另一个 LED,那么您就会遇到奇偶校验、波特率或字长问题。


以下是 407 发现(原始发现) - 很抱歉最初没有看到您拥有 429 - 我们倾向于谈论 F4Discovery 与 F429i-Discovery。现在还有其他基于 F4 的板。

在 F4-Discovery 板上 - UART5 不可用,与 PC12 上使用的 CS43L422(麦克风)的 I2S3D 冲突。与 F429 相同的引脚过载问题

其他 UART 和 USART1 也被使用。

任一 - 为 USART2 或 USART3 配置

积极的是 USARTS 2 和 3 已内置 RTS/CTS 线路,您可以使用。

您需要在板上焊接/拆焊跳线以禁用麦克风。

我已经在几个不同的 STM32 板上使用 USARTS 生成了许多项目,它们都可以完美运行。不幸的是,HAL 程序员只提供有或没有超时的固定长度的驱动程序,没有 Readline 接口。

【讨论】:

谢谢,您的回答对我帮助很大。我已经从 STM Cube 成功创建了一个项目,现在可以发送/接收 UART 消息。 :-) @Brian- 谢谢,我昨天也做了同样的事情。 ST 确实改进了 Cube 和 Ac6(由于许可证成本,我没有使用 Keil)。 Cube 中“可能”存在一个问题,其中一些外围设备组合的时钟分频器的 RCC 配置 - 更有可能是白痴在我的键盘上按下键 :-) 我没有发布,直到我确定发生了什么并且可以重现结果。然后我会在这里和 Github 上发帖。你发现了什么?

以上是关于带有 HAL 库的 STM32F4-Discovery (STM32F429ZIT6) 上的 RS232 (UART)?的主要内容,如果未能解决你的问题,请参考以下文章

STM32基于HAL库的中断详细学习

STM32F4 HAL库开发 -- 新建基于 HAL 库的工程模板

STM32F4 HAL库开发 -- 新建基于 HAL 库的工程模板

STM32F4 HAL库开发 -- 新建基于 HAL 库的工程模板

stm32的HAL库的注意点

STM32 HAL库和LL库的区别