香主的这两句话没看太明白,请指教以下: 例如例程中需要一个2ms的超时处理时,可以用下列代码代替:
vu32 I2C_Time;
I2C_Time = I2C_Timestamp + 2; while (I2C_Time > I2C_Timestamp);
请注意:我这个例子没有处理变量溢出的情况。
==================================================== 实际的例子代码: I2C_Result I2C_Comm_MasterWrite(I2C_TypeDef* I2Cx, u16 slave_addr, u32 offset, u8* pBuffer, u32 length) { vu32 check_time = 0;
/*wait bus free*/ //SysTick_SetReload(BUS_BUSY_TIMEOUT); *(u32 *)0xe000e014 = BUS_BUSY_TIMEOUT; //SysTick_CounterCmd(SysTick_Counter_Clear); *(u32 *)0xe000e018 = 0; //SysTick_CounterCmd(SysTick_Counter_Enable); *(u32 *)0xe000e010 |= 1; while((I2C_GetFlagStatus(I2Cx, I2C_FLAG_BUSY))&&(!I2C_OT)); //SysTick_CounterCmd(SysTick_Counter_Disable); *(u32 *)0xe000e010 &= 0xfffffffe; if (I2C_OT) { /*i2c bus is busy. some other i2c communication is ongoing*/ I2C_OT = FALSE; return BUS_BUSY; }
我现在如果设一个全局变量 I2C_Timestamp ; 每进入一次SysTicker就自动加1 我的想法: 因为我现在SysTicker基准设置的是20ms。 因此这个全局变量是20ms加1。
那我如何修改呢?
|