打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
圆点博士——代码注释——初版——来自波波——param.c
四轴飞行器
//     Copyright (c) 2013 js200300953@qq.com All rights reserved.
//         ==================================================
//         ========圆点博士微型四轴飞行器配套软件声明========
//         ==================================================
//     圆点博士微型四轴飞行器配套软件包括上位机程序、下位机Bootloader
// 、下位机App和遥控程序,及它们的源代码,以下总称“软件”。
//     软件仅提供参考,js200300953不对软件作任何担保,不对因使用该软件
// 而出现的损失负责。
//     软件可以以学习为目的修改和使用,但不允许以商业的目的使用该软件。
//     修改该软件时,必须保留原版权声明。
//
//     更多资料见:
// http://blog.sina.com.cn/js200300953
// http://www.etootle.com/
// http://www.eeboard.com/bbs/forum-98-1.html#separatorline
// 圆点博士微型四轴飞行器QQ群:276721324
// app/param/param.c
// 2013-4-8 9:07:23
// js200300953
#include
#include
#include
#include "param.h"
#define PARAM_FLASH_ADDRESS (0x08000000 63*1024)
#define PARAM_VERSION 2
static param_t param_ram;   //ram中存放数据的类型为 结构体
static const param_t * param_flash = (const param_t *)PARAM_FLASH_ADDRESS;
int32_t         param_init(void);
const param_t * param_getRamParam(void);
param_t *       param_setRamParam(void);
const param_t * param_getFlashParam(void);
int32_t         param_writeToFlash(void);
int32_t         param_resetFlash(void);
static int32_t  param_loadDefault(param_t * param);
static int32_t  param_refreshCrc(param_t * param);
static int32_t  param_checkValid(const param_t * param);
// 初始化参数模块。
int32_t param_init(void)
{
if(param_checkValid(param_flash) == 0)
param_ram = *param_flash;
else
param_loadDefault(&param_ram);
//
return 0;
}
// 加载参数默认值。
//波:我承认这个比较有用 好多系统默认值都在这里 加载 初始化 因为是结构体 得到的就是一个地址 里面有它的各个成员
int32_t param_loadDefault(param_t * param)
{
// 全部清0,避免不小心没初始化。
for(int i=0;i
((uint8_t *)param)[i] = 0;
//
param->version = PARAM_VERSION;         //波:上面 定义为2
param->length  = sizeof(param_t) / 4;    //波:参数总长度
param->reserve_zero_0 = 0;                //波:reserve 存储的意思
//
for(int i=0;i<3;i )
{
param->acc_gain[i]   = 9.7883 / 4096.0;          //波:加速度增益
param->acc_offset[i] = 0;
param->gyr_gain[i]   = (3.1415926/180.0) / 16.4;   //波:陀螺仪 增益 看来得到的是角度 转换为弧度 然后/16.4 是因为采样16次吗
param->gyr_offset[i] = 0;
param->mag_gain[i]   = 1;                          //波:电子磁盘 此处未用到
param->mag_offset[i] = 0;
}
//
param->horizon.w = 1;                                   //波:四元数 初始化 horizon 地平线的意思
param->horizon.x = 0;
param->horizon.y = 0;
param->horizon.z = 0;
//
for(int i=0;i<3;i )                                     //波:pid初始化
{
param->xyz_pid[i].p = 0.9;
param->xyz_pid[i].i = 0;
param->xyz_pid[i].d = 12;
}
//
param->haltVoltage = 3.3; // 默认低于3.3V停机。
param->haltInclination_cos = 0.5; // 默认60°停机。
//波:防止 倾角过大 电机损坏 属于过倾角保护
//
param_refreshCrc(param);            //波:更新crc
return 0;
}
// 计算参数的CRC。
//波:这个函数没看懂 以后再看吧 大体内容就是用stm32的ram 还有 flash 存放数据 读取数据
int32_t param_refreshCrc(param_t * param)
{
uint8_t * crc_var = (uint8_t *)&(param->crc);
crc_var[0] = 0;
crc_var[1] = 0;
uint16_t crc16_ccitt = math_crc16(0,param,sizeof(param_t)-2);
crc_var[2] = ((uint8_t *)&crc16_ccitt)[1];
crc_var[3] = ((uint8_t *)&crc16_ccitt)[0];
//
return 0;
}
// 检查参数是否有效。
// 版本不对,CRC校验失败都会导致参数无效。
int32_t param_checkValid(const param_t * param)
{
if(math_crc16(0,param,sizeof(param_t)) != 0)
return -1;
if(param->version != PARAM_VERSION)
return -2;
return 0;
}
// 获取RAM里的参数。
const param_t * param_getRamParam(void)
{
return &param_ram;
}
// 设置RAm里的参数。
param_t * param_setRamParam(void)
{
return &param_ram;
}
// 获取Flash里的参数。
const param_t * param_getFlashParam(void)
{
return param_flash;
}
// 把RAM中的参数写入到Flash里。
int32_t param_writeToFlash(void)
{
param_refreshCrc(&param_ram);
if(param_checkValid(&param_ram) != 0)
return -1;
//
// 检查是否需要写,避免重复写入。
int32_t same = 1;
for(int i=0;i
{
if(((const uint8_t *)param_flash)[i] != ((uint8_t *)&param_ram)[i])
{
same = 0;
break;
}
}
if(same)
{
cmd_returnMessage("参数相同,不需写入");// 源文件要用UTF8编码。
return 0;
}
//
flash_erase((const uint32_t *)param_flash);
flash_write((const uint32_t *)param_flash,(const uint32_t *)&param_ram,sizeof(param_t)/4);
//
if(param_checkValid(param_flash) != 0)
return -2;
//
cmd_returnMessage("参数已写入Flash");// 源文件要用UTF8编码。
return 0;
}
int32_t param_resetFlash(void)
{
param_loadDefault(&param_ram);
param_writeToFlash();
//
return 0;
}
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
AVR 单片机与GCC 编程之存储器操作
【MCU】一种单片机节省内存的方法(补充)
C5
STM32的串口控制台的实现
共享内存操作类(C#源码)
简单RTP发送类c++实现
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服