pic32切换DIO的最快方法

时间:2013-06-06 14:22:31

标签: pic microchip

我配置了一个以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

3 个答案:

答案 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可以切换的内容(例如由于延迟等待时间),那么使用输出比较等模块也可以达到更高的速度