
AM32开源代码之代码分析 - function
通用功能性函数整理在文件下,简单易懂!
·
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】BLDC ESC 无刷直流电子调速器工作过程
【4】BLDC ESC 无刷直流电子调速器驱动方式
【5】AM32开源代码之工程结构

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)