新手上路
- 积分
- 28
- 金钱
- 28
- 注册时间
- 2020-4-22
- 在线时间
- 6 小时
|
6金钱
原子的延时代码
- #include "stm32f10x.h"
- #include "delay.h"
- static u8 fac_us=0;//us延时倍乘数
- static u16 fac_ms=0;//ms延时倍乘数
- //初始化延迟函数
- //SYSTICK的时钟固定为HCLK时钟的1/8
- //SYSCLK:系统时钟
- void delay_init(u8 SYSCLK)
- {
- SysTick->CTRL&=0xfffffffb;//bit2清空,选择外部时钟 HCLK/8
- fac_us=SYSCLK/8;
- fac_ms=(u16)fac_us*1000;
- }
- //延时nms
- //注意nms的范围
- //SysTick->LOAD为24位寄存器,所以,最大延时为:
- //nms<=0xffffff*8*1000/SYSCLK
- //SYSCLK单位为Hz,nms单位为ms
- //对72M条件下,nms<=1864
- void delay_ms(u16 nms)
- {
- u32 temp;
- SysTick->LOAD=(u32)nms*fac_ms;//时间加载(SysTick->LOAD为24bit)
- SysTick->VAL =0x00; //清空计数器
- SysTick->CTRL=0x01 ; //开始倒数
- do
- {
- temp=SysTick->CTRL;
- }
- while(temp&0x01&&!(temp&(1<<16)));//等待时间到达
- SysTick->CTRL=0x00; //关闭计数器
- SysTick->VAL =0X00; //清空计数器
- }
- //延时nus
- //nus为要延时的us数.
- void delay_us(u32 nus)
- {
- u32 temp;
- SysTick->LOAD=nus*fac_us; //时间加载
- SysTick->VAL=0x00; //清空计数器
- SysTick->CTRL=0x01 ; //开始倒数
- do
- {
- temp=SysTick->CTRL;
- }
- while(temp&0x01&&!(temp&(1<<16)));//等待时间到达
- SysTick->CTRL=0x00; //关闭计数器
- SysTick->VAL =0X00; //清空计数器
- }
复制代码 野火的延时代码
- static __IO u32 TimingDelay = 0;
- void Delay_us(uint32_t us)
- {
- uint32_t i;
- SysTick_Config(72);
- for(i=0;i<us;i++)
- {
- while( !((SysTick->CTRL)&(1<<16)));
- }
- SysTick->CTRL &=~SysTick_CTRL_ENABLE_Msk;
- }
- void Delay_ms(uint32_t ms)
- {
- uint32_t i;
- SysTick_Config(72000);
- for(i=0;i<ms;i++)
- {
- while( !((SysTick->CTRL)&(1<<16)));
- }
- SysTick->CTRL &=~SysTick_CTRL_ENABLE_Msk;
- }
- void TimingDelay_Decrement(void)
- {
- if ( TimingDelay != 0x00 )
- {
- TimingDelay --;
- }
- }
复制代码 延时代码在普通情况下都能使用
但是在我设置了一个普通定时器中断后,延时就不能用了
分组为2,优先级为 0 0
- 设置
- static void PS2_NVIC_Config(void)
- {
- NVIC_InitTypeDef NVIC_InitStructure;
-
- // 设置中断来源
- NVIC_InitStructure.NVIC_IRQChannel = TIM7_IRQn ;
- // 设置主优先级为 0
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
- // 设置抢占优先级为
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
- }
- static void PS2_TIM_Config(void)
- {
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
- // 开启定时器时钟,即内部时钟CK_INT=72M
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM7, ENABLE);
- // 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断
- TIM_TimeBaseStructure.TIM_Period = 7999;
- // 时钟预分频数为
- TIM_TimeBaseStructure.TIM_Prescaler= 71;
- TIM_TimeBaseInit(TIM7, &TIM_TimeBaseStructure);
- // 清除计数器中断标志位
- TIM_ClearFlag(TIM7, TIM_FLAG_Update);
- // 开启计数器中断
- TIM_ITConfig(TIM7,TIM_IT_Update,ENABLE);
- // 使能计数器
- TIM_Cmd(TIM7, ENABLE);
- }
- //中断
- void PS2_TIM_IRQHandler(void)
- {
- if(TIM_GetITStatus(TIM7,TIM_IT_Update)!=RESET)
- { PS2_DataKey();
- if(Handkey !=0xffff){
- switch(Handkey)
- {
- case stop_ps2:
- Allstop();break;
- case straight_ps2:
- straight();break;
- case back_ps2:
- Back();break;
- case left_ps2:
- left_move();break;
- case right_ps2:
- right_move();break;
- case turn_right_R2:
- Turn_right();break;
- case turn_left_L2:
- Turn_left();break;
- case Steering_gear_left_ps2:
- //PCA_MG9XX(0,0,180,1,10);
- break;
- case Steering_gear_down_ps2:
- break;
- case Steering_gear_right_ps2:
- break;
- case Steering_gear_up_ps2:
- break;
- }
-
- TIM_ClearFlag(TIM7,TIM_FLAG_Update);}
-
- else{
- Allstop();
- TIM_ClearFlag(TIM7,TIM_FLAG_Update);}
-
- }
- }
复制代码
求助大佬,为什么会冲突,导致延时不能使用
|
最佳答案
查看完整内容[请看2#楼]
假如主循环正在运行到延时函数里,中断里也用了延时函数,就可能造成中断里关闭了计数器,主循环的延时仍在等待计数,就等不到了。
|