汇编,目前对大多数程序员来说应该都很陌生。特别是像我们这种新生代程序员(脸皮并不厚)。
但其实在实际应用中,需要把产品或方案做到极致,还是很有可能用到的。比如电机控制的算法。
这里有个前提是:汇编编程水平要比编译器高。
C语言中如何嵌入汇编,下面例程,供参考。
开发环境:
AC7801(M0+内核) 通用demo板
实现功能:
通过汇编初始化PC9,控制PC9输出高低电平来控制板上LED灯。
具体实现:
main.c
int main(void)
{
InitDebug();//初始化Debug uart口
InitDelay();//初始化systick时钟
printf("\nRunning AsmInC sample code.\r\n");
mdelay(3000);//延时3S
LED_Init();/汇编实现,LED IO口配置
while (1)
{
LED_Ctrl(0);//汇编实现,LED IO输出高电平
mdelay(500);//延时500ms
LED_Ctrl(1);//汇编实现,LED IO输出低电平
mdelay(500);//延时500ms
}
}
Led.s
;/*************************************************************************
;File: Led.s
;Function: LED初始化,LED控制 --> 控制PC9输出高低电平
;***************************************************************************/
;/*------------------------------------------------------------------------*/
AREA LIGHT_LED,CODE,READONLY
;Register
CKGEN_PERI_CLK_EN_0 EQU 0X40000004
GPIOC_CR EQU 0x40001060
GPIOC_ODR EQU 0x40001068
;
BIT23_EN EQU 0x00800000
BIT09_EN EQU 0x00000200
BIT06_EN EQU 0x00000040
EXPORT LED_Init;
EXPORT LED_Ctrl;
LED_Init PROC;定义子函数
;打开GPIO输入时钟使能
LDR R0,=CKGEN_PERI_CLK_EN_0;CKGEN_PERI_CLK_EN_0
LDR R1,[R0];CKGEN_PERI_CLK_EN_0-->R1
LDR R2,=BIT23_EN;BIT23=1,CKGEN_PERI_CLK_EN_0[GPIO_EN] = 1
ORRS R1,R1,R2;R1|R2-->R1
STR R1,[R0];R1-->CKGEN_PERI_CLK_EN_0
;设置GPIO PC9寄存器
;端口配置寄存器GPIO_CR 0x40001060 GPIO_CR[9] = 1;输出
LDR R0,=GPIOC_CR;GPIO_CR
LDR R1,[R0];GPIO_CR-->R1
LDR R2,=BIT09_EN;BIT9=1,GPIO_CR[BIT9] = 1
ORRS R1,R1,R2;R1|R2-->R1
STR R1,[R0];R1-->GPIO_CR
;端口输出数据寄存器GPIO_ODR 0x40001068 GPIO_ODR[9] =1;输出高
LDR R0,=GPIOC_ODR;GPIO_ODR
LDR R1,[R0];GPIO_ODR-->R1
LDR R2,=BIT09_EN;=0x00000200;BIT9=1,GPIO_ODR[BIT9] = 1
ORRS R1,R1,R2;R1|R2-->R1
STR R1,[R0];R1-->GPIO_ODR
BX LR;return
ALIGN
ENDP;结束子函数
LED_Ctrl PROC;定义子函数
;端口输出数据寄存器GPIO_ODR 0x40001068 GPIO_ODR[9] =1;输出高
LDR R1,=GPIOC_ODR;GPIO_ODR
LDR R2,[R1];GPIO_ODR-->R2
;(((reg) & (~((uint32_t)mask))) | (((uint32_t)value) << pos))
LDR R4,=0xFFFFFDFF;BIT9位为0,其余取反
LSLS R0,#9;bit9 mask
ANDS R2,R2,R4;R2&R4-->R2
ORRS R2,R2,R0;R2|R0-->R2
STR R2,[R1];R2-->GPIO_ODR
BX LR;return
ALIGN
ENDP;结束子函数
END
划重点:
1.C语言中嵌入汇编如何调用?
2.函数的形参如何传递的,LED_Ctrl的形参给谁了?
3.汇编的宏定义如何定义?
4.如何定义汇编子函数?
AsmInC.rar
(15.96 KB)
|