打印
[学习笔记]

在C语言中嵌入汇编编程

[复制链接]
850|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
AutochipsMCU|  楼主 | 2020-8-27 09:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
汇编,目前对大多数程序员来说应该都很陌生。特别是像我们这种新生代程序员(脸皮并不厚)。
但其实在实际应用中,需要把产品或方案做到极致,还是很有可能用到的。比如电机控制的算法。
这里有个前提是:汇编编程水平要比编译器高
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)

使用特权

评论回复

相关帖子

沙发
xinghe280| | 2020-9-3 11:13 | 只看该作者
感谢分享

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:合肥杰发科技有限公司
简介:四维图新全资子公司 全球多地布局;专注于汽车电子芯片及相关系统的研发与设计 车规级芯片覆盖整车;客户遍及海内外 全球超过8000万辆车搭载杰发科技芯片。

59

主题

268

帖子

11

粉丝