历史上的今天
今天是:2024年08月28日(星期三)
2019年08月28日 | STM32Cube-USART
2019-08-28 来源:eefocus
本章以串口为例讲解,HAL 库轮询,中断,DMA 三种编程模型。
1.前情回顾
在串行通信中,一个字符一个字符地传输,每个字符一位一位地传输,并且传输一个字符时,总是以“起始位”开始,以“停止位”结束。在进行传输之前,双方一定要使用同一个波特率设置。波特率就是每秒钟传输的数据位数。
常用的两种基本串行通信方式包括同步通信和异步通信。我们通常使用的是异步通信.异步通信规定传输的数据格式由起始位(start bit)、数据位(data bit)、奇偶校验位(parity bit)和停止位(stop bit)组成。

2.重定义printf函数
打开STM32CubeMX新建工程,选择STM32F103ZE芯片,选择外部高速晶振(HSE)。USART1选择为异步通信方式。PA10设置RX接收,PA9设置为TX发送。

配置时钟

串口配置设置波特率为115200 Bits/s。传输数据长度为8 Bit。奇偶检验无,停止位1.其他参数默认。

生成报告以及代码,编译程序。在usart.c文件中可看到串口1的初始化函数MX_USART1_UART_Init(void),以及管脚配置函数HAL_UART_MspInit()。
C语言中的标准库中所用的标准输出函数,默认的输出设备是显示器,要实现串口或LCD的输出,必须重新定义标准库函数里与输出函数相关的函数。例如:printf输出到串口,需要将fputc里面的输出指向串口(重定向),方法如下:只要自己添加一个int fputc(int ch, FILE *f)函数,能够输出字符就可以了。
在usart.c文件后面添加如下代码

其中HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);这个语句表示通过串口1发个一个字符。ch为字符的存储地址,0xFFFF为超时时间。在stm32f10xx_hal_uart.c文件中可以找到HAL_UART_Transmit函数。

在main.c文件中添加应用函数。

编译程序并下载到开发板。用USB线连接开发板到电脑,在电脑上打开串口调试助手。选择对应的串口号,设置波特率为115200。会接收到如图信息。

打开stm32f1xx_hal_uart.h头文件,在文件后最后面可以看到有如下操作串口的函数。

串口的发送接收函数:
HAL_UART_Transmit();串口轮询模式发送,使用超时管理机制。
HAL_UART_Receive();串口轮询模式接收,使用超时管理机制。
HAL_UART_Transmit_IT();串口中断模式发送,
HAL_UART_Receive_IT();串口中断模式接收
HAL_UART_Transmit_DMA();串口DMA模式发送
HAL_UART_Receive_DMA();串口DMA模式接收
串口相关的中断函数:
HAL_UART_TxHalfCpltCallback():一半数据(half transfer)发送完成后,通过中断处理函数调用。
HAL_UART_TxCpltCallback():发送完成后,通过中断处理函数调用。
HAL_UART_RxHalfCpltCallback():一半数据(half transfer)接收完成后,通过中断处理函数调用。
HAL_UART_RxCpltCallback():接收完成后,通过中断处理函数调用。
HAL_UART_ErrorCallback():传输过程中出现错误时,通过中断处理函数调用。
可看到串口发送和接收有三种通信模式:
第一种是上面用到的轮询的模式。CPU不断查询IO设备,如设备有请求则加以处理。例如CPU不断查询串口是否传输完成,如传输超过则返回超时错误。轮询方式会占用CPU处理时间,效率较低。
第二种就是中断控制方式。当I/O操作完成时,输入输出设备控制器通过中断请求线向处理器发出中断信号,处理器收到中断信号之后,转到中断处理程序,对数据传送工作进行相应的处理。
第三种就是直接内存存取技术(DMA)方式。所谓直接传送,即在内存与IO设备间传送一个数据块的过程中,不需要CPU的任何中间干涉,只需要CPU在过程开始时向设备发出“传送块数据”的命令,然后通过中断来得知过程是否结束和下次操作是否准备就绪。
3.中断模式。
打开STM32CubeMX重新建工程,配置和前面一样。只是这个工程中,开启了串口中断。

生成报告以及代码,编译程序。在main函数前面添加两个数组变量。

在main函数中添加两个语句通过串口中断发送aTxStartMessage数组的数据和接收数据10个字符,保存在数组aRxBuffer中。

在main.c文件后面添加中断接收完成回调函数。中断回调函数中将接收到的数据又通过串口发送回去。

编译程序并下载到开发板。用USB线连接开发板到电脑,在电脑上打开串口调试助手。选择对应的串口号,设置波特率为115200。按下复位按键会接收到aTxStartMessage数组的数据。通过串口助手发送10个字符,串口助手回显示发送的数据。注意:串口要发够10个字符串,才会触发中断。少于10个字符则不会触发中断,串口不会显示发送的数据。超过10个字符,串口只会发送10个字符回来显示。

上面是指定数据长度接收,而且中断接收函数放在while外面只能接受一次。接下来实现串口+DMA+空闲中断接收不定长数据。
本章节文档:https://download.csdn.net/download/zdw6868/10655193
配置如下,其他配置跟上面一样

添加应用程序
Usart.h中
Usart.c

Stm32f1xx_.c

Main.c

编译程序并下载到开发板。
史海拾趣
|
光纤收发器通常具有以下基本特点: 1. 提供超低时延的数据传输。 2. 对网络协议完全透明。 3. 采用专用ASIC芯片实现数据线速转发。可编程ASIC将多项功能集中到一个芯片上,具有设计简单、可靠性高、电源消耗少等优点,能使设备得到更高的 ...… 查看全部问答> |
|
在串行数据测试中,经常会使用专门的测试夹具把待测试信号引入示波器中测量和分析,这时,待测试的串行信号链路并不在正常工作状态(即正常的业务数据流模式),而是工作在测试模式,待测试芯片的该串行链路的发送端必须强制发送出测试数据包,然后 ...… 查看全部问答> |
|
9325改横屏不成功。显示有问题。谁帮忙看一下。或者能给个横屏的驱动看一下。谢谢了 坚屏显示是没问题的。 但改成了横屏之后就显示不正常,不知是那里没改好。 #include\"STC_NEW_8051.H\" #define WINDOW_XADDR_START 0x0050 // Horizontal Start Address Set#define WINDOW_XADDR_END 0x0051 // Horizontal ...… 查看全部问答> |
|
本帖最后由 dontium 于 2015-1-23 13:12 编辑 请教TI的模拟电子方面的专家 DAC8408F TI的有什么芯片可以替换? DAC8408F为4路8位COMS D/A转换芯片 … 查看全部问答> |
|
第一种:The AD549 input offset voltage can be nulled by using balance Pin 1 and Pin 5。 Nulling the input offset voltage in this fashion introduces an added input offset voltage drift component of 2.4 μV/ ...… 查看全部问答> |
|
对于MSP430有一个特殊的系列,他们叫做AFE(Analog Front End),就是如题目所说的模拟前端。 那么这个模拟前端到底有何特点呢? 多达3 个具有差分可编程增益放大器(PGA) 输入的24 位三角积分模数(A/D) 转换器 对于430MCU来将,这个外设可能过于 ...… 查看全部问答> |




