Skip to content

PQP-2020/STM32Project

 
 

Repository files navigation

STM32Project

针对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接收数据中断

BUG

所在文件 解释
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
两文件冲突,由于gps使用了链表存储接收到的数据,而发送给匿名上位机的程序用了malloc申请连续堆空间,有可能链表产生了内存碎片导致ANO_DT.c无法申请足够长度的堆空间而锁死程序。现计划使用链表存储需要发送的数据,后期学完rtos之后使用更先进的内存管理手段来实现各种功能。
尼玛,上位机通信换成数组了,我认栽。旧的两个文件都放到source\DRIVER\src\unuse里面了,ANO_DT_1.c是申请连续堆空间的,ANO_DT_2.c是链表的,不插GPS的时候都能运行。为什么双链表都会产生内存碎片啊?
source\MATH\src\calibrate.c 椭球算法估计有缺陷,先用matlab\CAL_Ellipsoid文件夹的matlab代码解算磁力计的值。

About

针对全系列STM32编程、编译、烧录的开源开发方法。Editor: VSCode, Compiler: arm-none-eabi-gcc, Programmer: OpenOCD. STM32 open source development method.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages

  • C 81.0%
  • HTML 17.7%
  • Other 1.3%