【发布时间】:2018-08-07 08:25:15
【问题描述】:
我正在学习 STM32 编程并尝试在 GPIO 引脚上使用 USART 外设实现简单的异步串行通信。
HAL manual 描述了如何使用 HAL USART 驱动程序:
- 声明一个 USART_HandleTypeDef 结构
- 实现 HAL_USART_MspInit()
- 启用 USART 和 GPIO 时钟
- 配置 GPIO
- 在 USART_InitTypeDef 中编程通信参数
- 调用 HAL_USART_Init()
在编写代码时,我声明了 USART_HandleTypeDef,本能地填充了我的 USART_InitTypeDef 结构并开始填充 HandleTypeDef:
USART_HandleTypeDef UsartHandle;
USART_InitTypeDef UsartInit;
UsartInit.BaudRate = 9600;
UsartInit.WordLength = USART_WORDLENGTH_8B;
UsartInit.StopBits = USART_STOPBITS_1;
UsartInit.Parity = USART_PARITY_NONE;
UsartInit.Mode = USART_MODE_TX_RX;
UsartHandle.Instance = USART6;
UsartHandle.Init = &UsartInit;
/* do I really have to init EVERY data field? */
HAL_USART_Init(&UsartHandle);
然后我注意到有很多数据字段要填写。参考手册和网络上的代码示例,我注意到没有人真正定义所有 USART_HandleTypeDef 字段 - 他们以某种方式将 HandleTypeDef 和 InitTypeDef 组合在一个步骤中,如下所示:
UART_HandleTypeDef UartHandle;
UartHandle.Init.BaudRate = 9600;
UartHandle.Init.WordLength = UART_DATABITS_8;
UartHandle.Init.StopBits = UART_STOPBITS_1;
UartHandle.Init.Parity = UART_PARITY_NONE;
UartHandle.Init.HwFlowCtl = UART_HWCONTROL_NONE;
UartHandle.Init.Mode = UART_MODE_TX_RX;
UartHandle.Init.Instance = USART1;
HAL_UART_Init(&UartHandle);
这是如何运作的?我必须学习 C 语法的哪一部分,才能理解 从哪里来 UartHandle.Init.xxx 来自?
是否有可能按照我的计划“走很长的路”?如果我不填写 HandleTypeDef 的每个数据字段,它们在哪里初始化?
PS。我没有使用 STM32 推荐的 IDE 或 CubeMX,在 Linux 上工作,使用 PlatformIO。板子:STM32F746 发现套件
PPS。我真的不确定是将这个问题放在这里还是放在电子堆栈上。如果它不适合此 stackexchange,请纠正我或将问题移到那里。
【问题讨论】:
-
ST“HAL”实际上并不是一个 API,它更多的是围绕“可怕的硬件寄存器”的一系列包装函数。这背后并没有什么特别的 C 语法秘密,一切都是为了理解奇怪的 ST 库。
-
关于您的 PPS:关于微控制器固件的问题在这两个网站上都非常热门。但请不要同时在两个站点上交叉发布!如果您有与 SW/HW 交界的问题,则应使用 EE 站点。一般来说,像微控制器驱动程序这样的问题在 EE 上会得到更好的答案。
-
好的!感谢 PPS 的澄清。此外,很高兴知道我不是唯一一个认为 ST 库很奇怪的人......但作为 STM32 的初学者,我不想立即深入研究裸机编程。
-
简单的答案。不要使用英国媒体报道。只需使用裸寄存器。
-
对于 uC 编程,您需要非常了解 C。花更多时间学习这门语言 你的问题表明你不懂 C。你在没有很好理解基本主题的情况下学到了一些东西
标签: c syntax embedded stm32 hal