OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3028|回复: 3

stm32 proteus仿真延时函数有问题

[复制链接]

9

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
114
金钱
114
注册时间
2019-7-8
在线时间
51 小时
发表于 2020-6-3 23:16:32 | 显示全部楼层 |阅读模式
1金钱
我用proteus 8.9仿真stm32f103r6,入门的流水灯发现更改芯片以及宏定义代码后,用原子哥的delay_ms在Proteus仿真过程中,LED灯会非常快速的闪炼,我原以为可能是原子哥用的是外部晶振,而我是用HIS导致的,但用了外部晶振后,结果还是一样。最后我自己写了一个51用的那种延迟函数后,就可以正常点亮LED,而且延迟也正常。

最佳答案

查看完整内容[请看2#楼]

另附上改成48M内部时钟的代码,记得在proteus里面也同步改成48M void RCC_Configuration(void) { RCC_DeInit();//将外设 RCC寄存器重设为缺省值 RCC_HSICmd(ENABLE);//使能HSI while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);//等待HSI使能成功 //FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //FLASH_SetLatency(FLASH_Latency_2); RCC_HCLKConfig(RCC_SYSCLK_Div ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
114
金钱
114
注册时间
2019-7-8
在线时间
51 小时
 楼主| 发表于 2020-6-3 23:16:33 | 显示全部楼层
另附上改成48M内部时钟的代码,记得在proteus里面也同步改成48M

void RCC_Configuration(void)
{
    RCC_DeInit();//将外设 RCC寄存器重设为缺省值

    RCC_HSICmd(ENABLE);//使能HSI  
    while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);//等待HSI使能成功

    //FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
    //FLASH_SetLatency(FLASH_Latency_2);
   
    RCC_HCLKConfig(RCC_SYSCLK_Div1);//配置AHB时钟频率与系统时钟频率一致  8M
    RCC_PCLK1Config(RCC_HCLK_Div2);//配置APB1低速时钟频率为AHB时钟频率的1/2 4M
    RCC_PCLK2Config(RCC_HCLK_Div1);//配置APB2高速时钟频率与AHB时钟频率一致 8M
   
    //设置 PLL 时钟源及倍频系数
        //将内部晶振时钟2分频后作为PLL时钟源,倍频系数为12(即系统时钟为48MHz)
    RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_12);//使能或者失能 PLL,这个参数可以取:ENABLE或者DISABLE
    RCC_PLLCmd(ENABLE);//如果PLL被用于系统时钟,那么它不能被失能
    //等待指定的 RCC 标志位设置成功 等待PLL初始化成功
    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);

    //设置系统时钟(SYSCLK) 设置PLL为系统时钟源
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//选择想要的系统时钟
    //等待PLL成功用作于系统时钟的时钟源
    //  0x00:HSI 作为系统时钟
    //  0x04:HSE作为系统时钟
    //  0x08:PLL作为系统时钟  
    while(RCC_GetSYSCLKSource() != 0x08);//需与被选择的系统时钟对应起来,RCC_SYSCLKSource_PLL
}


记得删掉startup文件里面的sysinit有关代码,记住汇编是用分号 ; 注释.
批注 2020-07-10 185530.png
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2020-6-5 01:27:47 | 显示全部楼层
帮顶
回复

使用道具 举报

9

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
114
金钱
114
注册时间
2019-7-8
在线时间
51 小时
 楼主| 发表于 2020-7-10 18:51:10 | 显示全部楼层
自己已经解决了,希望能对以后搜到这个帖子的兄弟有帮助(估计除了大学课设也没地方非要用Proteus仿真32)本人用的是proteus8.9sp2
以下是systick延时正常的代码,可以直接替换

我采用的是用的是48M内部时钟,在注释里可以看到,如果用的72M可以直接在第一行那里改成72

#include "delay.h"

void delay_us(uint32_t nTime)
{
        SysTick->LOAD=48*nTime;                                //装载计数值,因为时钟48M,48次为1us
        SysTick->CTRL=0x00000005;                        //时钟来源为HCLK,打开定时器
        while(!(SysTick->CTRL&0x00010000));        //等待计数到0
        SysTick->CTRL=0x00000004;                        //关闭定时器
}

void delay_ms(uint32_t nTime)
{
        for(;nTime>0;nTime--)
                delay_us(1000);
}






回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-17 22:50

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表