stm单片机io管脚翻转实验
以下为汇编程序
org 0000h
ajmpmain
org0080h
main:
loop: mov p1,#0ffh;全不亮
mov P1,#000h
jmp loop
end
ajmpmain
org0080h
main:
loop: mov p1,#0ffh;全不亮
mov P1,#000h
jmp loop
end
后来我又将c语言改成
void main()
{
P1=0xff;
while(1)
{
P1=0xff;
P1=0;
}
}
编译后运行,结果和汇编编写的一样了,
这说明,循环程序执行到最后一句话以后会重新跳回第一句话,这个jmp loop也占一条语句的时间,所以才有了以上的两种结果
上图是我又把程序变为
void main()
{
P1=0xff;
while(1)
{
P1=0xff;
P1=0;
P1=0xff;
P1=0;
P1=0xff;
P1=0;//。。。。。。。
//好多个p1=0,p1=0xff
}
}
这个时候,频率变成了333.3kHZ了,说明这已经是最快的速度了,但问题是,占空比还是33.3%,不解中。理论上来说,应该是50%的占空比才对,也许是芯片内部,下降保持的速度大于上升时保持的速度吧。
于是我又将程序改为
void main()
{
P1=0xff;
while(1)
{
P1=~P1;
P1=~P1;
P1=~P1;//。。。。。。。
//好多个P1=~P1;
}
}
这回又有变化了,以下是截图
这回效果已经非常不错了,达到250K,而且占空比在50%,但计算一下可得知,12M的12分频为1M,也就是说,他的io翻转速度应该在500Kh左右阿,也许是时钟的问题,不解中。
从以上效果图来看,还可以得出一个结论,就是好像取反要比改变管脚状态来得快。
这是LED与电阻中间的波形,还挺好看,但原因还不知道,先不分析,以后解决。
下面是STM32F103VE的管脚
这个是72M的可比那快多了
从上面的波形猜测,频率接近18Mhz,是不是因为管脚速度太快,由于管脚的分布电容电阻引起的波形变化。
已经快接近正弦波了。
经过验证:芯片的IO翻转速度低于芯片频率的一半,其原因可能是因为编译器翻译出的语句问题。
评论