写在前面:
本文章为《ARM Cortex-M4裸机开发篇》系列中的一篇,全系列总计14篇。笔者使用的开发平台为华清远见FS-MP1A开发板(STM32MP157开发板),Cortex-M4裸机开发篇除了讲M4裸机开发外,还会讲解通过M4控制资源扩展板上的各种传感器执行器模块(包括空气温湿度传感器、LED灯、数码管、蜂鸣器、震动马达、按键中断、风扇等),本篇是M4控制资源扩展板中的一篇。
资源扩展板是FS-MP1A开发板的扩展模块,主要包含了10余种主流传感器、执行器件、总线控制器件,非常方便项目扩展用。可拓展开发智慧家庭、智能医疗、智能安防、工业控制、图像识别、环境检测等方向的10个左右综合项目,华清远见开发板也将配套提供所有项目的说明文档、实验源码、应用程序等资料。
针对FS-MP1A开发板,除了Cortex-M4裸机开发篇外,还包括其他多系列教程,包括Cortex-A7开发篇、FreeRTOS篇、Linux基础及应用开发篇、Linux系统移植篇、Linux驱动开发篇、硬件设计篇、人工智能机器视觉篇、Qt应用编程篇、Qt综合项目实战篇等。
资源扩展板介绍
硬件介绍&资源扩展板可开发项目
Cortex-M4 串行通讯接口
实验目的
熟悉STM32CubeIDE工具软件的使用。
掌握STM32CubeIDE软件的基本设计流程和设计步骤,能够使用工具进行设计、编程、仿真调试。
学习UART串口的使用方法,掌握如何利用STM32MP157A芯片的串口输入输出。
实验环境
FS-MP1A开发平台
ST-Link仿真器
STM32CubeIDE开发软件
PC机 XP、Window7/10 (32/64bit)
串口调试工具
实验原理
串口,可以说是计算机上最通用的设备通信协议之一,不过要注意别和USB(通用串行总线)搞混了。大多数计算机都带有两个基于RS232的串口,同时它也是仪器仪表设备的标配协议——很多GPIB兼容的设备也配有RS-232口。不仅如此,串口通信协议还能用来获取远程采集设备的数据。
串口通信的原理其实很简单:按位(bit)发送和接收字节。虽然比按字节(byte)的并行通信慢,但它的优势在于可以用一根线发送数据的同时用另一根线接收数据,简单可靠且能实现远距离通信。典型的应用是传输ASCII码字符。通信只需要3根线:地线、发送线、接收线。由于它是异步通信,端口能在一根线上发数据的同时在另一根线上收数据。其他线用于握手,但不是必须的。串口通信最重要的参数有四个:波特率、数据位、停止位和奇偶校验。
对于两个进行通信的端口,这些参数必须匹配。来逐一看看:
波特率: 衡量通信速度的参数,表示每秒钟传送的bit个数。比如300波特就是每秒300个bit。当协议要求4800波特率时,时钟就是4800Hz,意味着数据线的采样率为4800Hz。常见电话线的波特率是14400、28800和36600。波特率可以远高于这些值,但要注意波特率和距离成反比——高波特率通常用于放置很近的仪器之间通信,典型的例子是GPIB设备。
数据位: 实际通信中数据位的个数。标准值有5、7、8位,具体取决于你要传送的信息。比如标准ASCII码是0~127(7位),扩展ASCII码是0~255(8位)。如果传输简单的文本,每个数据包用7位数据就够了。每个“包”指一个字节,包含开始/停止位、数据位和奇偶校验位。
停止位: 表示单个包的最后一位,典型值为1、1.5和2位。这里的1.5位数据宽度就是1.5个波特率。由于每个设备有自己的时钟,通信中可能出现不同步,停止位不只是传输结束的标志,还给计算机提供了校正时钟同步的机会。停止位越多,对时钟同步的容忍度越大,但数据传输率也越慢。
奇偶校验位: 一种简单的检错方式,有四种:偶、奇、高、低,当然也可以不用。对于偶校验和奇校验,串口会在数据位后面设置一个校验位,确保传输的数据有偶数个或奇数个逻辑高位。例如数据是011,偶校验时校验位为0(逻辑高共2个,偶数),奇校验时校验位为1(逻辑高共3个,奇数)。高和低校验只是简单置位逻辑高或低,不真正检查数据。这样接收设备能判断是否有噪声干扰或不同步。
硬件流控制: 常用的有RTS/CTS流控制和DTR/DSR流控制。硬件流控制必须连接相应的电缆线。以RTS/CTS为例,通信两端的RTS、CTS对应相连。数据终端设备(如计算机)用RTS启动调制解调器的数据流,而数据通讯设备(如调制解调器)用CTS来起停计算机的数据流。编程时根据接收端缓冲区大小设置高位标志(如75%)和低位标志(如25%),当缓冲区内数据达到高位时,接收端将CTS置低电平的逻辑0,发送端检测到CTS为低后就停止发送数据,直到缓冲低于低位再将CTS置高电平。RTS则标明接收设备是否准备好接收数据,DTR/DSR的用法类似,这里不再赘述。
STM32串口设置一般遵循以下几个步骤:
- 串口时钟使能GPIO时钟使能 设置引脚复用映射
- GPIO初始化设置, 模式为复用功能
- 串口参数初始化:设置波特率,字长,奇偶校验等
- 开启中断并初始化NVIC,使能中断(如果需要中断才需此步)
- 使能串口
- 编写中断处理函数
串口硬件原理图:
HAL库函数解析:
HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
这两个函数是轮询方式发送和接收。
HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
这两个函数是以中断方式发送和接收,具体传参详见工程。注意:这两个函数里指定了缓冲区和大小并开启中断,实际上数据还在中断里处理。HAL库提供了用户中断处理函数方式,通过调用回调函数来实现:接收中断在用户代码里重定义 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart),发送中断重定义 void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)。
实验步骤
打开STM32CubeIDE → File → New → STM32 Project
在左侧搜索框内输入芯片型号STM32MP157A进行搜索,选择对应芯片,点击Next。
填写工程名,点击Finish。
点击Yes打开配置页面。
配置UART4,勾选Cortex-M4,Mode选择Asynchronous,NVIC Settings 勾选Enabled使能串口中断,搜索框搜索PB2、PG11,分别配置为UART4_RX、UART4_TX。
在Code Generator处选择为每个外设生成单独的C和H文件,这样设置方便阅读代码。
完成以上设置后,按下Ctrl+S保存,会提示是否需要生成代码,选择Yes即可自动生成代码。系统会自动生成System Clock代码。
在左侧工程文件夹找到UART_CM4子工程,打开main.c。
添加串口中断回调函数HAL_UART_RxCpltCallback:
| 12345 | void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){ HAL_UART_Transmit(&huart4, Buff, 5, 100);} |
在主函数中调用串口中断接收函数:HAL_UART_Receive_IT(&huart4, Buff, 5);
上述为新建工程配置过程,可参考12.3.2章节进行导入已有工程,工程存放路径【华清远见-FS-MP1A开发资料 2-程序源码ARM体系结构与接口技术Cortex-M44_UART】。
配置完成或导入工程后进行程序下载,具体步骤参考12.3.3节进行开发板连接,程序编译、下载。
实验现象
连接串口线,打开串口调试助手,选择串口号,波特率115200,打开串口。发送5个字符,可以看到成功接收到发送的字符。
硬件平台:华清远见FS-MP1A开发板(STM32MP157)
