HandsFree——OpenRE库学习(一)
最近入手了一套HandsFree项目的Stone机器人,为了让他跑起来也是煞费苦心。OpenRE是为了HandsFree为底层的ControlUnit_V2(STM32F4)板子开发的一套库,提供了IMU、Motor_top、SBUS、I2C等等方便调用的接口。为了不至于将来忘记了这份OpenRE源码的内容,我在这里将自己点滴的体会记录下来。
从裸奔版固件看起
例子:主程序
如下:
/***********************************************************************************************************************
* Copyright (c) Hands Free Team. All rights reserved.
* FileName: main.c
* Contact: QQ Exchange Group -- 521037187
* Version: V2.0
*
* LICENSING TERMS:
* The Hands Free is licensed generally under a permissive 3-clause BSD license.
* Contributions are requiredto be made under the same license.
*
* History:
* <author> <time> <version> <desc>
* mawenke 2015.10.1 V1.0 creat this file
*
* Description:
***********************************************************************************************************************/
#include "main_includes.h"
void constructorInit(void)
{
board = Board();
}
void systemInit(void)
{
#ifdef BOOTLOADER_ENABLE
SCB->VTOR = FLASH_BASE | 0x4000; //16k Bootloader
#endif
//INTX_DISABLE(); //close all interruption
board.boardBasicInit();
//INTX_ENABLE(); //enable all interruption
printf("app start \r\n");
}
int main(void)
{
int count=0;
constructorInit();
systemInit();
while(1)
{
if ( board.cnt_1ms >= 1 ) // 1000hz
{
board.cnt_1ms=0;
}
if ( board.cnt_2ms >= 2 ) // 500hz
{
board.cnt_2ms=0;
}
if ( board.cnt_5ms >= 5 ) // 200hz
{
board.cnt_5ms=0;
}
if ( board.cnt_10ms >= 10 ) // 100hz
{
board.cnt_10ms=0;
board.boardBasicCall(); // need time stm32f1 35us
}
if ( board.cnt_20ms >= 20 ) // 50hz
{
board.cnt_20ms = 0 ;
}
if ( board.cnt_50ms >= 50 ) // 20hz
{
board.cnt_50ms = 0 ;
board.setLedState(0,2);
printf("welcome to handsfree %d \r\n" , count++);
}
}
}
主程序里包括了三个函数:
1、void constructorInit(void):用来初始化对象,而被初始化的对象是在包含的头文件中定义成外部变量的。
2、void systemInit(void):初始化相应的需要使用到的设备,例如在 board.boardBasicInit()这个函数体中:
void Board::boardBasicInit(void)
{
int i;
for(i=0;i<0x8fff;i++);
HF_System_Timer_Init(); //Initialize the measurement systemm
debugInterfaceInit();
ledInit();
keyInit();
beepInit();
//HF_RTC_Init(); //Initialize the RTC, if return 0:failed,else if return 1:succeeded
//HF_IWDG_Init(); //Initialize the independed watch dog, system will reset if not feeding dog over 1s
HF_ADC_Moder_Init(0X3E00 , 5 , 2.5f); //ADC init
HF_Timer_Init(TIM6 , 1000); //timer6 init , 1000us
setBeepState(1);
delay_ms(500);
setBeepState(0);
}
HF_System_Timer_Init():初始化了定时器
debugInterfaceInit():初始化了USART1,方便Debug输出
ledInit():初始化了GPIOE2、GPIOE3、GPIOC13口
keyInit():暂时还未写具体实现
beepInit():初始化了GPIOE1,给蜂鸣器使用
3、int main(void):主函数里调用了前两个初始化函数,并且定义了一个大循环,定义了多个频率的执行框架。例如:以100hz的频率调用board.boardBasicCall()函数,20hz的频率调用board.setLedState(0,2)函数。board.boardBasicCall()函数的主要作用就是,刷新按键,检查系统时间、CPU的温度、电池电压、报警等等。
小结
这是一个结构非常清晰的库,调用方便。当我们需要使用到哪个功能时,只需要四步。
Step1:包含该库的头文件。
Step2:在constructorInit()中调用构造函数初始化定义的对象。
Step3:在systemInit()中调用初始化函数初始化板子上的设备。Step4:在main()中对应的频率的位置,添加要执行的语句。