[学习笔记] 在C语言中嵌入汇编编程

[复制链接]
1067|1
 楼主| AutochipsMCU 发表于 2020-8-27 09:59 | 显示全部楼层 |阅读模式
汇编,目前对大多数程序员来说应该都很陌生。特别是像我们这种新生代程序员(脸皮并不厚)。
但其实在实际应用中,需要把产品或方案做到极致,还是很有可能用到的。比如电机控制的算法。
这里有个前提是:汇编编程水平要比编译器高
C语言中如何嵌入汇编,下面例程,供参考。
开发环境:
AC7801(M0+内核) 通用demo板
实现功能:
通过汇编初始化PC9,控制PC9输出高低电平来控制板上LED灯。
具体实现:
main.c
  1. int main(void)
  2. {
  3.     InitDebug();//初始化Debug uart口
  4.     InitDelay();//初始化systick时钟
  5.     printf("\nRunning AsmInC sample code.\r\n");
  6.     mdelay(3000);//延时3S
  7.     LED_Init();/汇编实现,LED IO口配置
  8.     while (1)
  9.     {
  10.         LED_Ctrl(0);//汇编实现,LED IO输出高电平
  11.         mdelay(500);//延时500ms
  12.         LED_Ctrl(1);//汇编实现,LED IO输出低电平
  13.         mdelay(500);//延时500ms
  14.    
  15.     }
  16. }
Led.s
  1. ;/*************************************************************************
  2. ;File:      Led.s
  3. ;Function:  LED初始化,LED控制 --> 控制PC9输出高低电平
  4. ;***************************************************************************/
  5. ;/*------------------------------------------------------------------------*/
  6.     AREA    LIGHT_LED,CODE,READONLY
  7. ;Register


  8. CKGEN_PERI_CLK_EN_0     EQU      0X40000004
  9. GPIOC_CR                EQU      0x40001060
  10. GPIOC_ODR               EQU      0x40001068
  11. ;
  12. BIT23_EN               EQU      0x00800000
  13. BIT09_EN               EQU      0x00000200
  14. BIT06_EN               EQU      0x00000040
  15.    
  16.     EXPORT LED_Init;
  17.     EXPORT LED_Ctrl;
  18. LED_Init   PROC;定义子函数
  19. ;打开GPIO输入时钟使能
  20.     LDR     R0,=CKGEN_PERI_CLK_EN_0;CKGEN_PERI_CLK_EN_0
  21.     LDR     R1,[R0];CKGEN_PERI_CLK_EN_0-->R1
  22.     LDR     R2,=BIT23_EN;BIT23=1,CKGEN_PERI_CLK_EN_0[GPIO_EN] = 1
  23.     ORRS    R1,R1,R2;R1|R2-->R1
  24.     STR     R1,[R0];R1-->CKGEN_PERI_CLK_EN_0
  25. ;设置GPIO PC9寄存器
  26. ;端口配置寄存器GPIO_CR 0x40001060 GPIO_CR[9] = 1;输出
  27.     LDR     R0,=GPIOC_CR;GPIO_CR
  28.     LDR     R1,[R0];GPIO_CR-->R1
  29.     LDR     R2,=BIT09_EN;BIT9=1,GPIO_CR[BIT9] = 1
  30.     ORRS    R1,R1,R2;R1|R2-->R1
  31.     STR     R1,[R0];R1-->GPIO_CR
  32. ;端口输出数据寄存器GPIO_ODR 0x40001068 GPIO_ODR[9] =1;输出高
  33.     LDR     R0,=GPIOC_ODR;GPIO_ODR
  34.     LDR     R1,[R0];GPIO_ODR-->R1
  35.     LDR     R2,=BIT09_EN;=0x00000200;BIT9=1,GPIO_ODR[BIT9] = 1
  36.     ORRS    R1,R1,R2;R1|R2-->R1
  37.     STR     R1,[R0];R1-->GPIO_ODR
  38.     BX      LR;return
  39.     ALIGN
  40.     ENDP;结束子函数
  41. LED_Ctrl   PROC;定义子函数
  42. ;端口输出数据寄存器GPIO_ODR 0x40001068 GPIO_ODR[9] =1;输出高
  43.     LDR     R1,=GPIOC_ODR;GPIO_ODR
  44.     LDR     R2,[R1];GPIO_ODR-->R2
  45.     ;(((reg) & (~((uint32_t)mask))) | (((uint32_t)value) << pos))
  46.     LDR     R4,=0xFFFFFDFF;BIT9位为0,其余取反
  47.     LSLS    R0,#9;bit9 mask
  48.     ANDS     R2,R2,R4;R2&R4-->R2
  49.     ORRS    R2,R2,R0;R2|R0-->R2
  50.     STR     R2,[R1];R2-->GPIO_ODR
  51.     BX      LR;return
  52.     ALIGN
  53.     ENDP;结束子函数        

  54.     END


划重点:
1.C语言中嵌入汇编如何调用?
2.函数的形参如何传递的,LED_Ctrl的形参给谁了?
3.汇编的宏定义如何定义?
4.如何定义汇编子函数?

AsmInC.rar (15.96 KB, 下载次数: 15)
xinghe280 发表于 2020-9-3 11:13 | 显示全部楼层
感谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

59

主题

268

帖子

11

粉丝
快速回复 在线客服 返回列表 返回顶部