0%

电控培训(2)

Main Takeaway

电控组入队培训——记录我参加第二次培训的见闻

历时一个月没更新,小摆(其实开学以后没啥动力更新,但是记录一下是必要的,也是一种成就感的获取吧,我会把入队培训坚持更完的,入队培训(1)是workflow的搭建,大家可以搜索查看)

加油!

USB转TTL

STM32 —— USB 转 TTL(CH340)-CSDN博客

USB 转 TTL 模块的作用就是把电平转换到双方都能识别进行通信

状态机

什么是状态机? - 知乎 (zhihu.com)

可以自己玩玩:状态机:史上最棒的机制 - 知乎 (zhihu.com)是什么

一个有限状态机是一种特殊的组织代码的方式,用这种方式你能确保你的对象随时都知道自己所处的状态以及所能做的操作。

DMA接收传输+空闲中断

image-20231014091951063

接下来说一下空闲帧,可以理解为整个帧周期内电平均高电平,即没有数据,开启空闲帧中断后便会在检测到空闲帧时将对应的标志位置位。将这个的原因在于,数据发送不会是完全连续的,相邻两组数据间会出现空闲状态,因此可以利用DMA加空闲中断的形式实现DMA接收不定长度的数据。该功能HAL库也有提供对应的调用函数及回调函数,pData为指向缓冲区的指针,Size为缓冲区的大小,而回调函数中的Size为距离缓冲区开头当前接收到的数据长度,在Normal模式下的DMA传输中,Size直接代表了当前接收到的数据长度,该回调函数的出发条件有3个

要注意这里的Size为调用开始DMA结合空闲中断时传入的Size,由于存在多个触发条件,因此回调函数需要对Size进行判断,当然最简单的方法为已知最长的数据长度为x,那只需将Size设定为2x+1便可以解决问题。同样的,在该回调函数中同样需要再次开启接收的函数。

多说一嘴,该方法在stm32间通信的时候并不会出现问题,但stm32利用该方法长时间接收minipc发送的串口数据时可能会被锁死,其原因可能是minipc串口发送的问题,但具体原因还未确定,因此实际stm32接收minipc发送的串口数据时,会在1khz的定时器中反复调用开启接收的函数,以此解决这个问题。

image-20231014095602092

IDLE时检测到空闲线路

仅当使用DMA接收数据时,才使用这个标志位

image-20231014095755779

一个中断被检测到,就会触发中断

试验

检验串口连接成功

image-20231011085844967

成功接收到数据

如果USB转TTL接电源,jlink不接供电则不能下载——虽然组长说选择一个供电但好想就只能jlink接VCC

image-20231011092513327

发送数据后并未进入中断

image-20231011160153509

tx 和 rx短接接收到了——但是发的“AABBCC”收到“AAAAAA”——只出现了一次(不知道为什么。)

image-20231011160726025

成功接收到了!!!

实现数据发送和接收

image-20231011161027735

未设断点的时候没发送回来

image-20231011161953793

设置断点的时候发送回来了

image-20231011162155071

因为数据不匹配???(前面开启时不小心写成7了)

第一次发送值改变了,没进入中断

第二次发送进入了,且发送回来值——但数组第7个值变为了A???

image-20231011162618446

因为我接收的是7个数据

image-20231011162942900

不过每次发送就收到一个报错 img

点击view,里面有个call stack,打开看看函数调用情况,看看从哪里造成段错误的

原因:因为我用指针来获取全局变量——这样是不行的(receive_data[ ]本身是个数组)

1
extern uint8_t *receive_data;

定义与声明一定要匹配

[基础]关于extern指针和数组的用法 - aaronGao - 博客园 (cnblogs.com)

十六进制的接收和发送成功!

实现带帧头的数据接收

image-20231011172359207

因为外部引用数组不能写成*receive_data,而要写receiver_data[ ]

[基础]关于extern指针和数组的用法 - aaronGao - 博客园 (cnblogs.com)

  • 系统会为“指针名”分配4个字节的内存空间。存放指针的内存空间和该内存中存放的数据,前者为存放指针的地址,后者为存放有效数据(如abcdef)的地址。
  • 而数组名则不会,数组名只是一块存放数据地址空间的别名。

把中间的数据都丢掉了

image-20231012151802557
C75530C5EA50B3007D2020E3FC39A84E

如果发送数据确实会影响中断(这里后面应该有6个wrong。)

165BED5DEAEF8882DB1C6AC74561DBF5

当我选择不回复信息时(第二个信号设置丢包)正确接收到了第三个信号——成功接收数据!且不因为丢包而影响后面数据的接收!

实践说明接收的同时回复消息会影响接收,所以还是不要回复了!(问问大家好了)

实现不定长度数据的接收

2C95E6CA87BE6798540358369ABCADB5

添加DMA

当然最简单的方法为已知最长的数据长度为x,那只需将Size设定为2x+1便可以解决问题

出现的错误

image-20231010222358546

字母大小写,对着宏定义改

没能生成.elf文件——编译没通过。。。检查一下error——因为我把receive写成了recceive了(vscode的提示都没能拯救我。)...

References