自己在测试个模拟i2c的时候,由于滴答定时器给用了,没有了us的精确延时,很烦。
自己突发写了一个,很简单,很好用。系统时钟是72M
例程如下
- void delay_init(void)
- {
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //时钟使能
- //定时器TIM4初始化
- TIM_TimeBaseStructure.TIM_Period = 40000; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
- TIM_TimeBaseStructure.TIM_Prescaler =0; //设置用来作为TIMx时钟频率除数的预分频值
- TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
- TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
- }
-
- //最大延时 65536/72 = 910 us
- void delay_us(uint32 nTime)
- {
- /* 清零计数器并使能定时器 */
- nTime*=72;
- TIM4->CNT = 0;
- TIM_Cmd(TIM4,ENABLE);
- while( (TIM4->CNT) < nTime);
- TIM_ClearFlag(TIM4, TIM_FLAG_Update);
- TIM_Cmd(TIM4,DISABLE);
- }
-
- void delay_ms(u16 ms)
- {
- while(ms--)
- {
- delay_us(500);
- delay_us(500);
- }
- }
本帖最后由 weizhongc 于 2017-11-7 17:19 编辑