STM32F407怎样编写ns级延时函数 以实现500ns延时
请问STM32F407(168Mhz)怎样编写ns级延时函数 可实现500ns延时用个定时器配置分频21,就是8M,周期125ns
每次要延时保证从0开始计数,TIMx->CNT =0,使能定时器,
while(TIMx->CNT<4)判断计数值达到4,就是500ns了,再关闭定时器,下次要延时再使能 for循环或者定时器。 安 发表于 2019-9-8 20:36
for循环或者定时器。
您好 请问定时器具体怎样能够实现 可以大概跟我说一下么
我用定时器更新中断写过一次 由于进出中断加中断处理程序已经大于500ns 没能成功 请问可以怎样实现呢
下面是我使用中断的代码
void TIM2_IRQHandler(void)
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
counter_x500ns++;
}
}
void delay_x500ns(u16 x_500ns)
{
counter_x500ns=0;
while(x_500ns!=counter_x500ns);
}
定时器初始化为TIM2_Init(42-1,1-1); //500ns
delay使用为delay_x500ns(1);
for循环或者滴答定时器
for循环也可以出500ns但是容易被其他中断打断不稳定
配置滴答定时器可以实现ns级延时
void delay_init(u8 SYSCLK)//72
{
SysTick->CTRL&=0xfffffffb;//bit2清空,选择外部时钟STCLK = HCLK/8= 21M/s
fac_us=SYSCLK/8;// SYSCLK为168,所以fac_us为21
fac_ms=(u16)fac_us*1000;
}
//nus最小是50时钟是21MHz所以时钟最小分割是47ns
void delay_us(u32 ns)
{
u32 temp;
SysTick->LOAD=ns*fac_us/1000; //时间加载
SysTick->VAL=0x00; //清空计数器
SysTick->CTRL=0x01 ; //开始倒数
do
{
temp=SysTick->CTRL;
}
while(temp&0x01&&!(temp&(1<<16)));//等待时间到达
SysTick->CTRL=0x00; //关闭计数器
SysTick->VAL =0X00; //清空计数器
}
mylovemcu 发表于 2019-9-9 08:02
for循环或者滴答定时器
for循环也可以出500ns但是容易被其他中断打断不稳定
哇~多谢~ 滴答咯 简单易懂
页:
[1]