TI中文支持网
TI专业的中文技术问题咨询交流网站

MSP432P401R自建延时函数进入死循环,请求指教

使用开发板MSP432P401R_LP REV 2.0

尝试了两种方法,都不行,似乎是同样的问题。

代码如下:

我的思路是,在1ms一次的定时器中断里设置计数变量uwTick,需要延时时,用变量tickstart保存当前uwTick的值

当uwTick与tickstart差大于需要延时时间 Delay(暂时不考虑差值为复数的情况),则退出死循环while((hal_get_tick() – tickstart) < wait)

方法二:需要延时时,置标志Time_Start ,在1ms一次的定时器中断里判断Time_Start是否为1

如果为1,则开始计时,通过delay_ms函数的形参传送需要延时的时间给Delay_Time

当计时结束时,置标志Time_OK,将Time_Start标志,计数变量times清零

退出循环while (Time_OK == 0);将Time_OK标志清零。

Time_Start,Time_OK,Delay_Time 均为整个工程的全局变量2021_dian_sai.zip

相关说明:定时器时钟为SMCLK 3Mhz,主时钟MCLK来源外部晶振48Mhz

附上整个工程文件。

#include <msp432.h>
#include <stdint.h>
#include <project.h>
volatile uint16_t times = 0;
volatile uint8_t Edge = 1; //Echo引脚上升/下降沿捕获状态
volatile uint32_t uwTick = 0; //每1毫秒加1
volatile uint16_t start_time = 0; //Echo引脚上升沿捕获时间
volatile float delay_time = 0; //Echo引脚高电平时间

//此处需要注意HAL_GetTick()返回的无符号类型要与当前CPU的位数一致。

//方法1
uint32_t hal_get_tick()
{
return uwTick;
}

void hal_delay(uint32_t Delay)
{
volatile uint32_t tickstart = hal_get_tick();
volatile uint32_t wait = Delay;

while((hal_get_tick() – tickstart) < wait)
{

}
}

//方法二
void delay_ms (uint16_t delay_time)
{
Time_Start = 1;
Delay_Time = delay_time;
while (Time_OK == 0);
Time_OK = 0;
return;
}

void TA0_0_IRQHandler(void)
{
TIMER_A0->CCTL[0] &= ~TIMER_A_CCTLN_CCIFG;
P2->OUT ^= BIT0;
uwTick ++;

//————————————————-
//延时函数
if (Time_Start == 1)
{
if (times >= Delay_Time)
{
Time_Start = 0;
times = 0;
Time_OK = 1;
}
else
times ++;
}
}

Susan Yang:

我们会在周一测试后给您回复

Susan Yang:

您可以调试一下程序看一下,应该就会发现问题了

请问您现在是想实现延时函数?建议您参考下面的代码示例,尤其是下面的例子,或者使用__delay_cycles()

msp432p401x_ta0_01                             Timer0_A3, Toggle P1.0, CCR0 Cont Mode ISR, DCO SMCLK
msp432p401x_ta0_02                             Timer0_A3, Toggle P1.0, CCR0 Up Mode ISR, DCO SMCLK
msp432p401x_ta0_03                             Timer_A3, Toggle P1.0, Overflow ISR, DCO SMCLK
msp432p401x_ta0_04                             Timer0_A3, Toggle P1.0, Overflow ISR, 32kHz ACLK
msp432p401x_ta0_08                             Timer_A3, Toggle P1.0;P7.3,P2.4-5, Cont. Mode ISR, 32kHz ACLK
msp432p401x_ta1_05                             Timer1_A3, Toggle P1.0, CCR0 Cont. Mode ISR, 32kHz ACLK
msp432p401x_ta1_11                             Timer_A3, Toggle P8.0/TA1.0, Up Mode, 32kHz ACLK
msp432p401x_ta1_13                             Timer1_A3, Toggle P8.0/TA1.0, Up/Down Mode, DCO SMCLK
msp432p401x_ta1_14                             Timer1_A3, Toggle P8.0/TA1.0, Up/Down Mode, 32kHz ACLK

赞(0)
未经允许不得转载:TI中文支持网 » MSP432P401R自建延时函数进入死循环,请求指教
分享到: 更多 (0)