您尚未登录。

楼主 # 今天 12:30:35

Gentlepig
会员
注册时间: 2018-10-24
已发帖子: 1,412
积分: 1371.5

勾选micro lib为什么会影响sysTick?

用的复旦微的单片机,读取d18b20温度用到了sysTick的延时函数。
后来加其他功能时勾选了微库,结果d18b20就读不出数来了。用逻辑分析仪观测了下,读18b20的过程明显比之前的程序长了。
一开始以为是其他中断影响了,最后发现是微库的问题。
那么,微库为什么会影响stsTick?

离线

楼主 #1 今天 13:50:58

Gentlepig
会员
注册时间: 2018-10-24
已发帖子: 1,412
积分: 1371.5

Re: 勾选micro lib为什么会影响sysTick?

https://zhuanlan.zhihu.com/p/1951087973048259773
根据这边文章,M0单片机没有除法器,执行除法需要时间。

/*** @brief us级延时函数(阻塞模式)
* @param count 计数周期
* @note 延时函数最大值受限于SysTick重载值寄存器的最大值0xFFFFFF(16777216)
* @note 该函数为weak函数,用户可选择其他定时器重新定义实现该函数
* @retval 无
*/__weak void std_delayus(uint32_t count)
{
    count = STD_DELAY_US * count;
    count = count > 16777216 ? 16777216 : count;
    SysTick->LOAD = count - 1;
    SysTick->VAL = 0;
    while(!((SysTick->CTRL >> 16) & 0x1));
}
#defineSTD_DELAY_US(SystemCoreClock/1000000)
/**<STD中用于计时的基础值,与计时周期有关*/

但是,我用的单片机,自带库里的延时函数,用到的是右移操作,而不是除法,为什么也会造成不准?

__WEAK void FL_DelayUs(uint32_t count)
{
    count = FL_DELAY_US * count;
    count = count > 16777216 ? 16777216 : count;
    SysTick->LOAD = count - 1;
    SysTick->VAL = 0;
    while(!((SysTick->CTRL >> 16) & 0x1));
}

---------------------------
晕,发现了:

#define FL_DELAY_US                (SystemCoreClock/1000000)

最近编辑记录 Gentlepig (今天 13:54:15)

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn


东莞哇酷科技有限公司开发