• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

对mini板的LED点亮程序移植的一些疑问

f50a3df8d4104c44 2018-06-04 浏览量:1117

关于mini板的LED点亮程序的移植,调试了几天有点迷糊,用的是原子的程序,我给改成同时点亮然后延时是一段时间之后熄灭然后延时,这样循环下来,看到的效果就是同时亮灭,源程序如下:

GPIO_ResetBits(GPIOAGPIO_Pin_7); //LED0输出低
GPIO_ResetBits(GPIODGPIO_Pin_2);//LED1输出高

delay_ms(500);

GPIO_SetBits(GPIOAGPIO_Pin_7);//LED0输出高
GPIO_SetBits(GPIODGPIO_Pin_2);//LED1输出低

delay_ms(500);

在mini板里面看到的效果的确是同时亮灭,但是移植到proteus仿真里面用的处理器是f103r6,出现的效果是不同步的,就是先亮A口的LED,然后亮D口的,程序就是由上到下跑一行就立马执行,不同步的效果很明显,后来试了一下改程序如下,在一行里面执行:

GPIO_ResetBits(GPIOAGPIO_Pin_7|GPIO_Pin_2); //LED0输出低

delay_ms(500);

GPIO_SetBits(GPIOAGPIO_Pin_7|GPIO_Pin_2);//LED0输出高

delay_ms(500);

结果出现的效果就是同步的了,所以有几个问题想请教各位大神:

(1)对于mini板的程序实际也是像f103r6的仿真一样是跑一行代码就会立即执行的,实际也是不同步的,只是在实际板子上人眼看到的效果是同步的,对否?

(2)不确定是不是仿真的原因,我试了库函数操作,寄存器操作,只要是分两行执行的代码,无论是不是同一组IO都会出现不同步的情况,那么在实际的f103r6的板子上运行的话是不是人眼看到的效果就是同步的了?还是说也是不同步的(我手边只有mini的板子,老师需要仿真,但是库里面的只有r6等几个简单的处理器)

(3)在用位带操作控制IO的时候,仿真里面就不是按照代码的顺序执行的,调试的时候发现是乱跳着执行的,是仿真的原因还是f103r6这个处理器不支持位带操作,代码如下:

LED0=0;
LED1=0;

delay_ms(500);


​LED0=1;

LED1=1;

delay_ms(500);

最后感谢各位大神过来看看,帮忙解答,嘿嘿~~


0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 1、
    对的。
    单片机的程序都是顺序执行的,即一条一条语句执行的,只是执行的很快,人眼是看不出来的,如果用高速的示波器或是逻辑分析仪是可以看到两个引脚的变化是有时间差的。
    2、
    在板子上,相临的两条代码的执行是很快的,人眼是看不出来先后的。
    这个问题,可能是proteus仿真时的时基设置的太小的原因吧,仿真时把时间变慢了。在使用其他的仿真软件时,会有时基的设置,一般都是设置成与实际的时间一样,但有时要看细的波形,会设置成1ms或是更小,这时,时间就被放大了,你可以看看proteus仿真软件是不是支持时基的设置,本人不用这个软件,都是在板子上调。
    3、
    STM32不可以位操作,也可以说不可以像51那样的位操作,但是可以通过“与”与“或”的运算达到位操作的效果。

    • 发布于 2018-06-04
    • 举报
    • 评论 3
    • 0
    • 0
f50a3df8d4104c44 回复了 汉云:所以程序前后两句执行的时间间隔在实际的板子上人眼是看不到误差的,还是proteus软件的原因,我是直接抑制的原子的例程来做的,例程用了位带操作,实际操作的还是寄存器吧 回复
汉云 回复了 f50a3df8d4104c44:是的,还是寄存器,但是原子的寄存器位操作,与51的是不同的,32的位操作是操作的整个寄存器,只是修改了其中的某些位 回复
f50a3df8d4104c44 回复了 汉云:这个位带操作是通过与、或运算修改了寄存器中用户想要修改的某些位,对的吧,那位带操作再mini板上可以实现,在r6上应该也是可以实现的,都是f1系列的,但是仿真单步调试的效果是乱跳,不是按照代码顺序实现的,是不是要是在板子上就不会有这个问题了啊?包括开始说的LED不同步的问题,都是仿真软件的原因导致的 回复

其他答案 数量:18
  • 你怀疑板子上实际是不同步的话,你让板子跑的时间长一些就可以看出来了,
    • 发布于2018-06-04
    • 举报
    • 评论 1
    • 0
    • 0
f50a3df8d4104c44 回复了 szy123 :让板子跑的时间长一些,两句命令挨着的啊,怎么看得出来啊 回复

  • 1.对的,分开的话就是对IO寄存器分别赋值一次,所以不同步

    2.也是不同步,执行一条指令的速率太快,可以近似同步,

    3.STM32不支持位带操作,你这样宏定义的位置在其他地方,所以仿真的时候会跳到宏定义的地方去执行,寄存器操作指令,就看起来乱跳。

    • 发布于2018-06-04
    • 举报
    • 评论 4
    • 0
    • 0
f50a3df8d4104c44 回复了 nealson :那就是说如果代码实际上是在f103r6的板子上跑的话人眼看起来也是同步的了?仿真的不同步可以先不考虑?至于位带操作,原子的mini板是支持的,f103r6的仿真是乱跳,不知道实际板子是不是的 回复
f50a3df8d4104c44 回复了 nealson :那就是说如果代码实际上是在f103r6的板子上跑的话人眼看起来也是同步的了?仿真的不同步可以先不考虑?至于位带操作,原子的mini板是支持的,f103r6的仿真是乱跳,不知道实际板子是不是的 回复
nealson 回复了 nealson :嗯,实际运行感觉不出来的。实际仿真不会,乱跳不代表瞎执行,和你这软件有关系。 回复
f50a3df8d4104c44 回复了 nealson :我在调试的时候乱跳是我看到的LED0的亮灭两句挨着执行,然后执行延时函数,然后才是LED1的两句,因为没有硬件板子,所以只能看到仿真效果 回复

  • 是否编译时开了优化,可能会有一些影响。

    严格按照程序逻辑,而不开优化的化,这个是否同步不好检测(因为即使不同步也不会累积误差)

    • 发布于2018-06-04
    • 举报
    • 评论 1
    • 0
    • 0
f50a3df8d4104c44 回复了 xdsnet :keil里面的优化等级level0,不知道有么有影响 回复

  • 第一种写法,分别执行两次GPIO函数,有先后顺序,两个灯依次地被点亮。

    如果程序里对这两句GPIO函数设置断点的话,就能看到两个灯是先后的。

      

    第二种写法,先经历一次|位或运算,然后输入到GPIO函数中,GPIO函数只执行一次,一次点两个灯。

    • 发布于2018-06-04
    • 举报
    • 评论 1
    • 0
    • 0
f50a3df8d4104c44 回复了 xukejing :所以无论是mini的板子还是r6的都是依次点亮的,只是人眼看到的效果只同步而已,对么?那这样的话在仿真里面要实现同步的效果就只能用同一组IO来点亮LED了,不同IO组的话貌似不同步的现象就会一直有 回复

  • 第一种写法:先点一个灯,再点第二个灯。

    第二种写法:寄存器一次操作两个位,两个灯同时亮灭。

    我认为proteus出现不同步的问题是软件仿真优化的问题,运行到这个地方时显示没跟上,所以看起来是先后顺序。实际上点灯的过程也是不同步的,只是人眼看起来一起亮灭罢了。

    • 发布于2018-06-04
    • 举报
    • 评论 1
    • 0
    • 0
f50a3df8d4104c44 回复了 a2ece75e7f11ad3c :是proteus的优化么,我没设置过啊,在哪设置啊,keil里面的优化等级是level0,不知道有没有影响 回复

  • stm32的位带操作必须先宏定义才可以,两者的执行效果应该是一样的
    • 发布于2018-06-04
    • 举报
    • 评论 1
    • 0
    • 0
f50a3df8d4104c44 回复了 huihui163 :头文件里面有宏定义的,工程里面也定义了宏定义 回复

  • 在我点亮LED的时候没有遇到你说的现象,我没有使用过仿真软件,在我学习的单片机的时候,我的老师就对我说,想要学好单片机,就不需要使用仿真软件,那个毕竟是仿真的,不是真正的,最好就是直接使用单片机。

    我的老师说仿真软件不是万能的,有时候会犯傻,让你不知道程序到底错在哪里

    • 发布于2018-06-04
    • 举报
    • 评论 1
    • 0
    • 0
f50a3df8d4104c44 回复了 xuexinkun :真希望我的老师也能看到这句话,哈哈哈 回复

  • 感觉是这个仿真软件的问题。

    无论是哪种写法,在板子上的效果都是一样的,也是正确的。只是仿真时不对,那么就应该是仿真软件的问题了

    • 发布于2018-06-04
    • 举报
    • 评论 1
    • 0
    • 0
f50a3df8d4104c44 回复了 一笔之名也 :上面的大神也都是说的是软件的问题,不过你知道怎么设置或者有什么方法么 回复

  • 应该是软件仿真问题,仿真时看看左下角的运行时间,应该是uS级别的,并不是S
    • 发布于2018-06-04
    • 举报
    • 评论 2
    • 0
    • 0
f50a3df8d4104c44 回复了 代人凌峰 :这个具体的没有注意,印象中小数点后面还有好几位的,那这个可以设置的么 回复
代人凌峰 回复了 代人凌峰 :这个取决于电脑的运算能力,应该不能改 回复

  • 越来越喜欢云汉社区了,好多大神过来帮忙回复,也学到了很多东西,谢谢你们的回复~~

    • 发布于2018-06-05
    • 举报
    • 评论 0
    • 0
    • 0

  • 数上也有人提到过了,是软件的运行时间的步长要设置成1S吧,而不是us或是ms级的
    • 发布于2018-06-05
    • 举报
    • 评论 0
    • 0
    • 0

  • 数上也有人提到过了,是软件的运行时间的步长要设置成1S吧,而不是us或是ms级的
    • 发布于2018-06-05
    • 举报
    • 评论 0
    • 0
    • 0

  • 出现这样子的问题,其实主要核心原因就是一个程序运行的时间问题!因为当你把程序下载到你的开发板上后,单片机就开始全速运行了,结果你程序中的时间间隔太短,难以人眼分辨出变化,当你用软件仿真的时候,由于仿真软件的仿真效果跟电脑的配置有直接的关系!所以有这样类似的问题存在!
    • 发布于2018-06-05
    • 举报
    • 评论 0
    • 0
    • 0

  • 不要太相信模拟仿真,还是要看实际的运行情况,出现两者不一,一定是仿真的问题,个人猜测,仿真是解释类型的,在查询时会花费一定时间,就会出现不同步现象。而且proteus的STM32仿真是刚支持不久的,肯定不完善。
    • 发布于2018-06-05
    • 举报
    • 评论 0
    • 0
    • 0

  • 修改一下你的延时时间,把时间拉长一点,时间太短很难看出问题,还有建议不要用软件仿真
    • 发布于2018-06-05
    • 举报
    • 评论 0
    • 0
    • 0

  • 检查你的IO配置是否正常,然后检查一下系统时钟是否存在异常
    • 发布于2018-06-06
    • 举报
    • 评论 0
    • 0
    • 0

  • 要看你的程序具体怎么实现的,这种点灯的有时存在多重调用,执行效率也很低的
    • 发布于2018-06-08
    • 举报
    • 评论 0
    • 0
    • 0

  • 仿真的结果不一定可信,最好自己拿板子来做做,能成功就没有问题。

    • 发布于2018-06-30
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

对mini板的LED点亮程序移植的一些疑问