• STM32F4串口USART发送为00的解决方案


    1. 检查接线是否正确
    2. 检查TX是否为复用推挽输出

       3.检查是否将TX和RX引脚重映射为USART功能

     

    • 在STM32中,每个GPIO引脚可以配置为不同的复用功能,例如UART、SPI、I2C等。
    • 具体来说,GPIO_PinAFConfig函数用于配置GPIO引脚的复用功能。它的参数包括GPIOx(x代表GPIO端口,例如GPIOA、GPIOB等)、GPIO_PinSource(指定引脚的编号,例如9代表引脚9)、GPIO_AF(指定要配置的复用功能,例如USART1)。
    • GPIOA的引脚9和引脚10配置为USART1的复用功能,这意味着这两个引脚可以用于USART1通信,而不再是普通的GPIO引脚。通过这种配置,可以将USART1与其他设备进行串口通信。

    串口发送接收的初始化代码如下

    1. /**
    2. ****************************************************************************************************
    3. * @author Archie_IT
    4. * @version V1.0
    5. * @date 2023-11-21
    6. * @brief 串口1 驱动代码
    7. * @CSDN https://blog.csdn.net/m0_61712829?type=blog
    8. ****************************************************************************************************
    9. * @attention
    10. *
    11. * 主控:stm32f429
    12. * 引脚:ch340的TXD----PA10(mcu接收)、ch340的RXD----PA9(mcu发送)
    13. *
    14. *
    15. * 修改说明:
    16. *
    17. *
    18. ****************************************************************************************************
    19. */
    20. #include "stm32f4xx.h" // Device header
    21. #include <stdio.h>
    22. #include <stdarg.h> //用于包含可变数量参数的标准头文件。
    23. uint8_t Serial_RxData;
    24. uint8_t Serial_RxFlag;
    25. void Serial_Init(void)
    26. {
    27. RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
    28. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
    29. GPIO_InitTypeDef GPIO_InitStructure;
    30. // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    31. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    32. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    33. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
    34. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    35. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    36. GPIO_Init(GPIOA,&GPIO_InitStructure);
    37. // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    38. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    39. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    40. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    41. GPIO_Init(GPIOA,&GPIO_InitStructure);
    42. GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);
    43. GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);
    44. USART_InitTypeDef USART_InitStructure;
    45. USART_InitStructure.USART_BaudRate = 9600;
    46. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    47. USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
    48. USART_InitStructure.USART_Parity = USART_Parity_No;
    49. USART_InitStructure.USART_StopBits = USART_StopBits_1;
    50. USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    51. USART_Init(USART1,&USART_InitStructure);
    52. USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
    53. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    54. NVIC_InitTypeDef NVIC_InitStructure;
    55. NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
    56. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    57. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    58. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    59. NVIC_Init(&NVIC_InitStructure);
    60. USART_Cmd(USART1,ENABLE);
    61. }
    62. void Serial_SendByte(uint8_t Byte)
    63. {
    64. USART_SendData(USART1,Byte);
    65. while (USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET);
    66. }
    67. void Serial_SendArray(uint8_t *Array,uint16_t Length)
    68. {
    69. uint16_t i;
    70. for(i=0;i<Length;i++)
    71. {
    72. Serial_SendByte(Array[i]);
    73. }
    74. }
    75. void Serial_SendString(char *String)
    76. {
    77. uint8_t i;
    78. for(i = 0;String[i] != '\0';i++)
    79. {
    80. Serial_SendByte(String[i]);
    81. }
    82. }
    83. //发送数字
    84. //x的y次方
    85. uint32_t Serial_POW(uint32_t x,uint32_t y)
    86. {
    87. uint32_t Result = 1;
    88. while(y--)
    89. {
    90. Result = Result * x;
    91. }
    92. return Result;
    93. }
    94. // Number/10的(个十百千万)位次方%10 ->求出个十百千万的每个数
    95. void Serial_SendNumber(uint32_t Number,uint8_t Length)
    96. {
    97. uint8_t i;
    98. for(i=0;i<Length;i++)
    99. {
    100. Serial_SendByte(Number / Serial_POW(10,Length - 1 - i) % 10 + 0x30);
    101. }
    102. }
    103. //fputc函数重定向到串口,printf输出到串口;方式1
    104. int fputc(int ch,FILE *f)
    105. {
    106. Serial_SendByte(ch);
    107. return ch;
    108. }
    109. //可变参数;printf方式3
    110. void Serial_Printf(char *format,...)
    111. {
    112. char String[100];
    113. va_list arg;
    114. va_start(arg,format);
    115. vsprintf(String,format,arg);
    116. va_end(arg);
    117. Serial_SendString(String);
    118. }
    119. //中断接收和变量的封装函数
    120. uint8_t Serial_GetRxFlag(void)//读后自动清除标志位
    121. {
    122. if(Serial_RxFlag == 1)
    123. {
    124. Serial_RxFlag = 0;
    125. return 1;
    126. }
    127. return 0;
    128. }
    129. uint8_t Serial_GetRxData(void)
    130. {
    131. return Serial_RxData;
    132. }
    133. //重写中断函数
    134. void USART1_IRQHandler(void)
    135. {
    136. if(USART_GetITStatus(USART1,USART_IT_RXNE) == SET)
    137. {
    138. Serial_RxData = USART_ReceiveData(USART1);
    139. Serial_RxFlag = 1;
    140. USART_ClearITPendingBit(USART1,USART_IT_RXNE);
    141. }
    142. }

  • 相关阅读:
    广州市车联网先导区LTE-V2X 车载直连通讯设备技术规范
    mybatis-plus分页
    解决问题的思路很重要,运维领域,结果对,过程就对!
    基于Python开发的飞机大战小游戏彩色版(源码+可执行程序exe文件+程序配置说明书+程序使用说明书)
    Leetcode 151. Reverse Words in a String (Python)
    P1072 [NOIP2009 提高组] Hankson 的趣味题
    [数据结构初阶]一文轻松学链表
    LeetCode_前缀树_648.单词替换
    c#winform窗体
    学习MySQL必须掌握的13个关键字,你get了吗?
  • 原文地址:https://blog.csdn.net/m0_61712829/article/details/134541204