Main Takeaway
电控组入队培训——记录我参加第二次培训的见闻
历时一个月没更新,小摆(其实开学以后没啥动力更新,但是记录一下是必要的,也是一种成就感的获取吧,我会把入队培训坚持更完的,入队培训(1)是workflow的搭建,大家可以搜索查看)
加油!
USB转TTL
STM32 —— USB 转 TTL(CH340)-CSDN博客
USB 转 TTL 模块的作用就是把电平转换到双方都能识别进行通信
状态机
可以自己玩玩:状态机:史上最棒的机制 - 知乎 (zhihu.com)是什么
一个有限状态机是一种特殊的组织代码的方式,用这种方式你能确保你的对象随时都知道自己所处的状态以及所能做的操作。
DMA接收传输+空闲中断

接下来说一下空闲帧,可以理解为整个帧周期内电平均高电平,即没有数据,开启空闲帧中断后便会在检测到空闲帧时将对应的标志位置位。将这个的原因在于,数据发送不会是完全连续的,相邻两组数据间会出现空闲状态,因此可以利用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的定时器中反复调用开启接收的函数,以此解决这个问题。
IDLE时检测到空闲线路
仅当使用DMA接收数据时,才使用这个标志位

一个中断被检测到,就会触发中断
试验
检验串口连接成功

成功接收到数据
如果USB转TTL接电源,jlink不接供电则不能下载——虽然组长说选择一个供电但好想就只能jlink接VCC
发送数据后并未进入中断
tx 和 rx短接接收到了——但是发的“AABBCC”收到“AAAAAA”——只出现了一次(不知道为什么。)
成功接收到了!!!
实现数据发送和接收

未设断点的时候没发送回来
设置断点的时候发送回来了
因为数据不匹配???(前面开启时不小心写成7了)
第一次发送值改变了,没进入中断
第二次发送进入了,且发送回来值——但数组第7个值变为了A???
因为我接收的是7个数据

不过每次发送就收到一个报错 
点击view,里面有个call stack,打开看看函数调用情况,看看从哪里造成段错误的
原因:因为我用指针来获取全局变量——这样是不行的(receive_data[ ]本身是个数组)1
extern uint8_t *receive_data;
定义与声明一定要匹配
[基础]关于extern指针和数组的用法 - aaronGao - 博客园 (cnblogs.com)
十六进制的接收和发送成功!
实现带帧头的数据接收

因为外部引用数组不能写成*receive_data,而要写receiver_data[ ]
[基础]关于extern指针和数组的用法 - aaronGao - 博客园 (cnblogs.com)
- 系统会为“指针名”分配4个字节的内存空间。存放指针的内存空间和该内存中存放的数据,前者为存放指针的地址,后者为存放有效数据(如abcdef)的地址。
- 而数组名则不会,数组名只是一块存放数据地址空间的别名。
把中间的数据都丢掉了

如果发送数据确实会影响中断(这里后面应该有6个wrong。)
当我选择不回复信息时(第二个信号设置丢包)正确接收到了第三个信号——成功接收数据!且不因为丢包而影响后面数据的接收!
实践说明接收的同时回复消息会影响接收,所以还是不要回复了!(问问大家好了)
实现不定长度数据的接收

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

字母大小写,对着宏定义改
没能生成.elf文件——编译没通过。。。检查一下error——因为我把receive写成了recceive了(vscode的提示都没能拯救我。)...