stm32f030f4p6 微妙延时怎么做?
感谢各路大神指点!感谢各路大神指点!
感谢各路大神指点!
本帖最后由 XinLiYF 于 2018-3-10 10:10 编辑
__nop();指令最精确:victory::victory::victory:
但是做一个可以改变延时的函数就不精确了。
精确点的 就用定时器做 微妙级别的延时肯定要使用定时器了,F030为48M主频,48分频后频率为1MHz,周期为1微妙,使用定时器记录这个脉冲,假设需要延时10us,这里记录10次后产生中断,即可达到10us延时。
详细文档本论坛有相关文章提供
https://www.stmcu.org.cn/module/forum/thread-606245-1-1.html 用系统滴答也可以
INT16U g_uwDelayTime_ms = 0;
static INT8Ug_ubMultiple_us = 0;
static INT16U g_uwMultiple_ms = 0;
void Delay(INT16U mTime)
{
g_uwDelayTime_ms = mTime;
while(g_uwDelayTime_ms != 0);
}
void Delay_Init(INT8U sysclk)
{
SysTick->CTRL &= 0xFFFFFFFB; // Ñ¡ÔñTickʱÖÓÔ´¡ª¡ªHCLK/8
g_ubMultiple_us = sysclk / 8;
g_uwMultiple_ms = (INT16U)sysclk / 8 * 1000;
//SysTick->CTRL |= SysTick_CTRL_CLKSOURCE_Msk; // Ñ¡ÔñTickʱÖÓÔ´¡ª¡ªÏµÍ³Ê±ÖÓ
//g_ubMultiple_us = sysclk;
//g_uwMultiple_ms = (INT16U)sysclk * 1000;
}
// ΢Ã붨ʱ
void Delay_us(INT16U time)
{
INT32U ulTemp = 0;
ulTemp = (INT32U)time * g_ubMultiple_us;
SysTick->LOAD = ulTemp - 1;
SysTick->VAL = 0; // ¸³Öµ¿ÉÇå³þSysTick_CTRL_COUNTFLAG_Msk λ
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; // Æô¶¯¼ÆÊ±Æ÷
do
{
ulTemp = SysTick->CTRL;
}
while((ulTemp & SysTick_CTRL_COUNTFLAG_Msk) != SysTick_CTRL_COUNTFLAG_Msk); // µÈµ½¼ÆÊýÍê³É
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; // Í£Ö¹¼ÆÊ±Æ÷
SysTick->VAL = 0;
}
// ºÁÃ붨ʱ
void Delay_ms(INT16U time)
{
INT32U ulTemp = 0;
ulTemp = (INT32U)time * g_uwMultiple_ms;
SysTick->LOAD = ulTemp - 1;
SysTick->VAL = 0; // ¸³Öµ¿ÉÇå³þSysTick_CTRL_COUNTFLAG_Msk λ
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; // Æô¶¯¼ÆÊ±Æ÷
do
{
ulTemp = SysTick->CTRL;
}
while((ulTemp & SysTick_CTRL_COUNTFLAG_Msk) != SysTick_CTRL_COUNTFLAG_Msk); // µÈµ½¼ÆÊýÍê³É
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; // Í£Ö¹¼ÆÊ±Æ÷
SysTick->VAL = 0;
} Tcreat 发表于 2018-3-10 10:08
用系统滴答也可以
INT16U g_uwDelayTime_ms = 0;
谢了,就是要滴答时钟
用SysTick配置比较靠谱,不需要中断 微秒延时,用滴答时钟最省事;
要更精准的话,用定时器查询方式。
页:
[1]