我配置了一个以80MHz时钟速率运行的PIC32。作为测试,我试图用
切换DIO引脚while(1) {
LATFbits.LATF4 = !LATFbits.LATF4;
}
根据范围,它只在625kHz切换DIO。看着被拆解的列表
9D000118 8C446160 LW A0, 24928(V0)
9D00011C 30840010 ANDI A0, A0, 16
9D000120 2C840001 SLTIU A0, A0, 1
9D000124 8C436160 LW V1, 24928(V0)
9D000128 7C832104 INS V1, A0, 4, 1
9D00012C AC436160 SW V1, 24928(V0)
9D000130 0B400046 J 0x9D000118
这并不是很多指示。为什么这么慢?
==============
最终获得20MHz(4条指令)和汇编
#include<p32xxx.h>
.text
.set noreorder
.set nomacro
.global toggle
.ent toggle
toggle:
# void toggle(int mask)
# $a0 - mask
# performs toggles in an infinite loop (never returns)
# la $t0, 0xbf886160 # LATF base address 04:clear 08:set 12:inv
la $t0,LATF
loop:
sw $a0, 4($t0) # write mask to clear
sw $a0, 8($t0) # write mask to set
j loop
nop
.end toggle
答案 0 :(得分:1)
您是否尝试使用INV寄存器切换PORT?
除TRIS,PORT和LAT基址寄存器外,每个端口
模块与提供
的SET,CLR和INV寄存器相关联 原子位操作并允许更快的I / O引脚操作。
答案 1 :(得分:0)
这些想法呈现不对称波形,但会增加每秒的转换次数。
当我需要一阵高速采样时,我采用了类似的方法 - 当然是阅读而不是写作。
除了已经提到的其他想法:
while(1) {
LATFbits.LATF4 = 0;
LATFbits.LATF4 = 1;
}
您还可以减少循环的开销
while(1) {
LATFbits.LATF4 = 0;
LATFbits.LATF4 = 1;
LATFbits.LATF4 = 0;
LATFbits.LATF4 = 1;
LATFbits.LATF4 = 0;
LATFbits.LATF4 = 1;
...
LATFbits.LATF4 = 0;
LATFbits.LATF4 = 1;
}
使用PIC24,我可以在许多DIO引脚上配置定时器输出,并让硬件产生信号。我怀疑PIC32可以做到同样的事情。
答案 2 :(得分:0)
(ds)PIC的C30编译器有 _builtin_btg ()在F设备和2个-E设备上的一条指令中进行一点切换。看看PIC32是否也有它。可能它只会让你到达那里,因为像E系列一样,afaik PIC32不一定是1个周期/ I / O指令。
如果模块的外围时钟高于CPU可以切换的内容(例如由于延迟等待时间),那么使用输出比较等模块也可以达到更高的速度