luzhenweixiaole 2024-12-19 21:59 采纳率: 0%
浏览 4
已结题

32f407单片机滴答定时器精准延时0ms

32f407单片机滴答定时器精准延时,延时0ms,写进去后,芯片一通电就发热,热到一定程度就崩溃了,复位也没用,

int main()

{

 Delay_ms(0);

 GPIO_ToggleBits(GPIOF,GPIO_Pin_10);

}



void Delay_ms(uint32_t nTime)

{

       uint_t delay_ms=21000;

       SysTick->LOAD = nTime*delay_ms ;   //重装载寄存器,最大计数值

SysTick->VAL = 0x00 ; //清空计数值

SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk ; // 开启倒数

do

{

temp=SysTick->CTRL;

}while((temp&0x01)&& !(temp & (1<<16))); //等待倒数到0为止

SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk ; // 关闭计数器

SysTick->VAL = 0x00 ; //清空计数值

}

  • 写回答

2条回答 默认 最新

  • 关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    从你的代码和问题描述来看,可能存在以下问题导致芯片过热崩溃:

    1. 延时函数问题:你的延时函数Delay_ms(0)意味着你试图实现一个即时切换的操作,但你的延时函数实现可能并不适合这种即时切换的场景。在函数中,你设置了SysTick的LOAD寄存器的值并开启了定时器,然后等待其计数到零。如果延时时间(nTime*delay_ms)设置得非常小,这可能导致处理器长时间忙等待在循环中,使得CPU过载并导致过热崩溃。即使是0ms的延时,实际运行时也还是需要一些时间的。你需要考虑去掉或者更改这部分逻辑。
    2. SysTick配置问题:在使用SysTick定时器时,需要正确配置其参数和状态。例如,重装载寄存器的值应该根据实际需要的延时时间和系统时钟频率来计算。你的代码中直接使用了一个固定的值delay_ms=21000可能并不适合所有情况。此外,还需要注意定时器的初始化设置以及可能的重载和中断处理。不正确的配置也可能导致意外行为或过热问题。

    为了解决这些问题,你可以尝试以下步骤:

    • 检查系统时钟配置:确保系统时钟配置正确,并且SysTick定时器的时钟源也配置正确。
    • 优化延时函数:考虑使用更高效的延时方法,例如使用中断或硬件定时器来实现精确的延时。对于即时切换的场景,可以尝试直接操作寄存器或使用更精确的方式切换GPIO状态。
    • 避免过载CPU:确保其他代码不会过度占用CPU资源,特别是在延时期间。避免在延时循环中进行大量计算或等待操作。
    • 调试和测试:使用调试工具检查代码运行时的状态和行为,特别是检查是否有异常的中断或CPU状态变化。

    下面是一个简化的例子,演示如何使用SysTick来实现一个基本的延时函数(注意这只是一个示例,可能需要根据你的具体需求进行调整):

    void SysTick_Init() {
        // 配置SysTick时钟和重载值等参数...
    }
    
    void Delay_ms(uint32_t delay_time) {
        // 使用SysTick实现精确的延时功能...
    }
    
    int main() {
        // 初始化SysTick和其他外设...
        SysTick_Init();
        GPIO_Init(); // 假设这是GPIO初始化的函数
        while(1) { // 主循环中无限循环或者执行其他任务
            Delay_ms(你的延时时间); // 在适当的地方调用延时函数
            GPIO_ToggleBits(GPIOF, GPIO_Pin_10); // 切换GPIO状态
        }
    }
    

    请注意,这只是一个大致的框架,具体的实现细节(如SysTick的配置和初始化)需要根据你的硬件和编译器进行调整。如果你不熟悉这些操作,建议查阅相关文档或寻求专业人士的帮助。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 3月13日
  • 创建了问题 12月19日