HandsFree——OpenRE库学习(一)

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()中对应的频率的位置,添加要执行的语句。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值