OpenEdv-开源电子网

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

跑马灯实验修改,没有循环体,程序为什么也会自动执行三次?

[复制链接]

53

主题

175

帖子

1

精华

高级会员

Rank: 4

积分
516
金钱
516
注册时间
2014-5-16
在线时间
7 小时
发表于 2014-6-10 10:35:56 | 显示全部楼层 |阅读模式
5金钱
[mw_shl_code=c,true]#include "led.h" #include "delay.h" #include "sys.h" int main(void) { delay_init(); LED_Init(); delay_ms(1000); LED4=1; LED5=1; LED6=1; LED7=1; LED8=1; delay_ms(1000); LED4=0; LED5=0; LED6=0; LED7=0; LED8=0; delay_ms(1000); LED4=1; LED5=0; LED6=0; LED7=0; LED8=0; delay_ms(1000); LED4=0; LED5=1; LED6=0; LED7=0; LED8=0; delay_ms(1000); LED4=0; LED5=0; LED6=1; LED7=0; LED8=0; delay_ms(1000); LED4=0; LED5=0; LED6=0; LED7=1; LED8=0; delay_ms(1000); LED4=0; LED5=0; LED6=0; LED7=0; LED8=1; delay_ms(1000); LED4=0; LED5=0; LED6=0; LED7=0; LED8=0; delay_ms(1000); LED4=0; LED5=0; LED6=0; LED7=0; LED8=0; delay_ms(1000); LED4=0; LED5=0; LED6=0; LED7=0; LED8=0; delay_ms(1000); LED4=0; LED5=0; LED6=0; LED7=0; LED8=0; } [/mw_shl_code]

代码和仿真结果如上!
代码中没有循环体,为什么会仿真三次呢?

最佳答案

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

没有死循环,你执行完之后啥都没了
本人新人,各位多包涵!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

56

主题

1237

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2644
金钱
2644
注册时间
2014-2-13
在线时间
518 小时
发表于 2014-6-10 10:35:57 | 显示全部楼层
没有死循环,你执行完之后啥都没了
技术交流,Sell 中颖单片机,欢迎私信骚扰
回复

使用道具 举报

53

主题

175

帖子

1

精华

高级会员

Rank: 4

积分
516
金钱
516
注册时间
2014-5-16
在线时间
7 小时
 楼主| 发表于 2014-6-10 11:13:23 | 显示全部楼层
回复【2楼】黑夜之狼:
---------------------------------
正常的话应该执行一次吧,这个为什么执行了三次,然后才一直保持最后的状态?
本人新人,各位多包涵!
回复

使用道具 举报

5

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2013-6-6
在线时间
0 小时
发表于 2014-6-10 11:59:28 | 显示全部楼层
我记得以前在51还是AVR的时候如果main函数里面不加while(1)循环体的话  CPU会自己找事情做,他是不停的!我以前也写过一个LED灯的,像你主要没有加while,结果就是循环的执行!

看你的图,如果我没有看错的话你后面应该还在继续执行呢,不会就3次的!不信你可以做实验看看!

回复

使用道具 举报

53

主题

175

帖子

1

精华

高级会员

Rank: 4

积分
516
金钱
516
注册时间
2014-5-16
在线时间
7 小时
 楼主| 发表于 2014-6-10 12:40:14 | 显示全部楼层
回复【4楼】Admini:
---------------------------------
烧到板子后,只循环三次。。。已经试过了
本人新人,各位多包涵!
回复

使用道具 举报

5

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2013-6-6
在线时间
0 小时
发表于 2014-6-10 13:17:31 | 显示全部楼层
回复【5楼】x1213378204:
---------------------------------
多做几次?这个没有while(1)系统部知道做什么,你多做几次看看结果是不是都一样的!我以前用51的时候我也忘记具体的现象了,反正系统是会执行某任务
回复

使用道具 举报

53

主题

175

帖子

1

精华

高级会员

Rank: 4

积分
516
金钱
516
注册时间
2014-5-16
在线时间
7 小时
 楼主| 发表于 2014-6-10 13:30:39 | 显示全部楼层
回复【6楼】Admini:
---------------------------------
恩恩,是一样的,不知道这个内部是什么逻辑,为什么执行三次?
本人新人,各位多包涵!
回复

使用道具 举报

74

主题

293

帖子

0

精华

高级会员

Rank: 4

积分
628
金钱
628
注册时间
2014-1-8
在线时间
7 小时
发表于 2014-6-10 13:45:31 | 显示全部楼层
单片机会循环扫描的,没有while(1),但是整个程序在一遍一遍地被 扫描
回复

使用道具 举报

53

主题

175

帖子

1

精华

高级会员

Rank: 4

积分
516
金钱
516
注册时间
2014-5-16
在线时间
7 小时
 楼主| 发表于 2014-6-10 13:53:21 | 显示全部楼层
回复【8楼】MTFQ:
---------------------------------
我试着把蜂鸣器的while(1)删掉了,结果也是执行三次,然后保持最后的状态不变了。单片机循环扫描是三次吗?
本人新人,各位多包涵!
回复

使用道具 举报

5

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2013-6-6
在线时间
0 小时
发表于 2014-6-10 15:13:47 | 显示全部楼层
回复【9楼】x1213378204:
---------------------------------
忘记了!但是可以肯定的是单片机也出现过这个问题,别人给的解释是单片机晶振一直在起振,CPU也一直在做事,比不给他安排事情做,他就会自己随机找事情做!
像这样的问题后面最好加个 while(1);  空循环
回复

使用道具 举报

74

主题

293

帖子

0

精华

高级会员

Rank: 4

积分
628
金钱
628
注册时间
2014-1-8
在线时间
7 小时
发表于 2014-6-13 18:34:48 | 显示全部楼层
回复【9楼】x1213378204:
---------------------------------
你是仿真还是下载进去后执行了三次?,如果是仿真我建议你下载到硬件中去
回复

使用道具 举报

53

主题

175

帖子

1

精华

高级会员

Rank: 4

积分
516
金钱
516
注册时间
2014-5-16
在线时间
7 小时
 楼主| 发表于 2014-6-16 12:18:14 | 显示全部楼层
回复【11楼】MTFQ:
---------------------------------
烧进去之后,还是运行了三次,从板子led的闪烁情况可以判断
本人新人,各位多包涵!
回复

使用道具 举报

74

主题

293

帖子

0

精华

高级会员

Rank: 4

积分
628
金钱
628
注册时间
2014-1-8
在线时间
7 小时
发表于 2014-6-16 12:46:52 | 显示全部楼层
把你的完整程序发来看看
回复

使用道具 举报

53

主题

175

帖子

1

精华

高级会员

Rank: 4

积分
516
金钱
516
注册时间
2014-5-16
在线时间
7 小时
 楼主| 发表于 2014-6-17 14:23:52 | 显示全部楼层
 回复【13楼】 MTFQ :
---------------------------------
[mw_shl_code=c,true]#include "led.h" #include "delay.h" #include "sys.h" int main(void) { delay_init(); LED_Init(); delay_ms(1000); LED4=1; LED5=1; LED6=1; LED7=1; LED8=1; delay_ms(1000); LED4=0; LED5=0; LED6=0; LED7=0; LED8=0; delay_ms(1000); LED4=1; LED5=0; LED6=0; LED7=0; LED8=0; delay_ms(1000); LED4=0; LED5=1; LED6=0; LED7=0; LED8=0; delay_ms(1000); LED4=0; LED5=0; LED6=1; LED7=0; LED8=0; delay_ms(1000); LED4=0; LED5=0; LED6=0; LED7=1; LED8=0; delay_ms(1000); LED4=0; LED5=0; LED6=0; LED7=0; LED8=1; delay_ms(1000); LED4=0; LED5=0; LED6=0; LED7=0; LED8=0; delay_ms(1000); LED4=0; LED5=0; LED6=0; LED7=0; LED8=0; delay_ms(1000); LED4=0; LED5=0; LED6=0; LED7=0; LED8=0; delay_ms(1000); LED4=0; LED5=0; LED6=0; LED7=0; LED8=0; } [/mw_shl_code]

[mw_shl_code=c,true]#include "led.h" void LED_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC, ENABLE); //使能PB,PE端口时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12; //LED0-->B.5 端口配置 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz GPIO_Init(GPIOC, &GPIO_InitStructure); //根据设定参数初始化GPIOB.5 GPIO_ResetBits(GPIOC,GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12); //PB.5 输出高 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14|GPIO_Pin_15; //LED1-->E.5 端口配置, 推挽输出 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz GPIO_Init(GPIOA, &GPIO_InitStructure); //推挽输出 ,IO口速度为50MHz GPIO_ResetBits(GPIOA,GPIO_Pin_14|GPIO_Pin_15); //PE.5 输出高 } [/mw_shl_code]

本人新人,各位多包涵!
回复

使用道具 举报

74

主题

293

帖子

0

精华

高级会员

Rank: 4

积分
628
金钱
628
注册时间
2014-1-8
在线时间
7 小时
发表于 2014-6-17 15:20:22 | 显示全部楼层
回复【14楼】x1213378204:
----------------------------
你的系统时钟有没有 初始化
回复

使用道具 举报

74

主题

293

帖子

0

精华

高级会员

Rank: 4

积分
628
金钱
628
注册时间
2014-1-8
在线时间
7 小时
发表于 2014-6-17 15:21:16 | 显示全部楼层
回复【14楼】x1213378204:
---------------------------------
还有就是写个最简单的程序,看能不能循环执行,慢慢找问题
回复

使用道具 举报

53

主题

175

帖子

1

精华

高级会员

Rank: 4

积分
516
金钱
516
注册时间
2014-5-16
在线时间
7 小时
 楼主| 发表于 2014-6-17 15:28:57 | 显示全部楼层
回复【16楼】 MTFQ :
---------------------------------


这是系统时钟,应该没有问题,又试了一次,还是会执行三次,毫无理由呀
本人新人,各位多包涵!
回复

使用道具 举报

53

主题

175

帖子

1

精华

高级会员

Rank: 4

积分
516
金钱
516
注册时间
2014-5-16
在线时间
7 小时
 楼主| 发表于 2014-6-17 15:30:47 | 显示全部楼层
 回复【16楼】 MTFQ :
---------------------------------
这个是程序,你可以试试

实验1跑马灯.zip

1.84 MB, 下载次数: 845

本人新人,各位多包涵!
回复

使用道具 举报

3

主题

12

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2015-5-9
在线时间
0 小时
发表于 2015-5-13 19:30:24 | 显示全部楼层
回复【18楼】x1213378204:
---------------------------------
你这个找到原因了么?我也遇到了。。。自动运行三次。。。
回复

使用道具 举报

2

主题

8

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2015-5-6
在线时间
0 小时
发表于 2015-5-13 20:13:45 | 显示全部楼层
我也碰到和你一样的问题,没有循环体,程序也会执行三次,有时候还只执行两次,百度到有很多说法,比如系统时钟出问题,或者板子的芯片因为执行完程序空闲了又自己执行一次之类的,你可以试着在末尾加一个while(1);试试,我的程序不能加那个死循环,所以也没找到解决办法
回复

使用道具 举报

4

主题

57

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
269
金钱
269
注册时间
2016-1-25
在线时间
75 小时
发表于 2016-1-25 14:21:12 | 显示全部楼层
本帖最后由 ljmf5 于 2016-1-25 14:23 编辑

#include "sys.h"
#include "usart.h"
//ALIENTEK战舰STM32开发板实验4
//串口实验  
//技术支持:www.openedv.com
//广州市星翼电子科技有限公司
int main(void)
{
         u8 t=0;
        u8 tt='A';
        u8 aa;        
        delay_init();
        uart_init(9600);         //串口初始化为9600        
    USART_ClearFlag(USART1,USART_FLAG_TC);
         for(t=0;t<5;t++)
                        {        
                                aa=tt+t;        
                                USART_SendData(USART1, aa);//向串口1发送数据
                                while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
                        }
        while(1);

}         

这是串口库函数的一个程序,我之前没有最后的“while(1);”,就出现重复三次,之后就进入HardFaultException()的错误死循环。

但是使用寄存器方法,没有while(1);,程序也能够正常执行,下面是程序
#include "delay.h"       
#include "led.h"
#include "beep.h"                  
#include "key.h"                  
//ALIENTEK战舰STM32开发板实验4
//串口实验  
//技术支持:www.openedv.com
//广州市星翼电子科技有限公司
int main(void)
{                       
        u16 t;
        u16 tt='A';       
        //u16 times=0;                                           
        Stm32_Clock_Init(9);        //系统时钟设置
        uart_init(72,9600);                 //串口初始化为9600
        delay_init(72);                            //延时初始化
//        LED_Init();                                  //初始化与LED连接的硬件接口
//        BEEP_Init();                 //初始化蜂鸣器端口
//        KEY_Init();                 //初始化与按键连接的硬件接口

        USART1->SR&=0Xbf;         //若没有这个TC清0动作,最后串口输出为“ACDE"
                                                 //SR的初始值为0x00c0,即TC和TXE均为1
                 for(t=0;t<5;t++)
                        {
                                USART1->DR=tt+t;
                                while((USART1->SR&0X40)==0);//等待发送结束
                        }
}

回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-22 02:45

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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