使用开发板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 均为整个工程的全局变量4786.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
,
Susan Yang:
另外有网上也有一些分享,您可以参考一下
zhuanlan.zhihu.com/…/341250710