关于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);
最后感谢各位大神过来看看,帮忙解答,嘿嘿~~
2.也是不同步,执行一条指令的速率太快,可以近似同步,
3.STM32不支持位带操作,你这样宏定义的位置在其他地方,所以仿真的时候会跳到宏定义的地方去执行,寄存器操作指令,就看起来乱跳。
是否编译时开了优化,可能会有一些影响。
严格按照程序逻辑,而不开优化的化,这个是否同步不好检测(因为即使不同步也不会累积误差)
第一种写法,分别执行两次GPIO函数,有先后顺序,两个灯依次地被点亮。
如果程序里对这两句GPIO函数设置断点的话,就能看到两个灯是先后的。
第二种写法,先经历一次|位或运算,然后输入到GPIO函数中,GPIO函数只执行一次,一次点两个灯。
第一种写法:先点一个灯,再点第二个灯。
第二种写法:寄存器一次操作两个位,两个灯同时亮灭。
我认为proteus出现不同步的问题是软件仿真优化的问题,运行到这个地方时显示没跟上,所以看起来是先后顺序。实际上点灯的过程也是不同步的,只是人眼看起来一起亮灭罢了。
在我点亮LED的时候没有遇到你说的现象,我没有使用过仿真软件,在我学习的单片机的时候,我的老师就对我说,想要学好单片机,就不需要使用仿真软件,那个毕竟是仿真的,不是真正的,最好就是直接使用单片机。
我的老师说仿真软件不是万能的,有时候会犯傻,让你不知道程序到底错在哪里
感觉是这个仿真软件的问题。
无论是哪种写法,在板子上的效果都是一样的,也是正确的。只是仿真时不对,那么就应该是仿真软件的问题了
越来越喜欢云汉社区了,好多大神过来帮忙回复,也学到了很多东西,谢谢你们的回复~~