/**
******************************************************************************
* @file EEPROM_Emulation/src/eeprom.c
* @author MCD Application Team
* @version V3.1.0
* @date 07/27/2009
* @brief This file provides all the EEPROM emulation firmware functions.
******************************************************************************
* @copy
*
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
*
* <h2><center>© COPYRIGHT 2009 STMicroelectronics</center></h2>
*/
/** @addtogroup EEPROM_Emulation
* @{
*/
/* Includes ------------------------------------------------------------------*/
#include "eeprom.h"
#include "rtthread.h"
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Global variable used to store variable value in read sequence */
uint16_t DataVar = 0;
uint32_t CurWrAddress;
/* Virtual address defined by the user: 0xFFFF value is prohibited */
extern uint16_t VirtAddVarTab[];
extern uint16_t NumbOfVar;
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
static FLASH_Status EE_Format(void);
static uint16_t EE_FindValidPage(uint8_t Operation);
static uint16_t EE_VerifyPageFullWriteVariable(uint16_t VirtAddress, uint16_t Data);
static uint16_t EE_PageTransfer(uint16_t VirtAddress, uint16_t Data);
//初始化写地址,减少每次读写时查询时间
uint16_t InitCurrWrAddress(void)
{
FLASH_Status FlashStatus = FLASH_COMPLETE;
uint16_t ValidPage = PAGE0;
//uint32_t Address;
uint32_t PageEndAddress;
/* Get valid Page for write operation */
ValidPage = EE_FindValidPage(WRITE_IN_VALID_PAGE);
/* Check if there is no valid page */
if (ValidPage == NO_VALID_PAGE)
{
CurWrAddress = (uint32_t)(EEPROM_START_ADDRESS + (uint32_t)(ValidPage * PAGE_SIZE));
return NO_VALID_PAGE;
}
/* Get the valid Page start Address */
//Address = (uint32_t)(EEPROM_START_ADDRESS + (uint32_t)(ValidPage * PAGE_SIZE));
CurWrAddress = (uint32_t)(EEPROM_START_ADDRESS + (uint32_t)(ValidPage * PAGE_SIZE));
/* Get the valid Page end Address */
PageEndAddress = (uint32_t)((EEPROM_START_ADDRESS - 2) + (uint32_t)((1 + ValidPage) * PAGE_SIZE));
/* Check each active page address starting from begining */
while (CurWrAddress < PageEndAddress)
{
/* Verify if Address and Address+2 contents are 0xFFFFFFFF */
if ((*(__IO uint32_t*)CurWrAddress) == 0xFFFFFFFF)
{
/* Set variable virtual address */
FlashStatus = FLASH_COMPLETE;
/* Return program operation status */
return FlashStatus;
}
else
{
/* Next address location */
CurWrAddress = CurWrAddress + 4;
}
}
/* Return PAGE_FULL in case the valid page is full */
return PAGE_FULL;
}
/**
* @brief Restore the pages to a known good state in case of page's status
* corruption after a power loss.
* @param None.
* @retval - Flash error code: on write Flash error
* - FLASH_COMPLETE: on success
*/
uint16_t __EE_Init(void)
{
uint16_t PageStatus0 = 6, PageStatus1 = 6;
uint16_t VarIdx = 0;
uint16_t EepromStatus = 0, ReadStatus = 0;
int16_t x = -1;
uint16_t FlashStatus;
/* Get Page0 status */
PageStatus0 = (*(__IO uint16_t*)PAGE0_BASE_ADDRESS);
/* Get Page1 status */
PageStatus1 = (*(__IO uint16_t*)PAGE1_BASE_ADDRESS);
/* Check for invalid header states and repair if necessary */
switch (PageStatus0)
{
case ERASED:
if (PageStatus1 == VALID_PAGE) /* Page0 erased, Page1 valid */
{
/* Erase Page0 */
FlashStatus = FLASH_ErasePage(PAGE0_BASE_ADDRESS);
/* If erase operation was failed, a Flash error code is returned */
if (FlashStatus != FLASH_COMPLETE)
{
return FlashStatus;
}
}
else if (PageStatus1 == RECEIVE_DATA) /* Page0 erased, Page1 receive */
{
/* Erase Page0 */
FlashStatus = FLASH_ErasePage(PAGE0_BASE_ADDRESS);
/* If erase operation was failed, a Flash error code is returned */
if (FlashStatus != FLASH_COMPLETE)
{
return FlashStatus;
}
/* Mark Page1 as valid */
FlashStatus = FLASH_ProgramHalfWord(PAGE1_BASE_ADDRESS, VALID_PAGE);
/* If program operation was failed, a Flash error code is returned */
if (FlashStatus != FLASH_COMPLETE)
{
return FlashStatus;
}
}
else /* First EEPROM access (Page0&1 are erased) or invalid state -> format EEPROM */
{
/* Erase both Page0 and Page1 and set Page0 as valid page */
FlashStatus = EE_Format();
/* If erase/program operation was failed, a Flash error code is returned */
if (FlashStatus != FLASH_COMPLETE)
{
return FlashStatus;
}
}
break;
case RECEIVE_DATA:
if (PageStatus1 == VALID_PAGE) /* Page0 receive, Page1 valid */
{
/* Transfer data from Page1 to Page0 */
for (VarIdx = 0; VarIdx < NumbOfVar; VarIdx++)
{
if (( *(__IO uint16_t*)(PAGE0_BASE_ADDRESS + 6)) == VirtAddVarTab[VarIdx])
{
x = VarIdx;
}
if (VarIdx != x)
{
/* Read the last variables' updates */
ReadStatus = EE_ReadVariable(VirtAddVarTab[VarIdx], &DataVar);
/* In case variable corresponding to the virtual address was found */
if (ReadStatus != 0x1)
{
/* Transfer the variable to the Page0 */
EepromStatus = EE_VerifyPageFullWriteVariable(VirtAddVarTab[VarIdx], DataVar);
/* If program operation was failed, a Flash error code is returned */
if (EepromStatus != FLASH_COMPLETE)
{
return EepromStatus;
}
}
}
}
/* Mark Page0 as valid */
FlashStatus = FLASH_ProgramHalfWord(PAGE0_BASE_ADDRESS, VALID_PAGE);
/* If program operation was failed, a Flash error code is returned */
if (FlashStatus != FLASH_COMPLETE)
{
return FlashStatus;
}
/* Erase Page1 */
FlashStatus = FLASH_ErasePage(PAGE1_BASE_ADDRESS);
/* If erase operation was failed, a Flash error code is returned */
if (FlashStatus != FLASH_COMPLETE)
{
return FlashStatus;
}
}
else if (PageStatus1 == ERASED) /* Page0 receive, Page1 erased */
{
/* Erase Page1 */
FlashStatus = FLASH_ErasePage(PAGE1_BASE_ADDRESS);
/* If erase operation was failed, a Flash error code is returned */
if (FlashStatus != FLASH_COMPLETE)
{
return FlashStatus;
}
/* Mark Page0 as valid */
FlashStatus = FLASH_ProgramHalfWord(PAGE0_BASE_ADDRESS, VALID_PAGE);
/* If program operation was failed, a Flash error code is returned */
if (FlashStatus != FLASH_COMPLETE)
{
return FlashStatus;
}
}
else /* Invalid state -
没有合适的资源?快使用搜索试试~ 我知道了~
基于RT-Thread的IMU姿态解算源代码
共493个文件
cout:139个
pbi:138个
md5:87个
2星 需积分: 32 70 下载量 71 浏览量
2015-03-27
17:15:37
上传
评论 3
收藏 21.27MB ZIP 举报
温馨提示
基于MPU6050的姿态解算算法,采用了四元数法互补滤波耦合,整个系统基于RT-Thread构建,适合学习IMU算法和RT-Thread使用的同学查阅
资源推荐
资源详情
资源评论
收起资源包目录
基于RT-Thread的IMU姿态解算源代码 (493个子文件)
firmware_imu_prj.cspy.bat 2KB
flash.bat 300B
firmware_imu_prj.pbd.browse 23.68MB
firmware_imu_prj.pbd.browse 4.88MB
eeprom.c 22KB
hmc5883_bmp085.c 19KB
imu.c 15KB
usart.c 13KB
output.c 13KB
mpu6050.c 12KB
serial.c 12KB
stm32f10x_it.c 11KB
board.c 6KB
common.c 4KB
startup.c 3KB
crc.c 3KB
led.c 3KB
eep_storage.c 3KB
application.c 2KB
test.c 45B
stm32f10x_dbgmcu.pbi.cout 10KB
stm32f10x_flash.pbi.cout 10KB
stm32f10x_usart.pbi.cout 10KB
stm32f10x_gpio.pbi.cout 10KB
stm32f10x_sdio.pbi.cout 10KB
stm32f10x_wwdg.pbi.cout 10KB
stm32f10x_exti.pbi.cout 10KB
stm32f10x_fsmc.pbi.cout 10KB
stm32f10x_iwdg.pbi.cout 10KB
stm32f10x_adc.pbi.cout 10KB
stm32f10x_pwr.pbi.cout 10KB
stm32f10x_bkp.pbi.cout 10KB
stm32f10x_tim.pbi.cout 10KB
stm32f10x_rcc.pbi.cout 10KB
stm32f10x_dac.pbi.cout 10KB
stm32f10x_dma.pbi.cout 10KB
stm32f10x_crc.pbi.cout 10KB
stm32f10x_can.pbi.cout 10KB
stm32f10x_rtc.pbi.cout 10KB
stm32f10x_spi.pbi.cout 10KB
stm32f10x_cec.pbi.cout 10KB
stm32f10x_i2c.pbi.cout 10KB
misc.pbi.cout 10KB
hmc5883_bmp085.pbi.cout 10KB
finsh_compiler.pbi.cout 10KB
attitude_cal.pbi.cout 10KB
system_stm32f10x.pbi.cout 10KB
stm32f10x_it.pbi.cout 10KB
finsh_parser.pbi.cout 10KB
eep_storage.pbi.cout 10KB
finsh_token.pbi.cout 10KB
finsh_error.pbi.cout 10KB
cpuport.pbi.cout 10KB
application.pbi.cout 10KB
finsh_init.pbi.cout 10KB
finsh_node.pbi.cout 10KB
finsh_heap.pbi.cout 10KB
finsh_var.pbi.cout 10KB
finsh_ops.pbi.cout 10KB
finsh_vm.pbi.cout 10KB
startup.pbi.cout 10KB
mpu6050.pbi.cout 10KB
eeprom.pbi.cout 10KB
common.pbi.cout 10KB
output.pbi.cout 10KB
core_cm3.pbi.cout 10KB
symbol.pbi.cout 10KB
serial.pbi.cout 10KB
usart.pbi.cout 10KB
shell.pbi.cout 10KB
board.pbi.cout 10KB
crc.pbi.cout 10KB
imu.pbi.cout 10KB
cmd.pbi.cout 10KB
led.pbi.cout 10KB
scheduler.pbi.cout 10KB
kservice.pbi.cout 10KB
mempool.pbi.cout 10KB
thread.pbi.cout 10KB
device.pbi.cout 10KB
module.pbi.cout 10KB
object.pbi.cout 10KB
clock.pbi.cout 10KB
timer.pbi.cout 10KB
idle.pbi.cout 10KB
slab.pbi.cout 10KB
irq.pbi.cout 10KB
rtm.pbi.cout 10KB
mem.pbi.cout 10KB
ipc.pbi.cout 10KB
stm32f10x_dbgmcu.pbi.cout 9KB
stm32f10x_flash.pbi.cout 9KB
stm32f10x_usart.pbi.cout 9KB
stm32f10x_gpio.pbi.cout 9KB
stm32f10x_exti.pbi.cout 9KB
stm32f10x_sdio.pbi.cout 9KB
stm32f10x_wwdg.pbi.cout 9KB
stm32f10x_iwdg.pbi.cout 9KB
stm32f10x_fsmc.pbi.cout 9KB
stm32f10x_adc.pbi.cout 9KB
共 493 条
- 1
- 2
- 3
- 4
- 5
资源评论
- ZQ_20142017-08-11不咋地啊,没什么效果
- DSF902017-03-02没看出RT-thread的影子
shaorei
- 粉丝: 15
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功