OpenEdv-开源电子网

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

BEEP实验调用原子哥的delay_ms()函数软件仿真不准??

[复制链接]

2

主题

8

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2017-2-19
在线时间
13 小时
发表于 2017-2-22 15:33:40 | 显示全部楼层 |阅读模式
1金钱
[mw_shl_code=c,true]#include "sys.h"
#include "delay.h"
#include "led.h"
#include "beep.h"

//ALIENTEK 战舰 STM32 开发板实验 2
//蜂鸣器实验

int main(void)
{
        delay_init(); //延时函数初始化
        LED_Init(); //初始化与 LED 连接的硬件接口
        BEEP_Init(); //初始化蜂鸣器端口
       
        while(1)
        {
                LED0=0;
                BEEP=0;
                delay_ms(300);
                LED0=1;
                BEEP=1;
                delay_ms(300);       
        }
}



[/mw_shl_code]

BEEP实验调用原子哥的delay_ms()函数软件仿真不准??

BEEP实验调用原子哥的delay_ms()函数软件仿真不准??
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6661
金钱
6661
注册时间
2016-5-29
在线时间
909 小时
发表于 2017-2-22 21:14:07 | 显示全部楼层
想精确延时还是使用定时器来做比较好一些.这种死等延时只能在未进入大循环之前不精确的地方用一下,
回复

使用道具 举报

2

主题

8

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2017-2-19
在线时间
13 小时
 楼主| 发表于 2017-2-22 21:38:59 | 显示全部楼层
操作系统 发表于 2017-2-22 21:14
想精确延时还是使用定时器来做比较好一些.这种死等延时只能在未进入大循环之前不精确的地方用一下,

可是我用原子哥的程序仿真的时候是准确的??自己敲了一边代码就不行了
回复

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6661
金钱
6661
注册时间
2016-5-29
在线时间
909 小时
发表于 2017-2-22 21:48:13 | 显示全部楼层
可能是优化级别不一样造成的.或者是编译器版本不同造成的
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2017-2-22 22:44:35 | 显示全部楼层
SJFeilong 发表于 2017-2-22 21:38
可是我用原子哥的程序仿真的时候是准确的??自己敲了一边代码就不行了

说明你的时钟配置有问题。
仿真的时候,你进入peripherals里面,看看系统主频是多少?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

8

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2017-2-19
在线时间
13 小时
 楼主| 发表于 2017-2-23 08:45:55 | 显示全部楼层
正点原子 发表于 2017-2-22 22:44
说明你的时钟配置有问题。
仿真的时候,你进入peripherals里面,看看系统主频是多少?

多谢原子哥,问题是我的高速外部时钟osc的频率是12MHZ 而开发板的晶振用的是8MHZ,G:\SJFeilong_STM32F103ZET6\实验源码\BEEP实验调用原子哥的delay_ms()函数软件仿真不准??
但我自己水平有现,不只如何去修改??
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2017-2-23 20:31:23 | 显示全部楼层
SJFeilong 发表于 2017-2-23 08:45
多谢原子哥,问题是我的高速外部时钟osc的频率是12MHZ 而开发板的晶振用的是8MHZ,
但我自己水平有现, ...

delay初始化的时候,改为你正常的时钟就行了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

8

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2017-2-19
在线时间
13 小时
 楼主| 发表于 2017-2-23 22:02:06 | 显示全部楼层
正点原子 发表于 2017-2-23 20:31
delay初始化的时候,改为你正常的时钟就行了。

[mw_shl_code=c,true]   Tip: To avoid modifying this file each time you need to use different HSE, you
        can define the HSE value in your toolchain compiler preprocessor.
  */           
#if !defined  HSE_VALUE
#ifdef STM32F10X_CL   
  #define HSE_VALUE    ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */
#else
  #define HSE_VALUE    ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */
#endif /* STM32F10X_CL */
#endif /* HSE_VALUE */
[mw_shl_code=c,true]//SYSCLK:系统时钟
void delay_init()
{
#if SYSTEM_SUPPORT_OS                                                          //如果需要支持OS.
        u32 reload;
#endif
        SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);        //选择外部时钟  HCLK/8
        fac_us=SystemCoreClock/8000000;                                //为系统时钟的1/8  
#if SYSTEM_SUPPORT_OS                                                          //如果需要支持OS.
        reload=SystemCoreClock/8000000;                                //每秒钟的计数次数 单位为K          
        reload*=1000000/delay_ostickspersec;                //根据delay_ostickspersec设定溢出时间
                                                                                                //reload为24位寄存器,最大值:16777216,在72M下,约合1.86s左右       
        fac_ms=1000/delay_ostickspersec;                        //代表OS可以延时的最少单位          

        SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk;           //开启SYSTICK中断
        SysTick->LOAD=reload;                                                 //每1/delay_ostickspersec秒中断一次       
        SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;           //开启SYSTICK   

#else
        fac_ms=(u16)fac_us*1000;                                        //非OS下,代表每个ms需要的systick时钟数   
#endif
}                                        [/mw_shl_code][/mw_shl_code]


请原子哥看看  第一段代码应该是把外部的高速HSE设置成了8MHZ
delay_Init()函数我应该是直接用的光盘里的代码

多谢!!
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-22 11:48

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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