[其他ST产品] STM32串口发送接收数据

[复制链接]
1556|36
 楼主| 在水一方00 发表于 2023-9-24 00:43 | 显示全部楼层 |阅读模式
1.串口通信 92936650f158274b46.png

我用的32是stm32f10x最小系统没有UART4和UART5
USART : 通用同步异步收发器
UART : 通用异步收发器
nRTS : 请求发送
nCTS : 请求接收
区别:USART指单片机的一个IO端口模块,可以根据需要配置成同步模式(SPI,IIC),也可以配置成异步模式(UART).可以理解为USART为SPI,IIC对等的”协议”。 UART则不是一个协议,为一个实体。


 楼主| 在水一方00 发表于 2023-9-24 00:43 | 显示全部楼层
串口的结构体
93628650f15b24fce2.png
38498650f15b9a8205.png
 楼主| 在水一方00 发表于 2023-9-24 00:43 | 显示全部楼层
96931650f15c1f1516.png
Fck : 串口的时钟(APB1 36M / APB2 72M )
USARTDIV : 无符号的定点数

115200= 72 * 1000000/16 * USARTDIV
 楼主| 在水一方00 发表于 2023-9-24 00:44 | 显示全部楼层
3.如何配置串口的发送
1.配置时钟: GPIO口的时钟,串口的时钟, 引脚复用的时钟
2.配置GPIO的结构体
3.配置串口的结构体
4.串口的发送
 楼主| 在水一方00 发表于 2023-9-24 00:44 | 显示全部楼层
72446650f15efa498a.png
4.通过串口向电脑发送ok字符
按照上面的四个步骤进行编写
我们会发现只能一个一个发送字符,比较麻烦,所以后面封装了一个可以发送字符串的函数。
usart.c
 楼主| 在水一方00 发表于 2023-9-24 00:44 | 显示全部楼层
  1. #include "usart.h"
  2. #include "stm32f10x.h"

  3. void usart_init(void)
  4. {
  5.         GPIO_InitTypeDef gpio_init;
  6.         USART_InitTypeDef usartStruct;
  7.        
  8.         //1.ÅäÖÃʱÖÓ£ºGPIO¿ÚµÄʱÖÓ£¬Òý½Å¸´ÓõÄʱÖÓ£¬´®¿ÚµÄʱÖÓ
  9.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
  10.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
  11.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
  12.        
  13.         //2.ÅäÖÃGPIOµÄ½á¹¹Ìå
  14.         //2.1 TX
  15.         gpio_init.GPIO_Mode = GPIO_Mode_AF_PP;
  16.         gpio_init.GPIO_Pin = GPIO_Pin_9;
  17.         gpio_init.GPIO_Speed = GPIO_Speed_10MHz;
  18.        
  19.         GPIO_Init(GPIOA,&gpio_init);
  20.        
  21.         //2.2 RX
  22.         gpio_init.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  23.         gpio_init.GPIO_Pin = GPIO_Pin_10;
  24.        
  25.         GPIO_Init(GPIOA,&gpio_init);
  26.        
  27.         //3.ÅäÖô®¿ÚµÄ½á¹¹Ìå
  28.         usartStruct.USART_BaudRate = 115200;
  29.         usartStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  30.         usartStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  31.         usartStruct.USART_Parity = USART_Parity_No;
  32.         usartStruct.USART_StopBits = USART_StopBits_1;
  33.         usartStruct.USART_WordLength = USART_WordLength_8b;
  34.        
  35.         USART_Init(USART1,&usartStruct);
  36.         USART_Cmd(USART1, ENABLE );
  37.        
  38. }

 楼主| 在水一方00 发表于 2023-9-24 00:45 | 显示全部楼层
usart.h
  1. #include "stm32f10x.h"

  2. void usart_init(void);

 楼主| 在水一方00 发表于 2023-9-24 00:45 | 显示全部楼层
main.c

  1. #include "stm32f10x.h"
  2. #include "led.h"
  3. #include "relay.h"
  4. #include "shake.h"
  5. #include "exti.h"
  6. #include "usart.h"

  7. void delay(uint16_t time)
  8. {
  9.         uint16_t i =0;
  10.         while(time--){
  11.                 i=12000;
  12.                 while(i--);
  13.         }
  14. }

  15. int main()
  16. {
  17.         usart_init();
  18.        
  19.         while(1)
  20.         {
  21.                 USART_SendData(USART1,'n');
  22.                 //ÏÂÃæUSART_GetFlagStatusΪÁËÅжÏÊý¾Ý¼Ä´æÆ÷ÊÇ·ñΪ¿Õ
  23.                 while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
  24.                 USART_SendData(USART1,'t');
  25.                 while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
  26.                 USART_SendData(USART1,'\n');
  27.                 while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
  28.                 delay(1000);
  29.         }

  30. }

 楼主| 在水一方00 发表于 2023-9-24 00:45 | 显示全部楼层
 楼主| 在水一方00 发表于 2023-9-24 00:45 | 显示全部楼层
封装发送字符串函数
注意:在封装发送字符串函数时,while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);是为了把数据发送完
usart.c
  1. #include "usart.h"
  2. #include "stm32f10x.h"

  3. void usart_init(void)
  4. {
  5.         GPIO_InitTypeDef gpio_init;
  6.         USART_InitTypeDef usartStruct;
  7.        
  8.         //1.ÅäÖÃʱÖÓ£ºGPIO¿ÚµÄʱÖÓ£¬Òý½Å¸´ÓõÄʱÖÓ£¬´®¿ÚµÄʱÖÓ
  9.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
  10.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
  11.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
  12.        
  13.         //2.ÅäÖÃGPIOµÄ½á¹¹Ìå
  14.         //2.1 TX
  15.         gpio_init.GPIO_Mode = GPIO_Mode_AF_PP;
  16.         gpio_init.GPIO_Pin = GPIO_Pin_9;
  17.         gpio_init.GPIO_Speed = GPIO_Speed_10MHz;
  18.        
  19.         GPIO_Init(GPIOA,&gpio_init);
  20.        
  21.         //2.2 RX
  22.         gpio_init.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  23.         gpio_init.GPIO_Pin = GPIO_Pin_10;
  24.        
  25.         GPIO_Init(GPIOA,&gpio_init);
  26.        
  27.         //3.ÅäÖô®¿ÚµÄ½á¹¹Ìå
  28.         usartStruct.USART_BaudRate = 115200;
  29.         usartStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  30.         usartStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  31.         usartStruct.USART_Parity = USART_Parity_No;
  32.         usartStruct.USART_StopBits = USART_StopBits_1;
  33.         usartStruct.USART_WordLength = USART_WordLength_8b;
  34.        
  35.         USART_Init(USART1,&usartStruct);
  36.         USART_Cmd(USART1, ENABLE );
  37.        
  38. }

  39. //·â×°ÁËһϷ¢ËÍ×Ö·û
  40. void usartSendByte(USART_TypeDef* USARTx, uint16_t Data)
  41. {
  42.         USART_SendData(USARTx,Data);
  43.         while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);

  44. }

  45. //·¢ËÍ×Ö·û´®
  46. void usartSendStr(USART_TypeDef* USARTx,char *str)
  47. {
  48.         uint16_t i = 0;
  49.         do{
  50.                 usartSendByte(USARTx,*(str+i));
  51.                 i++;
  52.         }while(*(str+i) != '\0');

  53.         //ÅжÏÊÇ·ñ·¢ËÍÍê
  54.         while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
  55. }

 楼主| 在水一方00 发表于 2023-9-24 00:46 | 显示全部楼层
usart.h
  1. #include "stm32f10x.h"

  2. void usart_init(void);
  3. void usartSendByte(USART_TypeDef* USARTx, uint16_t Data);
  4. void usartSendStr(USART_TypeDef* USARTx,char *str);

 楼主| 在水一方00 发表于 2023-9-24 00:46 | 显示全部楼层
main.c
  1. #include "stm32f10x.h"
  2. #include "led.h"
  3. #include "relay.h"
  4. #include "shake.h"
  5. #include "exti.h"
  6. #include "usart.h"

  7. void delay(uint16_t time)
  8. {
  9.         uint16_t i =0;
  10.         while(time--){
  11.                 i=12000;
  12.                 while(i--);
  13.         }
  14. }

  15. int main()
  16. {
  17.         usart_init();
  18.        
  19.         while(1)
  20.         {
  21.                 usartSendStr(USART1,"Finny\r\n");
  22.                 delay(1000);
  23.         }

  24. }

 楼主| 在水一方00 发表于 2023-9-24 00:46 | 显示全部楼层
 楼主| 在水一方00 发表于 2023-9-24 00:46 | 显示全部楼层
6.重定向printf串口发送
要使用printf,我们需要添加#include <stdio.h>头文件(学过c的都应该知道吧)

记得要给下图框住的内容打勾哦
22491650f1675aefae.png
 楼主| 在水一方00 发表于 2023-9-24 00:47 | 显示全部楼层
stdio.h文件中有一个宏定义fputc,我们需要使用printf只需要重定向fputc就可以使用啦
19096650f16846bde1.png
 楼主| 在水一方00 发表于 2023-9-24 00:47 | 显示全部楼层
usart.h
  1. #include "stm32f10x.h"
  2. #include <stdio.h>

  3. void usart_init(void);
  4. void usartSendByte(USART_TypeDef* USARTx, uint16_t Data);
  5. void usartSendStr(USART_TypeDef* USARTx,char *str);
 楼主| 在水一方00 发表于 2023-9-24 00:47 | 显示全部楼层
usart.c
  1. #include "usart.h"
  2. #include "stm32f10x.h"

  3. void usart_init(void)
  4. {
  5.         GPIO_InitTypeDef gpio_init;
  6.         USART_InitTypeDef usartStruct;
  7.        
  8.         //1.ÅäÖÃʱÖÓ£ºGPIO¿ÚµÄʱÖÓ£¬Òý½Å¸´ÓõÄʱÖÓ£¬´®¿ÚµÄʱÖÓ
  9.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
  10.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
  11.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
  12.        
  13.         //2.ÅäÖÃGPIOµÄ½á¹¹Ìå
  14.         //2.1 TX
  15.         gpio_init.GPIO_Mode = GPIO_Mode_AF_PP;
  16.         gpio_init.GPIO_Pin = GPIO_Pin_9;
  17.         gpio_init.GPIO_Speed = GPIO_Speed_10MHz;
  18.        
  19.         GPIO_Init(GPIOA,&gpio_init);
  20.        
  21.         //2.2 RX
  22.         gpio_init.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  23.         gpio_init.GPIO_Pin = GPIO_Pin_10;
  24.        
  25.         GPIO_Init(GPIOA,&gpio_init);
  26.        
  27.         //3.ÅäÖô®¿ÚµÄ½á¹¹Ìå
  28.         usartStruct.USART_BaudRate = 115200;
  29.         usartStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  30.         usartStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  31.         usartStruct.USART_Parity = USART_Parity_No;
  32.         usartStruct.USART_StopBits = USART_StopBits_1;
  33.         usartStruct.USART_WordLength = USART_WordLength_8b;
  34.        
  35.         USART_Init(USART1,&usartStruct);
  36.         USART_Cmd(USART1, ENABLE );
  37.        
  38. }

  39. //·â×°ÁËһϷ¢ËÍ×Ö·û
  40. void usartSendByte(USART_TypeDef* USARTx, uint16_t Data)
  41. {
  42.         USART_SendData(USARTx,Data);
  43.         while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);

  44. }

  45. //·¢ËÍ×Ö·û´®
  46. void usartSendStr(USART_TypeDef* USARTx,char *str)
  47. {
  48.         uint16_t i = 0;
  49.         do{
  50.                 usartSendByte(USARTx,*(str+i));
  51.                 i++;
  52.         }while(*(str+i) != '\0');

  53.         //ÅжÏÊÇ·ñ·¢ËÍÍê
  54.         while(USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET);
  55. }

  56. int fputc(int ch,FILE *f)
  57. {
  58.         USART_SendData(USART1,(uint8_t)ch);
  59.         while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
  60.        
  61.         return (ch);
  62. }

 楼主| 在水一方00 发表于 2023-9-24 00:47 | 显示全部楼层
main.c
  1. #include "stm32f10x.h"
  2. #include "led.h"
  3. #include "relay.h"
  4. #include "shake.h"
  5. #include "exti.h"
  6. #include "usart.h"
  7. #include "stdio.h"

  8. void delay(uint16_t time)
  9. {
  10.         uint16_t i =0;
  11.         while(time--){
  12.                 i=12000;
  13.                 while(i--);
  14.         }
  15. }

  16. int main()
  17. {
  18.         usart_init();
  19.        
  20.         GPIO_SetBits(GPIOA, GPIO_Pin_3);
  21.         GPIO_SetBits(GPIOC, GPIO_Pin_13);
  22.        
  23.         while(1)
  24.         {
  25. //                usartSendStr(USART1,"°ÂÀï¸ø\r\n");
  26.                 int i = printf("Finny\r\n");
  27.                 printf("%d\r\n",i);
  28. //                putchar('2');
  29.                
  30.                 delay(1000);
  31.         }
  32. }


 楼主| 在水一方00 发表于 2023-9-24 00:48 | 显示全部楼层
图下为什么i不是5而是7呢,因为\r\n各占了1

重定向fputc不只可以使用printf还可以使用putchar,大伙可以试试呀
19095650f16cc0b3eb.png
 楼主| 在水一方00 发表于 2023-9-24 00:48 | 显示全部楼层
串口输入控制LED灯开关
输入o让led灯打开并输出Open LED light success,输入c让led灯关闭并输出Close LED light success

提示: main.c中会看见有外部中断的代码,这是之前做震动感应灯的点此进入 STM32 EXTI(外部中断)
71949650f16de2ee3f.png
您需要登录后才可以回帖 登录 | 注册

本版积分规则

51

主题

581

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部