stm32简单编程,向USART1发送字符串。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了stm32简单编程,向USART1发送字符串。相关的知识,希望对你有一定的参考价值。

int main(void)

char *str;
str="abcdefg";
/*初始化*/
RCC_Configuration();
GPIO_Configuration();
USART_Configuration();
/*发送数据*/
while(*str)

USART_SendData(USART1,*str);
str++;



串口只接收到最后一个字符‘g’,但是软件仿真时外设USART1的DRR寄存器里有依次显示abcdefg的十六进制的ASCII码

参考技术A 肯定了,你要发完后查询下发送完标志,
就是在
USART_SendData(USART1,*str);//这后面加上下面判断
while(USART_GetFlagStatus(USART1, USART_FLAG_TC));//等待发送完才可以发下一个,不然会被冲掉的。

str++;本回答被提问者和网友采纳
参考技术B 发的太快了吧,读一下标志位,等待发送完成信号,再发下一个,试试

good luck!

步行者---电子单片机团
参考技术C 关于STM32 F103的USART 发送数据可以看看这篇CSDN的文章:
http://blog.csdn.net/xiaoxiaopengbo/article/details/77472093
参考技术D 你的程序这样的写法只能是最后i一个字符

STM32 HAL USART驱动程序:此语法如何工作?

我正在学习STM32编程,并试图在GPIO引脚上使用USART外设实现简单的异步串行通信。

HAL qazxsw pom描述了如何使用HAL UART驱动程序:

  1. 声明USART_HandleTypeDef结构
  2. 实现HAL_UART_transmit() 启用UART和GPIO时钟 配置GPIO
  3. 编程USART_InitTypeDef中的通信参数
  4. 调用HAL_USART_Init()

当我编写代码时,我声明了USART_HandleTypeDef,本能地填充了我的USART_InitTypeDef结构并开始填充HandleTypeDef:

manual

然后我注意到要填充的数据字段很多。参考手册和网络上的代码示例,我注意到没有人真正定义所有USART_HandleTypeDef字段 - 它们在某个步骤中以某种方式组合了HandleTypeDef和InitTypeDef,如下所示:

  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);

这是如何运作的?我需要学习C语法的哪一部分,以了解UartHandle.Init.xxx来自何处?按照我的计划,是否有可能“走很长的路”?如果我没有填充HandleTypeDef的每个数据字段,它们在哪里被初始化?

PS。我没有使用STM32推荐的IDE或CubeMX,使用PlatformIO在Linux上工作。主板:STM32F746发现套件

PPS。我真的不确定是将这个问题放在这里还是放在电子堆栈上。如果它不适合这个堆栈交换,请纠正我或移动问题。

答案

这是如何运作的?我需要学习C语法的哪一部分,以了解UartHandle.Init.xxx来自何处?

这是基本的C struct语法。 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); 结构包含一个名为USART_HandleTypeDefUSART_InitTypeDef结构的实例。您可以将其视为嵌套结构。您可以使用重复的'Init'引用嵌套结构的成员。请注意,.成员不是指向Init结构的指针。它实际上是USART_InitTypeDef实例中包含的完整USART_InitTypeDef实例。

按照我的计划,是否有可能“走很长的路”?

是的,除了您的代码包含错误。你需要做这样的任务。

USART_HandleTypeDef

请记住,UsartHandle.Init = UsartInit; // Note no `&` Init成员不是指针而是完整的结构。因此,您需要为其分配完整的结构,而不是指针。

但是要意识到,当你定义你的USART_HandleTypeDef变量时,你要为结构的一个实例分配空间。如果UsartInit是一个函数局部变量,那么该空间很可能在堆栈上。您的初始化语句正在初始化结构的副本。然后,当您将UsartInit分配给UsartInit时,编译器会创建将复制结构的全部内容的代码。复制之后,如果你的UsartHandle.Init是一个局部变量,它将超出范围并被取消分配。

实际上没有必要为自己的UsartInit结构定义和分配空间,然后将整个结构复制到USART_InitTypeDef中。 UsartHandle.Init已经包含为其UsartHandle成员分配的空间。因此,简单地直接初始化USART_InitTypeDef成员更有效,就像ST示例代码那样。

如果我没有填充HandleTypeDef的每个数据字段,它们在哪里被初始化?

您无需填写UsartHandle.Init的每个数据字段。请参阅HAL参考手册以了解初始化所需的内容。您可能只需要初始化USART_HandleTypeDefInstance成员。其余成员由HAL USART驱动程序在内部使用,它们将被驱动程序函数初始化并使用(如果有帮助,您可以将它们视为私有变量)。 API的设计者将结构成员“Init”命名为您的提示,这是您需要初始化的内容。 ST示例代码提供了初始化所需内容的进一步证据。

[Stack Overflow上的几位经验丰富的开发人员建议不要使用ST HAL,并鼓励人们根据设备的参考手册开发自己的驱动程序。意识到这些开发人员拥有多年的经验,他们使用过各种微控制器系列和外设,他们能够理解参考手册并从头开始编写驱动程序。我同意ST HAL增加了一些可能对某些应用程序有害的膨胀。但我不同意初学者应该避免使用ST HAL。 ST HAL适用于许多应用程序,初学者使用起来比从头开始编写自己的驱动程序更容易(特别是考虑到HAL提供的许多示例)。

以上是关于stm32简单编程,向USART1发送字符串。的主要内容,如果未能解决你的问题,请参考以下文章

stm32串口实验:stm32通过usart1进行串口收发,PA9(TX)和PA10(RX)

STM32请问串口要发送数据“1”该怎么赋值给USART->DR寄存器?

stm32f103c8t6 usart1不工作

在学STM32的USART1,用Printf函数向超级终端打印信息。为啥超级终端没有反应?求帮助。

stm32板的usart2设置与usart1有啥区别啊

stm32+dht11温湿度数据实验-stm32将采集dht11温湿度通过usart1在串口助手打印