我想通过其I2S外设从STM32(Cortex M4)设备发送数据,使用24位模式的DMA,MSB优先。 然而,I2S数据寄存器只有16位,根据数据表,您必须首先发送上半字,然后是下半字。 这在使用DMA时会出现问题,它将始终首先发送下半字。
c或ARM汇编程序切换两个半字的有效方法是什么?
答案 0 :(得分:8)
写出常用的习语
unsigned w;
w = w << 16 | w >> 16;
优化编译器通常将其转换为单个ror
或rev16
指令。期望编译器进行此优化是合理的。确保w
是无符号的,因此右移是无符号的。
如果编译器没有优化它,它仍然只是两个指令(一个移位和一个或一个移位的操作数),因此不会丢失太多的性能。