OpenEdv-开源电子网

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

控制跑马灯实验的延迟函数哪里错了

[复制链接]

21

主题

53

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
307
金钱
307
注册时间
2017-12-22
在线时间
65 小时
发表于 2017-12-29 14:24:06 | 显示全部楼层 |阅读模式
2金钱
我想要灯亮10秒,暗十秒,但LED灯闪的很快啊

while(1){


               
        GPIO_ResetBits(GPIOB,GPIO_Pin_5);

        delay_ms(10000);
       
        GPIO_SetBits(GPIOB,GPIO_Pin_5);

        delay_ms(10000);
}

}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
91
金钱
91
注册时间
2017-11-5
在线时间
22 小时
发表于 2017-12-29 14:42:03 来自手机 | 显示全部楼层
把延时函数放上来看看
回复

使用道具 举报

3

主题

111

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1085
金钱
1085
注册时间
2015-5-22
在线时间
607 小时
发表于 2017-12-29 14:42:59 | 显示全部楼层
那你应该把延时函数发上来......
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2017-12-29 15:04:25 | 显示全部楼层
//延时nms
//注意nms的范围
//SysTick->LOAD为24位寄存器,所以,最大延时为:
//nms<=0xffffff*8*1000/SYSCLK
//SYSCLK单位为Hz,nms单位为ms
//对72M条件下,nms<=1864
void delay_ms(u16 nms)
{                                     
        u32 temp;                  
        SysTick->LOAD=(u32)nms*fac_ms;                                //时间加载(SysTick->LOAD为24bit)
        SysTick->VAL =0x00;                                                        //清空计数器
        SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;        //开始倒数  
        do
        {
                temp=SysTick->CTRL;
        }while((temp&0x01)&&!(temp&(1<<16)));                //等待时间到达   
        SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;        //关闭计数器
        SysTick->VAL =0X00;                                               //清空计数器                      
}
你用的估计是这个delay_ms  最大 1864
改成下面的试试
void delay_ms(u32 nms)
{                                    
         delay_us((u32)(nms*1000));                                        //普通方式延时  
}
回复

使用道具 举报

16

主题

409

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1292
金钱
1292
注册时间
2014-12-20
在线时间
534 小时
发表于 2017-12-29 15:08:43 | 显示全部楼层
应该是void delay_ms(uint8_t)的延时函数吧,你这10000超范围了,程序上会只取一个字节做处理。
回复

使用道具 举报

9

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2015-9-27
在线时间
38 小时
发表于 2017-12-29 15:15:58 | 显示全部楼层
你是下载到板子测试还是软件仿真?先确认自己的系统时钟是不是72M,原子的工程师8M外部晶振,倍频到72M工作时钟
回复

使用道具 举报

34

主题

174

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1103
金钱
1103
注册时间
2017-3-10
在线时间
173 小时
发表于 2017-12-29 15:45:17 | 显示全部楼层
BMN李 发表于 2017-12-29 15:08
应该是void delay_ms(uint8_t)的延时函数吧,你这10000超范围了,程序上会只取一个字节做处理。

超了之后就溢出了,剩下的不都是0么?相当于一直set---》reset就一闪一闪的了呗
回复

使用道具 举报

16

主题

409

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1292
金钱
1292
注册时间
2014-12-20
在线时间
534 小时
发表于 2017-12-29 16:25:13 | 显示全部楼层
stm32wwxf 发表于 2017-12-29 15:45
超了之后就溢出了,剩下的不都是0么?相当于一直set---》reset就一闪一闪的了呗

不是的哦。看大小端使用最高字节或者最低字节的数据。不是绝对的0。
回复

使用道具 举报

7

主题

247

帖子

0

精华

高级会员

Rank: 4

积分
745
金钱
745
注册时间
2016-1-20
在线时间
78 小时
发表于 2017-12-29 16:28:02 | 显示全部楼层
莫非员资格写的不够清除,   //对72M条件下,nms<=1864

每次延时1000 一共延时10次。OK?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-23 10:06

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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