实验课程

THIS NAME

实验课程

当前位置: 首页 >> 实验课程 >> 正文

嵌入式Cortex-M应用-串口通信

发布日期:2024-08-19    作者:陆其美     来源:     点击:

串口通信

一、实验目的

1.了解串口通信以及相关设置。

2.掌握.cubemx工程配置的方法

3.能够熟练完成串口通信用户代码。

4.掌握用库函数实串口数据传输的流程

5能够编写USART的传输函数

二、实验内容

通过STM32的串口操作,实现串口的输入和输出功能。

三、实验原理及说明

STM32 的串口非常强大,其通用同步异步收发器(USART),支持最基本的通用串口同步、异步通信,此外,还具有 LIN 总线功能(局域互联网)、IRDA 功能(红外通信)、SmartCard 功能。usart1 TX 端连接到开发板上的 PA9 引脚,RX 端连接到开发板上的 PA10 引脚

串口设置的一般步骤可以总结为如下几个步骤:

1) 串口时钟使能,GPIO 时钟使能

2) 串口复位

3) GPIO 端口模式设置

4) 串口参数初始化

5) 开启中断并且初始化 NVIC(如果需要开启中断才需要这个步骤)

6) 使能串口

7) 编写中断处理函数

四、实验设备

一套STM32实验设备头歌实践教学平台

五、实验步骤

1.1 双击打开软件 stm32cubemx

1.2 开始创建STM32F103C8T6工程。

1.3 搜索芯片STM32F103C8T6,并选择芯片型号 STM32F103C8T6 ,并点击“start project”创建工程。

1.4 芯片选择完成后,进入配置界面,配置分为如下几类:

System Core 用于配置MCU核心功能,如时钟,中断,调试接口等;

Analog 用于配置MCUADC功能;

Timers 用于配置MCU的定时器;

Connectivity 用于配置MCU外设接口,如SPIUSARTCAN等;

Computing 用于配置MCUCRC校验

Middleware 用于配置MCU的中间件,如文件系统,实时操作系统等; 学院可以根据实际需要,选择相应的功能配置,过程如下: 展开“system core”标签,找到“SYS"选项,在右边选择如图所示配置调试接口为JTAG 5脚接口,如果是其他接口,按照需要选择,配置完成后,右边的MCU预览图相应管脚会显示为绿色。

1.5 切换到”RCC“标签,配置系统时钟,本实验用到的开发板主时钟使用8MHz晶振,备份域时钟使用32.768kHz时钟,分别接在MCU的相应引脚上,所以在配置的时候HSE(高速外部时钟)选择使用外部晶振(crystal),LSE(低速外部时钟)选择使用外部晶振(crystal)。

1.6 切换到“Connectivity”标签,在实验过程中需要使用串口打印信息,所以需要配置串口功能,此处选择USART1,配置为异步通信,其他参数(奇偶校验,波特率等)使用默认即可。

undefined

到此,MCU核心功能的相关配置完成,接下来配置用户代码部分。

本次用户代码主要涉及串口配置部分,主要如下:

MODE 配置串口通讯模式,一般为异步模式

Parameter settings 用于设置串口通信波特率和格式,默认即可

1.7 切换到System Core”的“GPIO”标签,LED输出电平控制LED的亮灭,所以需要配置为输出模式,同时从原理图知道,每个LED都自带上拉电阻,所以不需要再使用内部上拉或者下拉,为了同时能输出高低电平,需要配置为推挽输出,即“push pull”,为了保证默认状态下LED为熄灭状态,设置“GPIO Output level”为“High",具体如图所示:

undefined

1.8 切换到System Core”的“NVIC”标签,由于需要使用串口接收,所以要使能中断,并配置中断优先级,中断优先级使用默认就可以,找到USART1全局中断,并使能,其他中断相关配置可以先不用理会,后续使用到了会详细说明,配置如图所示

undefined

1.9 切换到 Clock configuration,结合HSE(高速外部时钟)和LSE(低速外部时钟),设置MCU系统时钟为72MHzGPIO时钟使用APB2的时钟,时钟部分将在后续章节讲解,目前按如下配置。

undefined

以上为用户代码部分的配置,由于本次实验只用到了GPIO口相关的操作,所以只需要配置GPIO口相关的部分,以下为串口相关的配置。

本课程所有的实验据使用stm32cubeIDE编译,由于该集成开发环境不带有串口输出功能,所以为了实现串口输出,需要将串口重映射到之前配置的“USART1”,以下为串口重映射相关的操作,具体会在串口相关章节讲解。

1.10 配置工程并生成代码,输入工程名称project",具体如图所示。

undefined

切换到code generator“标签,按如图所示生成代码。

undefined

1.11 打开STM32CubeIDE,打开之前生成的工程。

点击File--> open project from file system......”。

undefined

1.12 找到生成文件的文件夹,并打开按下右边的标签MX",即可显示项目文件。

undefined

1.13 为项目添加一个C语言源文件,命名为“retarget.c”,如图所示

undefined

在文件中添加如下代码:

1. #include "retarget.h"

2. #include <_ansi.h>

3. #include <_syslist.h>

4. #include <errno.h>

5. #include <sys/time.h>

6. #include <sys/times.h>

7. #include "retarget.h"

8. #include <stdint.h>

9. //#include "usart.h"

10.

11. #if !defined(OS_USE_SEMIHOSTING)

12.

13. #define STDIN_FILENO  0

14. #define STDOUT_FILENO 1

15. #define STDERR_FILENO 2

17. UART_HandleTypeDef *gHuart;

18.

19. void RetargetInit(UART_HandleTypeDef *huart)

20. {

21.     gHuart = huart;

22.

23.     /* Disable I/O buffering for STDOUT stream, so that

24.      * chars are sent out as soon as they are printed. */

25.     setvbuf(stdout, NULL, _IONBF, 0);

26. }

27.

28. int _isatty(int fd)

29. {

30.     if (fd >= STDIN_FILENO && fd <= STDERR_FILENO)

31.         return 1;

32.

33.     errno = EBADF;

34.     return 0;

35. }

36.

37. int _write(int fd, char *ptr, int len)

38. {

39.     HAL_StatusTypeDef hstatus;

40.

41.     if (fd == STDOUT_FILENO || fd == STDERR_FILENO)

42.     {

43.         hstatus = HAL_UART_Transmit(gHuart, (uint8_t *) ptr, len, HAL_MAX_DELAY);

44.         if (hstatus == HAL_OK)

45.             return len;

46.         else

47.             return EIO;

48.     }

49.     errno = EBADF;

50.     return -1;

51. }

52.

53. int _close(int fd)

54. {

55.     if (fd >= STDIN_FILENO && fd <= STDERR_FILENO)

56.         return 0;

57.

58.     errno = EBADF;

59.     return -1;

60. }

61.

62. int _lseek(int fd, int ptr, int dir)

63. {

64.     (void) fd;

65.     (void) ptr;

66.     (void) dir;

67.

68.     errno = EBADF;

69.     return -1;

70. }

71.

72. int _read(int fd, char *ptr, int len)

73. {

74.     HAL_StatusTypeDef hstatus;

75.

76.     if (fd == STDIN_FILENO)

77.     {

78.         hstatus = HAL_UART_Receive(gHuart, (uint8_t *) ptr, 1, HAL_MAX_DELAY);

79.         if (hstatus == HAL_OK)

80.             return 1;

81.         else

82.             return EIO;

83.     }

84.     errno = EBADF;

85.     return -1;

86. }

87.

88. int _fstat(int fd, struct stat *st)

89. {

90.     if (fd >= STDIN_FILENO && fd <= STDERR_FILENO)

91.     {

92.         st->st_mode = S_IFCHR;

93.         return 0;

94.     }

95.

96.     errno = EBADF;

97.     return 0;

98. }

100. #endif //#if !defined(OS_USE_SEMIHOSTING)

1.14为项目添加一个C语言头文件,命名为“retarget.h”,如图所示

undefined

添加头文件代码如下:

1. #ifndef FIRMWARE_RETARGET_H

2. #define FIRMWARE_RETARGET_H

3. #ifndef _RETARGET_H__

4. #define _RETARGET_H__

5.

6. #include "stm32f1xx_hal.h"

7. #include <sys/stat.h>

8. #include <stdio.h>

9.

10. void RetargetInit(UART_HandleTypeDef *huart);

11.

12. int _isatty(int fd);

13.

14. int _write(int fd, char *ptr, int len);

15.

16. int _close(int fd);

17.

18. int _lseek(int fd, int ptr, int dir);

19.

20. int _read(int fd, char *ptr, int len);

21.

22. int _fstat(int fd, struct stat *st);

23.

24. #endif //#ifndef _RETARGET_H__

25. #endif //FIRMWARE_RETARGET_H

1.15 打开项目文件Core->Src->syscalls.c,为避免重定义,将以下几行注释:

undefined

1.16打开项目文件Core->Src->main.c ,在如下位置添加一行代码实现串口重映射初始化,如图所示:

undefined

以上是为了打印调试信息添加的串口重映射配置,下面开始实现任务代码部分

1.17 打开项目文件Core->Src->main.c,在如下位置添加代码,如图所示:

undefined

undefined

打开项目文件Core->Src->usart.c,在如下位置添加代码,如图所示:

undefined

1.18 编译项目,并将生成的hex文件下载到开发板,观察现象。

六、实验结果:

1、使用串口工具发送数据,开发板收到后,返回收到的数据

上一条:嵌入式Cortex-M应用-GPIO使用输入——中断按键检测 下一条:嵌入式Cortex-M应用-基本定时器

关闭