STMCU小助手
发布时间:2022-1-25 20:24
|
一、基础认识(一) 并行通信 原理:数据的各个位同时传输 优点:速度快 缺点:占用引脚资源多,通常工作时有多条数据线进行数据传输 8bit数据传输典型连接图: 传输的数据是二进制:11101010,则通信使用8条线同时进行数据传输,发送端一次性发送8位数据,接收端一次性接收8位数据。
![]() 原理:数据按位顺序传输 优点:占用引脚资源少 缺点:速度相对较慢,通常工作时只有一条数据线进行数据传输 8bit数据传输典型连接图: 传输的数据是二进制:11101010,则通信使用8条线同时进行数据传输,发送端一次性发送8位数据,接收端一次性接收8位数据。 8bit数据传输典型连接图: 传输的数据是二进制:11101010,则通信使用1条线进行数据传输,发送端一次性发送1位数据,接收端一次性接收1位数据。
![]() 串行通信的分类: 1.单工:数据只能在一个方向上传输,通信双方数据只能由一方传输到另一方
![]() 2.半双工:数据可以错时双向传输,通信双方数据可以支持两个方向传输,但是同一时间只能由一方传输到另外一方。
![]() 3.全双工:数据可以同时双向传输,通信双方数据可以同时进行双向传输,对于其中一个设备来说,设备需要支持发送数据时可以进行数据接收。
![]() 串行通信的通讯方式: l 同步通信:带时钟同步信号的传输,如SPI、IIC、USART(同步) l 异步通信:不带时钟 同步信号的传输,如UART、USART(异步) 常见数据传输协议:
![]() UART:通用异步收发器 USART:通用同步/异步收发器,其可选使用异步方式,那将和UART无区别,如果是同步,则需要多一根时钟线(USART_CK)
![]() l 通常USART1接口的通信速率较快,其它USART接口较慢。如STM32F103C8T6的USART1接口通信速率是4.5Mbps,其它USART接口的通信速率是2.25Mbps。 l 片上所有的USART接口都可以使用DMA操作 l USART的扩展及距离:
![]() UART和COM是物理接口形式(物理接口) TTL和RS-232是电平标准(电信号) 串口接收: l 扫描模式 l 中断模式 l DMA模式
![]() 模式选择: Asynchronous 异步通信 Synchronous 同步通信 Single Wire (Half-Duplex) 单线/半双工 Multiprocessor Communication 多处理器 支持局域互连网络LIN、智能卡(SmartCard)协议与lrDA(红外线数据协会) SIR ENDEC规范。
![]() 默认的TX GPIO: l 模式为:推挽式复用功能 l 输出速率:高速 默认的RX GPIO: l 模式为:浮空输入 参数设置
![]() l Baud Rate 任意设置,未做限制,输入框
l Word Length 数据位可选8位或9位
![]() l Parity 校验位可选无校验(None)、偶校验(Even)、奇校验(Odd)
![]() l Stop Bits 停止位可选1位、2位
![]() l Data Direction 数据方向,可选收发(Receive and Transmit)、只接收(Receive Only)、只发送(Transmit Only)
![]() 以阻塞模式发送大量数据 当没有启用UART奇偶校验( PCE sign0 ),并且单词长度配置为9位( m1 - m0 sign01 )时,*发送的数据作为一组U16处理。在9位/无奇偶校验传输的情况下,pData需要作为uint16_t指针处理
参数: huart: 指向uart _ handletypedef结构的huart指针,该结构包含指定uart模块的配置信息。 PData: 指向数据缓冲区的pData指针(U8或u16数据元素)。 Size: 要发送的数据元素( u8或U16 )的大小 Timeout:超时持续时间,单位ms,0就是0ms超时,数据最大发送时间,超过则返回异常 返回: HAL 状态
例如:
四、串口扫描接收(一)相关函数 l 阻塞接收函数 在阻塞模式下接收大量数据。 当没有启用UART奇偶校验( PCE sign0 ),并且单词长度配置为9位( m1 - m0 sign01 )时,*接收到的数据作为一组U16处理。
huart: 指向uart _ handletypedef结构的huart指针,该结构包含指定uart模块的配置信息。 pData:指向数据缓冲区的指针( u8或U16数据元素)。 Size: 要接收的数据元素数量( u8或U16 )。 Timeout:超时持续时间,单位ms,0就是0ms超时,数据接收最大等待时间,超出则异常 返回: HAL 状态
例如:
(二)代码实现
其中timeout为0表示没有延时,所以串口接收函数是不阻塞的,while循环将一直轮询 加个延时函数
![]() 这样一来的话,接收数据就异常了,会接收数据不全,所以这样是不可靠的 那改成这样呢?
接收100个数据,等待时间为1秒,这样的话接收区没满时,每次运行这条语句都要延时等待1S,这时相当于一个HAL_Dealy(1000),这会阻塞while循环。只有数据接收到刚刚等于100才能返回HAL_OK,所以不能用于接收变成数据,这是不理想的。 五、 串口中断接收(一)cubemx设置 使能串口中断
![]() 优先级选择
![]() Preemption Priorit:抢占优先级 Sub Priority :子优先级 数字越小优先级越高 自动生成的代码中已经使能了中断
![]() l 接收中断开启,只开启一次中断 以非阻塞模式接收一定数量的数据,当UART奇偶校验未启用(PCE = 0),且字长配置为9位(M1-M0 = 01)时, *接收到的数据作为一组u16处理。在这种情况下,Size必须指出数字 *的u16可通过pData。
参数: huart: 指向uart _ handletypedef结构的huart指针,该结构包含指定uart模块的配置信息。 pData:指向数据缓冲区的指针(u8或u16数据元素)。 Size:需要接收的数据元素(u8或u16)的数量。 返回: HAL 状态
l 中断接收回调函数 HAL_UART_RxHalfCpltCallback();一半数据接收完成时调用 HAL_UART_RxCpltCallback();数据完全接受完成后调用 函数原型
(三) 编程实现方法1[url=] [/url]
存在问题: 数据发送太快之后就可能导致单片机无法再接收数据,以至于永久性损坏,通常可以在主循环里判断标志位再次启动,可以避免永久性损坏问题。
![]() 修改stm32f1xx_it.c里面的串口中断
标准函数
修改了HAL自带的串口中断函数,可以有效的避免接收中断失效问题,但是你测试的时候会发现串口助手发送的数据和串口助手接收到的数据不完整,这是正常的,因为中断接收是很快的,而发送是阻塞的,而实际也不会这样使用,所以一般都会用数组做缓冲区接收串口数据。 六、 配置串口为中断接收DMA发送l STM32可用DMA的外设:定时器、ADC、SPI、IIC、USART l 使用DMA必须开启中断 l 串口DMA模式最大为u16个字节,则65535 (一)cubmx设置通用配置 ![]()
中断开启
![]() ![]()
![]() Dirction : DMA传输方向 四种传输方向: l 外设到内存 Peripheral To Memory l 内存到外设 Memory To Peripheral l 内存到内存 Memory To Memory l 外设到外设 Peripheral To Peripheral Priority: 传输速度 l 最高优先级 Very Hight l 高优先级 Hight l 中等优先级 Medium l 低优先级;Low Priority: 优先级 l 最高优先级 Very Hight l 高优先级 Hight l 中等优先级 Medium l 低优先级;Low mode:模式 l Normal:正常模式,当一次DMA数据传输完后,停止DMA传送 ,也就是只传输一次 l Circular: 循环模式,传输完成后又重新开始继续传输,不断循环永不停止 Increment Address:地址增加 l Peripheral:设置传输数据的时候外设地址是不变还是递增。如果设置 为递增,那么下一次传输的时候地址加 Data Width个字节,勾选表示递增。 l Memory:设置传输数据时候内存地址是否递增。如果设置 为递增,那么下一次传输的时候地址加 Data Width个字节,这个Src Memory一样,只不过针对的是内存。,勾选表示递增。 data width:数据宽度 byte:字节,通用8位,与u8相同 word:字长,与硬件的位数相同,STM32是32位,所以对应是u32 Half Word:半个字长,所以对应是u16 串口DMA发送
串口库函数中断接收
主函数
七、 串口DMA收和发(一)CubeMX配置 通用配置 ![]() ![]()
中断开启
![]() DMA发送设置
![]() DMA接收设置,要注意这里是循环
![]() 收发函数原型
主函数使用
八、printf实现
|
STM32G0 系列 I2C 通信异常典型案例分析与解决方案总结
经验分享 | LAT1490 两个STM32G0 I2C 通信异常的案例分析
经验分享 | STM32G0 I2C bootloader Go 命令后调试连接失败:DBG_SWEN 位复位修复
经验分享 | STM32G0B1 待机模式意外唤醒深度解析:RTC 结构体未初始化的隐形坑
经验分享 | STM32G0B1 待机模式意外唤醒深度解析:RTC 结构体未初始化的隐形坑
如何在STM32和Arduino上实现卷积神经网络
STM32与51单片机差异一文速览
STM32芯片命名规则
STM32 引脚到底有多少?为什么一个引脚能当好几个用?
【STM32入门学习路径指南】(四步走)
微信公众号
手机版