【北京迅为】《STM32MP157开发板使用手册》- 第二十九章Cortex-M4串口实验
iTOP-STM32MP157开发板采用ST推出的双核cortex-A7+单核cortex-M4异构处理器,既可用Linux、又可以用于STM32单片机开发。开发板采用核心板+底板结构,主频650M、1G内存、8G存储,核心板采用工业级板对板连接器,高可靠,牢固耐用,可满足高速信号环境下使用。共240PIN,CPU功能全部引出:底板扩展接口丰富底板板载4G接口(选配)、千兆以太网、WIFI蓝牙模块HDMI、CAN、RS485、LVDS接口、温湿度传感器(选配)光环境传感器、六轴传感器、2路USB OTG、3路串口,CAMERA接口、ADC电位器、SPDIF、SDIO接口等
第二十九章Cortex-M4串口实验
本章节最终所完成的实验例程存放路径为“iTOP-STM32MP157开发板网盘资料汇总\06_Cortex-M4实验例程\05_UART.zip”。
串口设备是我们在嵌入式开发中最常用的外设之一,我们通过串口打印信息可以调试程序的运行,通过串口我们也可以链接很多种外设,比如串口打印机,蓝牙,wifi,GPS,GPRS 等等。
29.1 串口简介
串行接口简称串口,也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方式的扩展接口。串行接口(Serial Interface)是指数据一位一位地顺序传送。其特点是通信线路简单,只要一对传输线就可以实现双向通信(可以直接利用电话线作为传输线),从而大大降低了成本,特别适用于远距离通信,但传送速度较慢。
串行接口 (Serial Interface) 是指数据一位一位地顺序传送,其特点是通信线路简单,只要一对传输线就可以实现双向通信(可以直接利用电话线作为传输线),从而大大降低了成本,特别适用于远距离通信,但传送速度较慢。一条信息的各位数据被逐位按顺序传送的通讯方式称为串行通讯。
串行通讯的特点是:数据位的传送,按位顺序进行,最少只需一根传输线即可完成;成本低但传送速度慢。串行通讯的距离可以从几米到几千米;根据信息的传送方向,串行通讯可以进一步分为单工、半双工和全双工三种。
串口的出现是在1980年前后,数据传输率是115kbps~230kbps。串口出现的初期是为了实现连接计算机外设的目的,初期串口一般用来连接鼠标和外置Modem以及老式摄像头和写字板等设备。串口也可以应用于两台计算机(或设备)之间的互联及数据传输。由于串口(COM)不支持热插拔及传输速率较低,部分新主板和大部分便携电脑已开始取消该接口。串口多用于工控和测量设备以及部分通信设备中。
按照接口划分标准可以分为同步串行接口(SSI)和异步串行(UART)。我们用到的串口就是异步传输的(UART)。
UART作为异步串口通信协议的一种,工作原理是将传输数据的每个字符一位接一位地传输。其中各位的意义如下:
起始位:先发出一个逻辑”0”的信号,表示传输字符的开始。
数据位:数据位的个数可以是4、5、6、7、8等,构成一个字符。通常采用ASCII码。从最低位开始传送,靠时钟定位。
奇偶校验位:资料位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验资料传送的正确性。
停止位:它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。
空闲位:处于逻辑“1”状态,表示当前线路上没有资料传送。
波特率:是衡量资料传送速率的指标。表示每秒钟传送的符号数(symbol)。一个符号代表的信息量(比特数)与符号的阶数有关。例如传输使用256阶符号,每8bit代表一个符号,资料传送速率为120字符/秒,则波特率就是120baud,比特率是120*8=960bit/s。这两者的概念很容易搞错。
UART分为TTL电平和RS232电平两种。TTL电平是就是指我们的处理器上具有串口功能的引脚直接引出来,他的电平就是TTL的(高电平表示1,低电平表示0)。RS232是TTL电平通过一个232的芯片转换出来的,-3v到-15v表示1,+3v到+15v表示0。
由于现在的电脑基本都没有外接串口了,但是串口设备在我们嵌入开发中非常常用,为了解决这个问题,市面上出现了很多的usb转串口模块,他们用到的usb转串口芯片有ch340,pl2303等等。
我们开发板底板上线集成了一路USB传串口接口,我们只需要使用一根mini USB数据线,一端连接电脑,另一端连接开发板的USB-UART接口,如下图所示:
29.2 实验目的
1)学习使用STM32CubeIED配置UART串口
2)学习UART串口的输入输出
3)STM32CubeIED的熟练
29.3实验步骤
29.3.1建立UART工程
首先我们打开STM32CubeIDE软件,进入软件界面之后,我们点击File属性,选择NEW下的STM32 Project的选项,如下图所示:
然后我们会进入下图所示界面:在Part Number选择框输入STM32MP157A,然后在右边的选择界面选择STM32MP157AAA,然后点击Next选项
在Project Name框中输入工程名字UART,然后点击Finish选项即可,如下图所示:
等待工程创建完毕,会询问我们是否要安装OpenSTLinux ,由于我们是在windows环境下,所以我们不需要安装,点击NO即可
至此我们的工程创建完毕,进入工程界面如下图所示界面:
29.3.1.1 串口引脚的功能配置
首先我们在下面的搜索框之中输入我们要配置的引脚,我们在这里以PB2为例进行搜索,输入名称之后,对应的引脚在工程中会闪烁,如下图所示:
然后我们使用鼠标左键点击对应的引脚会弹出PB2的复用功能选择,我们在这里选择复用为UART4_RX功能,如下图所示:
用同样的方法对PG11进行搜索,然后我们使用鼠标左键点击对应的引脚会弹出PG11的复用功能选择,我们在这里选择复用为UART4_TX功能,如下图所示:
配置完成之后打开左侧菜单的 System CoreàGPIO 进入 GPIO 模式配置界面:如下图所示:
点击对应的引脚配置之后会弹出右下方的管脚配置界面,如上图所示:
在下方会列出要配置选项的具体说明和我们要进行的配置。
选项 GPIO Pull-up/Pull-down 用来设置 IO 口是上拉/下拉/没有上下拉。本实验我们设置为上拉(Pull-up)。
选项 GPIO mode用来设置 GPIO 口的模式,这里默认为alternate function,也就是复用功能。
选项 User Label 是用来设置初始化的 IO 口 Pin 值为我们自定义的宏,这里我们填写为 UART_RX。按照如上要求设置后的界面如下(由于PG11的配置相同,只是最后的Label值不同,也在下方列了出来):
而PG11和PB2的设置相似,只是多了出了一个选项:选项 Mzximum ouput speed 用来设置 IO 口输出速度为低速(Low)/中速(Medium)/高速 (Hign)/快速(Very High)。我们设置为高速Very High 。
设置完成之后在左侧菜单找到Connectivity下的UART4,打开之后首先选中Cortex-M4,然后配置Mode为Asynchronous(也就是异步通信模式),配置完成之后如下如图所示:
29.3.1.2 NVIC 配置
在上一小节的同一页面下找到右下方的configuration配置栏,然后进入NVIC Settings功能设置界面,使能UART4 global interrupt,配置完成如下图所示:
然后需要在在左侧菜单栏中的System Core下选择NVIC可以看到Time base:System tick timer 的优先级默认设置为15,而串口中断的优先级默认为1,串口中断的优先级是高于System tick timer 优先级的,所以我们要对优先级进行修改,将Time base:System tick timer 的优先级设置为1,而串口中断的优先级设置为2,修改完成如下图所示:
29.3.1.3时钟配置
NVIC配置完成之后在左侧菜单找到System Core下的RCC,选择打开 HSE(也就是使用外部高速时钟),并选择Crystal/Ceramic Resonator 晶体/陶瓷谐振器选项。
选择HSE(高速外部时钟)之后,打开时钟设置界面,首先将PLL3 Source Mux 设置为HSE,然后设置MCU Clock Mux为PLL3P,设置完成之后在对应的功能框之中手动输入 209 以后按下回车键,STM32CubeMX 插件会自动计算分频和倍频系数,然后在APB1DIV、APB2DIV、APB3DIV处输入 2,因为 APB1、APB2、APB3时钟最大值只能为 104.5MHz,所以我们要手动设置分频值,设置完成之后如下图所示:
至此我们的基本设置就完成了,最后需要在Project Manage下的Code Generator选项下勾选 Generate peripheral initialization as a pair of ".c/.h' files per peripheral 选项,这样可以独立生成对应外设的初始化.h 和.c 文件(方便配置的查看),如下图所示:
29.3.2工程的生成与完善
在上述的步骤完成之后,按下键盘的“Ctrl+S”组合键保存保存 UART.ioc 文件,系统开始生成初始化代码,工程生成之后如下图所示:
然后我们进行工程的完善,以及添加对应的逻辑代码。
29.3.2.1 uart.h文件的完善
首先打开uart.h文件,文件存放位置如下图所示:
进入uart.h文件后在/* USER CODE BEGIN Private defines */和/* USER CODE END Private defines */之间添加定义
uint8_t RxBuffer;
用来设置串口发送和接收缓冲区的大小。添加完成如下图所示:
29.3.2.2 uart.c文件的完善
首先打开uart.h文件,文件存放位置如下图所示:
进入uart.c文件后在/* USER CODE BEGIN 1 */和/* USER CODE END 1 */之间添加回调函数,在没有编写回调函数的时候,串口只能完成一次发送和接收,在完成一次中断接收以后,就关闭串口中断了,该回调函数的作用是实现字符的循环发送和接收,添加内容如下:
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)
{
HAL_UART_Transmit(&huart4,&RxBuffer,1,0);
HAL_UART_Receive_IT(&huart4,&RxBuffer,1);
}
添加完成之后如下图所示:
29.3.2.3 main.c文件的完善
我们要修改的main.c文件路径如下图所示:
打开main.c文件,在 /* USER CODE BEGIN 2 */和/* USER CODE END 2 */之间添加以下内容:
HAL_UART_Receive_IT(&huart4,&RxBuffer,1);
在/* USER CODE BEGIN 4 */和/* USER CODE END 4 */之间添加以下内容:
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE
{
while ((UART4->ISR & 0X40) == 0);
UART4->TDR = (uint8_t) ch;
return ch;
}
该函数的目的是实现串口输出重定向,重定向是指将fputc里面的输出指向目标设备。因printf函数调用了fputc,而fputc输出有默认指向的目标,且不同库中的fputc输出指向不同,所以需要重写fputc。
29.3.4工程的编译
在完成以上步骤之后我们点击工具栏的小锤子进行编译,编译图标如下图所示:
编译完成会在下方的终端中显示打印信息,如下图所示:
如果报错,需要自己根据错误的提示信息来进行问题的寻找和改正。
本例程实现的最终功能是,发送一个字符串,会将发送的字符串打印出来,如下图所示:
29.3.5工程的调试
由于STM32MP157的裸机部分和一般的单片机有些区别,他没有内部的存储,所以只能在程序编译成功之后,通过debug的方式来进行调试(将程序放在内存之中),调试过程如下:
首先,点击菜单栏中的小甲虫Debug调试按钮,弹出以下界面,
在弹出来的界面,按步骤,选择响应的属性(该步骤为Jlink的步骤,如果是STLink,调试探头选择对应的即可)。如下图所示:
选择完成之后,点击右下角的Debug按钮,点击之后,会进行再一次的编译,编译完成之后会弹出如下内容(作者用的是J-LinK),这里弹出的是J-link关于设备的选择,不同调试器的弹窗可能会不同
在弹出来的界面中,选择Accept接受,会弹出以下内容,继续点击下方的OK。
之后会来到设备选择界面,我们选择Cortex-M4,如下图所示:
选择Cortex-M4之后,点击右下角的OK,会弹出以下界面,选择右下角Switch.
然后会弹出一个新的页面,选择菜单栏的 resume按钮开始调试。
连接好串口之后,打开串口调试助手,当我们发送一串字符时,开发板会返还我们相同的字符。
如果想关闭调试,则点击菜单栏的终止按钮即可。