AM32开源代码之代码分析 - function

1. 源由

通用功能代码部分抽象整理到function.c/.h中。

  • map
  • getAbsDif
  • delayMicros
  • delayMillis

2. 主要函数

2.1 map

采用二分法进行入参/出参线性映射,是一个O(n)算法。

  • 【递归底层】当 x >= in_max,返回 out_max;
  • 【递归底层】当 x <= in_min,返回 in_min;
  • 【入参容错】当入参范围异常1(in_min > in_max);调用正确的map入参范围 map(x, in_max, in_min, out_max, out_min)
  • 【出参容错】当出参范围异常2(out_min == out_min);返回 out_min
  • 【二分容错】当入参范围异常2(in_min == in_mid);返回 out_mid
  • 【小值映射】当 x <= in_mid,返回 map(x, in_min, in_mid, out_min, out_mid)
  • 【大值映射】当 x > in_mid,返回 map(x, in_mid + 1, in_max, out_mid, out_max)
long map(long x, long in_min, long in_max, long out_min, long out_max)
{
    if (x >= in_max)
        return out_max;
    if (x <= in_min)
        return out_min;
    if (in_min > in_max)
        return map(x, in_max, in_min, out_max, out_min);
    if (out_min == out_max)
        return out_min;
    const long in_mid = (in_min + in_max) >> 1;
    const long out_mid = (out_min + out_max) >> 1;
    if (in_min == in_mid)
        return out_mid;
    if (x <= in_mid)
        return map(x, in_min, in_mid, out_min, out_mid);
    else
        return map(x, in_mid + 1, in_max, out_mid, out_max);
}

2.2 getAbsDif

两个整形数的差值绝对值。

int getAbsDif(int number1, int number2)
{
    int result = number1 - number2;
    if (result < 0) {
        result = -result;
    }
    return result;
}

2.3 delayMicros/delayMillis

  • 支持STMICRO/GIGADEVICES/ARTERY三种计时器
  • 支持Micro阻塞延迟 - delayMicros
  • 支持Milli阻塞延迟 - delayMillis
#ifdef STMICRO
void delayMicros(uint32_t micros)
{
    UTILITY_TIMER->CNT = 0;
    while (UTILITY_TIMER->CNT < micros) {
    }
}

void delayMillis(uint32_t millis)
{
    UTILITY_TIMER->CNT = 0;
    UTILITY_TIMER->PSC = CPU_FREQUENCY_MHZ * 100;
    LL_TIM_GenerateEvent_UPDATE(UTILITY_TIMER);
    while (UTILITY_TIMER->CNT < millis * 10) {
    }
    UTILITY_TIMER->PSC = CPU_FREQUENCY_MHZ; // back to micros
    LL_TIM_GenerateEvent_UPDATE(UTILITY_TIMER);
}

#endif

#ifdef GIGADEVICES
void delayMicros(uint32_t micros)
{
    TIMER_CNT(UTILITY_TIMER) = 0;
    while (TIMER_CNT(UTILITY_TIMER) < micros) {
    }
}

void delayMillis(uint32_t millis)
{
    TIMER_CNT(UTILITY_TIMER) = 0;
    timer_prescaler_config(UTILITY_TIMER, 50000, TIMER_PSC_RELOAD_NOW);
    while (TIMER_CNT(UTILITY_TIMER) < (millis * 2)) {
    }
    TIMER_PSC(UTILITY_TIMER) = CPU_FREQUENCY_MHZ; // back to micros
    timer_prescaler_config(UTILITY_TIMER, CPU_FREQUENCY_MHZ,
        TIMER_PSC_RELOAD_NOW);
}
#endif

#ifdef ARTERY
void delayMicros(uint32_t micros)
{
    UTILITY_TIMER->cval = 0;

    while (UTILITY_TIMER->cval < micros) {
    }
}

void delayMillis(uint32_t millis)
{
    UTILITY_TIMER->cval = 0;
    UTILITY_TIMER->div = (CPU_FREQUENCY_MHZ * 100);
    UTILITY_TIMER->swevt |= TMR_OVERFLOW_SWTRIG;
    while (UTILITY_TIMER->cval < (millis * 10)) {
    }
    UTILITY_TIMER->div = CPU_FREQUENCY_MHZ;
    UTILITY_TIMER->swevt |= TMR_OVERFLOW_SWTRIG;
}
#endif

3. 总结

通用功能性函数整理在文件 function.c/.h 下,简单易懂!

4. 参考资料

【1】BLDC ESC 无刷直流电子调速器简介
【2】BLDC ESC 无刷直流电子调速器工作原理
【3】AM32开源代码之工程结构

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值