回复【16楼】 DChipNau :
---------------------------------
你程序哪里写错了吧?参考原子的代码吧,里面有延时微秒的方法。或者参考我的stm32代码,用systick做定时器:
[mw_shl_code=c,true]#define HW_TICK_PER_SECOND (100)
// 不能高于1000,否则hw_delay_us()要做相应的处理。
#define HW_CLOCK_US() (u32)(SysTick->VAL)/9
#define CPU_HZ (72000000UL)
#define USC_HZ (CPU_HZ/8)
#define USC_RANGE (USC_HZ/HW_TICK_PER_SECOND)
#define USC_MAX (USC_RANGE-1)
#define USPS (1000000UL)
// 每秒 USPS 微秒
#define USPT (USPS/HW_TICK_PER_SECOND)
// 每tick USPT 微秒
#define USC_CPUS (USC_HZ/USPS)
// cycles/us @ USC
[/mw_shl_code]
[mw_shl_code=c,true]void hw_usc_init(u8 bReInit)
{
static u8 bInited = 0;
if(bReInit || bInited==0) // 需要强制重新初始化或是没有经过初始化
{
bInited = 1;
SysTick->CTRL&= 0xfffffffb; //bit2清空,选择外部时钟,也即HCLK/8
SysTick->LOAD = USC_MAX;
SysTick->VAL = USC_MAX; // write to clean
SysTick->CTRL = 0x01 ; //开始倒数 不产生中断
}
}
void hw_tick_start(void)
{
hw_usc_init(0);
SysTick->CTRL = 0x03; // 启动systick并产生中断
}
void hw_delay_us(u16 us)
{
u32 start ,target,cur;
while(us > 500) // 防止us超过systick周期。(假设systick周期超过500us)
{
hw_delay_us(500);
us -= 500;
}
start = SysTick->VAL;
target = (start-us*USC_CPUS);
if(start<target) // 溢出,调整target的值。target不能等于start。
{
target += USC_RANGE;
do
{
cur = SysTick->VAL;
}while(cur<=start || target<cur);
}
else // target <= start
{
do
{
cur = SysTick->VAL;
}while(target<cur&&cur<=start); // 假设target为一个很小的值,则cur有可能在循环周期内溢出而大于target,故须加上cur<=start的条件
}
}[/mw_shl_code]
|