针对stm32f407进行飞控开发。Editor: VSCode, Compiler: arm-none-eabi-gcc, Programmer: OpenOCD, Debugger: OpenOCD. STM32 open source development method.
工具链:Windows-VSCode-arm-none-eabi-gcc-make-OpenOCD
这个工程最主要的目的是对stm32芯片进行轻量化开发,现在多数初学者开发单片机都是不同芯片装不同IDE,体积臃肿,而且工作后如果从事这一行有可能被查水表。使用该方法可以使得程序全部在VSCode上编辑,只需要安装不同的编译器、烧录器和调试器即可。
VSCode不说了,最强IDE(雾。
arm-none-eabi-gcc其实就是一个开源的编译器,用这个编译器c程序在arm芯片上进行裸机开发。GNU Arm Embedded Toolchain Downloads←鼠标中键点击以打开新窗口
OpenOCD是一个开源的片上调试器,支持非常多芯片,同时也有烧录功能,这个工程的程序烧录也是靠它做的。
├─.vscode(vscode的一些设置)
├─build(编译后的.o文件和二进制文件都放这里)
├─matlab(控制算法的仿真还有仿真数据)
├─source(源码所在)
│ ├─CONTROL(飞控解算的程序)
│ ├─CORE(407内核文件)
│ ├─DEVICE(板载外设)
│ ├─DRIVER(设备驱动)
│ ├─DSPLIB(一些直接调用的库文件,主要是用来算矩阵的)
│ ├─FWLIB(ST的标准外设库)
│ │ ├─inc(标准库头文件)
│ │ ├─src(标准库源文件)
│ │ └─unuse(此芯片不支持的标准库文件)
│ ├─MATH(数学类函数实现)
│ └─USER(用户文件夹)
└─其他文件
| 时间 | 更新内容 |
|---|---|
| 2020/9/17 | 6050,气压计,磁罗盘的原始数据都能获取。 串口发送正常,使用匿名v6协议。 |
| 2020/9/20 | PPM解码正常,我一开始还想着用过采样的方式对PPM解码,结果外部中断更好用。 |
| 2020/9/24 | 添加了arm的数学库,要用旧版本的,新版本不行,添加了一个matlab做EKF仿真的文件夹。 |
| 2020/10/13 | 修复了磁力计问题,准备添加偏航计算。 修复了串口误码率很高的问题。 动力分配、pid也写好了,快能飞了。 |
| 2020/10/18 | 对陀螺仪,加速度计,磁力计都做了真值修正。 叉积法互补滤波解算的横滚角和俯仰角效果不错,偏航角在静态下效果也可以,但是一动偏航就乱,目前准备获取地磁矢量常量进行叉积计算,但愿能成功。 |
| 2020/10/27 | 飞机已经上调试架,正在调PID。 GPS使用北天通讯的BN-880,计划用链表实现数据存储的功能。 |
| 2020/10/30 | 飞机pid调得差不多了。 链表测试正常,还差一个遍历输出的功能,争取今天弄完。 |
| 2020/11/05 | 离谱,GPS用链表调成功了,但是和一代的上位机通信有冲突,然后上位机通信换链表,想着能避免内存碎片了,结果还是不行,现在已经换成了数组的方式。 |
| 2020/11/06 | 在写GNPMC的报文解码,写了UTC时间+经纬度+对地速度,现在临时链表节点指针还不能随着解码移动,等我完全写好这个报文的解析之后再优化。 |
| 2020/11/20 | 修正了磁力计校正值,机载的椭球矫正有缺陷,如果发现初始化之后获取到的磁力计刻度因子相差太大,请使用matlab文件夹内的椭球矫正程序,机载校正以后修复。 修正并优化了了气压计数据的采集,准备用于定高。 |
| 通道名称 | 通道作用 |
|---|---|
| SWA | 飞机上电前此拨杆打到2000,上电后飞机进入传感器校准模式。按照加速度计,磁罗盘,陀螺仪的顺序校准。 SWA=2000的时候飞控不要动,只有在SWA=1000的时候才能更换飞控方位。校准完一个传感器之后要打到1000然后打回2000才能校准下一个传感器,校准完磁罗盘之后打到1000,退出校准模式。 |
| SWD | 飞机上锁/解锁拨杆,SWD=1000上锁,SWD=2000解锁。其实一开始是想用SWA的,想着反正校正不经常用,但是后来发现改了程序烧录之前经常忘记上锁,索性换一个拨杆,后面会更换成八字上锁/解锁的方法。 |
| 抢占优先级 | 子优先级 |
|---|---|
| 0 | 0 TIM7 PPM计时1ms 1 EXIT12 PPM解码 外部输入中断 |
| 1 | |
| 2 | |
| 3 | 0 TIM6 系统时基 1 2 EXIT0 GPS解码 软件中断 3 UART4 GPS接收数据中断 |
| 所在文件 | 解释 |
|---|---|
| source/DRIVER/src/ANO_DT.c | 修复了,是我时钟没调好,详细请看modify.c文件 |
| source/DSPLIB/arm_math.h | 这个头文件我是从无名的代码那里拉过来的,能用。但是我下最新版的头文件要添加两个莫名其妙的头文件,可以看这个文件夹内的unuse,而且添加完之后宏定义还和内核文件的宏定义有冲突。 |
| source\DRIVER\src\ANO_DT.c source\DEVICE\src\gps.c |
尼玛,上位机通信换成数组了,我认栽。旧的两个文件都放到source\DRIVER\src\unuse里面了,ANO_DT_1.c是申请连续堆空间的,ANO_DT_2.c是链表的,不插GPS的时候都能运行。为什么双链表都会产生内存碎片啊? |
| source\MATH\src\calibrate.c | 椭球算法估计有缺陷,先用matlab\CAL_Ellipsoid文件夹的matlab代码解算磁力计的值。 |