新手入门
- 积分
- 9
- 金钱
- 9
- 注册时间
- 2021-2-26
- 在线时间
- 1 小时
|
楼主 |
发表于 2024-4-11 16:03:39
|
显示全部楼层
MCU为STM32F103,通用定时器为TIM6,想实现1us延时,下面附一下程序,在说明问题
void Delay1us(uint32_t nus)
{
delaycnt = nus;
// TIM_Cmd(TIM6, ENABLE);
while(delaycnt>0);
// TIM_Cmd(TIM6, DISABLE);
}
// 计时 72M/36000=2K 0.5ms 72M/72000=1K 1us
void TIM6_configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6 , ENABLE);
TIM_DeInit(TIM6);
TIM_TimeBaseStructure.TIM_Period=0; // 自动重装载寄存器周期的值(计数值)
TIM_TimeBaseStructure.TIM_Prescaler=72-1; // 时钟预分频数 72M/
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; // 采样分频
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; // 向上计数模式
TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure);
TIM_ClearFlag(TIM6, TIM_FLAG_Update); // 清除溢出中断标志
TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE);
TIM_Cmd(TIM6, ENABLE); // 开启时钟
}
void TIM6_IRQHandler(void)
{
if ( TIM_GetITStatus(TIM6 , TIM_IT_Update) != RESET )
{
if( delaycnt > 0 )
{
delaycnt--;
}
TIM_ClearITPendingBit(TIM6 , TIM_FLAG_Update);
}
}
void NVIC_TIM_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 4;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
当我的程序这样写
TIM_TimeBaseStructure.TIM_Period=0; // 自动重装载寄存器周期的值(计数值)
TIM_TimeBaseStructure.TIM_Prescaler=72-1; // 时钟预分频数 72M/
芯片会卡在 while(delaycnt>0);,,无法继续执行下去
如果改成 TIM_Period=0; , 是很精准的2us,这是怎么回事呢
|
|