分享

嵌入式编程进阶:单片机嵌入汇编不是为了卖弄技术,而是对单片机深刻的理解

 西北望msm66g9f 2024-11-19
01

       在STM32微控制器上使用嵌入式汇编语言可以实现对硬件的更直接控制,提高程序执行效率。在C语言中嵌入汇编代码,通常使用__asm或者asm关键字,对于GCC编译器,使用asm。

02
基本汇编指令

1、数据传输指令

 LDR(Load Register):从内存加载数据到寄存器。

LDR RO,[R1,#4] ; 将R1+4地址处的数据加载到R0

STR(Store Register):将寄存器中的数据存储到内存。

STR R0, [R1,#4] ; 将R0中的数据存储到R1+4地址处

MOV(Move):将一个值移动到另一个寄存器。

MOV R0, #1 ; 将立即数1移动到R0
MOV R1, R0 ; 将R0的值移动到R1

2、算术和逻辑指令

 ADD(Add):加法操作。

ADD RO, R1, R2 ; R0 = R1 + R2
ADD RO, R1, #1 ; R0 = R1 + 1

SUB(Subtract):减法操作

SUB RO, R1, R2 ; R0 = R1 - R2
SUB RO, R1, #1 ; R0 = R1 - 1

AND(Bitwise AND):按位与操作

AND R0, R1, R2 ; R0 = R1 & R2

ORR(Bitwise OR):按位或操作

ORR R0, R1, R2 ; R0 = R1 | R2

EOR(Bitwise XOR):按位异或操作

EOR R0, R1, R2 ; R0 = R1 ^ R2

3. 控制转移指令

 B(Branch):无条件跳转。

B label ; 跳转到label标签

BEQ(Branch if Equal):如果相等则跳转

CMP RO, R1 ; 比较 R0 和 R1
BEQ label ; 如果 R0 == R1 ,跳转到label标签

BNE(Branch if Not Equal):如果不相等则跳转

CMP RO, R1 ; 比较 R0 和 R1
BNE label  ; 如果 R0 != R1 ,跳转到label标签

BL(Branch with Link):带链接的跳转,用于调用子程序

BL subRoutine ; 跳转到subroutine,并将返回地址保存在LR寄存器中
03
常用的嵌入式汇编示例

1、延时函数

void delay(uint32_t count) {
   asm volatile (
       '1: subs %0, #1 \n'  // 减1操作
       'bne 1b \n'          // 如果不为0,则跳转到标签1
       : '=r'(count)        // 输出操作数
       : '0'(count)         // 输入操作数
       : 'cc'               // 修改的寄存器
);
}

2、控制GPIO引脚

#include 'stm32f1xx.h'

#define GPIO_PORT GPIOA
#define GPIO_PIN GPIO_PIN_5

void set_gpio_high(void) {

   asm volatile (
       'ldr r0, =%0 \n'     // 加载GPIO端口地址到r0
       'ldr r1, [r0, #0x14] \n' // 读取BSRR寄存器地址
       'orr r1, r1, #0x20 \n' // 设置第5位(对应GPIO_PIN_5)
       'str r1, [r0, #0x14] \n' // 写回BSRR寄存器

       :

       : 'i'(GPIO_PORT)
       : 'r0', 'r1'
   );
}


void set_gpio_low(void) {
   asm volatile (
       'ldr r0, =%0 \n'     // 加载GPIO端口地址到r0
       'ldr r1, [r0, #0x14] \n' // 读取BSRR寄存器地址
       'orr r1, r1, #0x2000 \n' // 清除第5位(对应GPIO_PIN_5)
       'str r1, [r0, #0x14] \n' // 写回BSRR寄存器

       :

       : 'i'(GPIO_PORT)
       : 'r0', 'r1'
   );
}
04
注意事项

寄存器管理:确保正确管理寄存器,避免覆盖重要数据。

副作用声明:使用volatile关键字确保编译器不会优化掉汇编代码。

输入输出操作数:明确指定输入和输出操作数,以及它们如何与C变量交互。

修改的寄存器:通过'cc'等说明哪些寄存器被修改,帮助编译器更好地进行寄存器分配。

05

       通过以上常用汇编指令和示例,可以在STM32项目中有效地使用嵌入式汇编语言,实现对硬件的精细控制和性能优化。









    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多