1.串口屏没反应:优先查看波特率是否正确
2.接触新板子一定跟教程视频完全过一遍再移植
3.readpin注意返回值到底是1还是什么值,用一个新函数时一定要好好看一下
4.if else判断耗时过久,多用位运算以及?:加速
5.注意keil优化等级是否调为0
6.低价板子容错率低,写代码要更加谨慎
7.移植代码一定要认真了解代码的原理,不然移植错误都不知道
8.uint_16 int_32 float q15_t 这些一定要认真了解类型的转换,经常出现奇奇怪怪的问题
9.遇到不熟悉的函数,声明一定要转到定义的库好好读一下
10.遇到读数不稳定的问题时,多半硬件没有处理好
11.遇到bug一定要记录,比如ti板的声明和赋值要放在main前边,不要在函数数组里面运算
12.(int)(aMax[i]*100)加好括号,优先级判断
13.复制别人代码时一定要看清楚大括号是否对应,不然会有很多奇奇怪怪的报错
14.Alt+/ 代码提示,显著提高效率
15.装软件一定不要跳步,一步一步来,不然又得重搞
16.复制别人代码时一定要看清楚大括号是否对应,不然会有很多奇奇怪怪的报错
17.改变参量思路:reset重新判断,按键按下时判断,tim定时判断
18.出现奇奇怪怪的问题时且觉得软件没问题时硬件测一下波
19.给io口置高或给相同tim的io口一样配置,看是否有错误
20.活用debug,不要傻乎乎一次又一次烧录
21.注意限幅,debug对应变量时注意解除限幅
22.不要pc段和其他电源一同供电,扩展板底板也要注意是否一同接触桌面,不要多电源干架
23.复杂模块建议把别人工程搞下来,再配自己不一样的地方
24.扩展板一定不要放金属板上,下面的锡会短路
25.quartus顶层设计指定为 led_test,设计中就要有 module led_test,大小写敏感。
26.IDE按理说是没有bug的,先从硬件找原因(供电),再从软件找原因。
27.关于中断回调函数发不出来的调试经验:中断里最好不要加延时,用来测试也可以放别的部分(一般用板子上自带的灯来测试)
28.中断就置个标志位,用标志位来检测
29.dma相关的中断,推荐优先级最高
30.中断里最好不要涉及其他外设的操作了,不要又是串口又是定时器还延时的,这样很可能会卡(惨痛经验)
31.代码真的不要写太乱,可无脑低级,但不能乱写
32.代码可能写得不好,但是得工整(可以让ai格式化一波)
33.先在while加一段HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_8);HAL_Delay(1000);来确定整段程序没有卡死
34.adc要curcuit而不是normal
35.若卡死则可能是dma发送失败,数据传输不当,若只是发不出来那就是printf重定向的问题(cubeide与keil常见不同的地方)
36.pritf重定向注意开微库
37.关于写代码的规范问题:
这个其实没啥标准,你可以按外设,先把每一个外设相关的操作搞好,然后外设上面连着什么设备,比如连着一个屏,那你就在单独一个文件里,配合底层的外设,把屏幕相关的控制代码写好,然后你假如想在屏幕上显示东西,那么你就可以再创建ui相关的文件,在里面直接调用你屏幕的代码,显示想要的东西,最后你就可以在屏幕逻辑的文件里处理逻辑,然后直接调用屏幕显示什么东西
先片上外设+资源;再设备+设备驱动;再应用资源+应用逻辑
写代码没什么标准,但是要统一,该缩进缩进该换行换行,命名规则统一只要整个工程统一,就没关系,但是缩进一定要有
38.详情:可以简单分成硬件驱动层,设备驱动层,应用层
第一个确保你的单片机外设本身正常工作了
第二个确保你连接的外部传感器等东西能正常工作,可以和它进行正常的通信等
第三个就是你要处理的逻辑了
其中第一个,假如说你用到了两个串口,一个用来和屏通信,另一个用来连接上位机,那么不管他们之后怎么用,在片上外设这一层上是一样的,所以他们的初始化可以都在一个文件中
第二个就是假如你有两个一样的设备,比如两个同样的串口通信的串口屏,那么两个屏幕在这里可以放到同一个文件里,在除开他俩用的串口不同之外,别的都是一样的,在这里你就可以写用屏幕画点,画圆,画矩形,切屏,显示动画,设置控件等函数,都放到屏幕相关的文件里
第三个就是具体的应用和逻辑了,比如你的屏幕和串口要同时用于给用户显示信息,那么你在同一个应用的文件里,就要同时写串口和屏幕的函数了,不过因为有第二个步骤,你已经有了串口和屏幕相关的api了,比如这里你想显示东西,就直接用屏幕的函数直接显示,串口要发送,就调用串口的函数直接发送
假如用串口屏举例子,那么就是串口一层,如何用串口控制屏幕显示各种东西一层,最后逻辑一层
在初始化的时候,外设初始化肯定是最先的,然后就是设备初始化
最后是逻辑初始化
比如你先把串口初始化好,然后串口发送指令这些让屏幕初始化(只是举例子,其实串口屏不需要这样初始化),等屏幕初始化好,最后你再发送命令,让逻辑初始化,比如让屏幕显示欢迎信息
外设都初始化好,再初始化设备,最后是逻辑,就是说不是说串口初始化完就初始化屏,是等所有外设都初始化好,再初始化屏,然后等所有外接的设备初始化好,再让屏幕显示东西
这样就清晰的分开外设,设备还有逻辑了,你想改哪里就改对应的层
只要能保证你向外暴漏的函数不变,那么相互之间影响是很小的
39.关于采样所得到的数据的处理:除了fft_outputbuf[0]还有几个数据是非0的,这时应该如何处理,应当要整数倍
40.callback函数里的回调加个判断,不同key对应不同措施(和it函数区分,了解逻辑)
41.在回调函数里,如果需要用到其他函数,那么就先调用其他函数,再调用回调函数,因为回调函数是最后执行的,所以如果先调用回调函数,那么其他函数的返回值就为空了
42.尽量在main.c里修改弱函数,别的文件里修改会导致文件包含过于复杂,也可能会忘记
43.中断进了但是改不了pwm,因为涉及tim不好整,还是用标志位等替代方法
44.编译一次后有waring,再一次没有,说明是编译器缓存了之前的代码,所以需要clean一下,一般不用管
45.串口发送要把整数变成数组,不然可能啥都传不动。
46.发给串口的数据都会被自动转化为字符常量。加入输送个0过去,判断代码一定要写成==‘0’而不是==0,因为0是整数,而‘0’是字符常量。卡住也可能是这个原因,还是推荐用printf重定向,方便又安全。
47.往字符数组里传数据一般相当于给前几位不断赋值,数组大小尽量两倍以上,不然可能有中校检之类的
48.字符串最后有\0,,所以注意加一,一般是sizeof,但receive函数是计算字符串的长度,所以要用strlen,所以不用加这个1
49.把oled拔了串口就会正常回传,不拔就不回传。看起来是中断的问题,但发现是供电的问题,一个stlink的供电是撑不起这么多元器件的,所以需要学生电源外接供电
50.multiply defined 是重复定义,比如一个函数在两个文件里都定义了,那么就会报错,所以需要把函数定义在头文件里,然后引用头文件,这样就不会重复定义了。可能是在某个.h里定义了变量,然后这个.h被引用过至少两次。可以声明多次但是不能定义多次
51.调试的时候建议清理下桌面脏东西 确认接线等各种都无误了再上电,同时用单独供电设备和电脑调试的时候记得共地,然后把STLink的3.3V引脚或5V引脚断开。否则可能一阵烟就财产损失了
52.关于rtc:使用rtc的同学的闹钟显示时间仍然需要可调,即通过按键调整rtc的运行时间,因为rtc走时会产生一天几秒的误差。
53.和同学们说一下,很多通信都是需要上拉来确定一个高电平的。如果没有设置上拉,很可能信息就不知道到底是什么电压,单片机读到就会很寄。推挽也可以,但似乎多个推挽挂着一条总线上会寄寄
54.写驱动要注意延时的问题,一直读取电平会一直计数,所以要加个启动判断
55.把文件扩展名显示打开,这样难以看文件类型。如果遇到不确定的库,看cmake/makefile/你觉得主要的文件里有没有互相引用特征不明显的一般都会有readme
56.需要注意的是,蓝牙上电前需要先按住蓝牙上的按钮,上电后再松手,然后上位机这边的串口助手,波特率设置成38400,发送字符串模式,然后末尾自动添加\r\n
57.mpu自检的时候最好是平放,看卡在初始化,还是iic通信,还是发不出来FIFO溢出,用debug判断代码卡哪了。也可能是连线不稳或地址错误。
58.导入别人的工程时要注意别中文路径,不然会报错no such file or directory
59.注意改的时候是快捷方式还是文件夹的名
60.pa13 pa14的swoid口失效 pa15如果改为输出也会锁swd
61.蓝牙模块供电不能只用stlink,小蓝板只有降压模块没有升压模块
62.用debug确定是否卡在hal delay,然后改nvic