微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > SPMC75和ASM(汇编)混合编程的应用

SPMC75和ASM(汇编)混合编程的应用

时间:10-21 来源:互联网 点击:
1引言
  支持C语言几乎是所有微控制器程序设计的一项基本要求,当然SPMC75系列单片机也不例外。μ'nSPTM 指令结构的设计就着重考虑对C语言的支持,GCC就是一种针对μ'nSPTM 操作平台的ANSI-C编译器。但是在应用中对于程序的设计,特别是C和ASM混合使用的时候有些地方是需要注意的,在C中如何嵌入ASM也是一个不可回避的问题。

2芯片特性简介
  SPMC75系列单片机是由凌阳科技设计开发的16位微控制器芯片,其内核采用凌阳科技自主知识产权的μ'nSP微处理器。SPMC75系列单片机集成了能产生变频电机驱动的PWM发生器、多功能捕获比较模块、BLDC电机驱动专用位置侦测接口、两相增量编码器接口等硬件模块;以及多功能I/O口、同步和异步串行口、ADC、定时计数器等功能模块,利用这些硬件模块支持,SPMC75可以完成诸如家电用变频驱动器、标准工业变频驱动器、多环伺服驱动系统等复杂应用。下面介绍SPMC75系列单片机资源特性:

■ 高性能的 16 位 CPU 内核
- 凌阳 16 位 u'nSP 处理器
- 2 种低功耗模式: Wait/Standby
- 片内低电压检测电路
- 片内基于锁相环的时钟发生模块
- 最高系统频率 Fck : 24MHz
■ 片内存储器
- 32KW (32K × 16bit) Flash
- 2KW (2K × 16bit) SRAM
■ 工作温度: -40 ℃~ 85 ℃
■ 10 位 ADC 模块
- 可编程的转换速率,最大转换速率 100Ksps
- 6 ~~ 8 个通道
- 可与 PDC 或 MCP 等定时器联动,实现电机控制中的电参量测量
■ 串行通 讯 接口
- 通用异步串行通讯接口 (UART)
- 标准外围接口 (SPI)
■ 可编程看门狗定时器
■ 内嵌在线仿真电路 ICE 接口:可实现在线仿真、调试和下载
■ 两个 CMT 定时器
- 通用 16 位定时 / 计数器

■ MCP 定时器
- 能产生三相六路可编程的 PWM 波形,如三相 SPWM 、 SVPWM 等
- 提供 PWM 占空比值同步载入逻辑
- 可选择与 PDC 的位置侦测变化同步
- 可编程硬件死区插入功能,死区时间可设定
- 可编程的错误和过载保护逻辑
- 16 位定时 / 计数器功能
■ PDC 定时器
- 可同时处理三路捕获输入
- 可产生三路 PWM 输出(中心对称或边沿方式)
- BLDC 驱动的专用位置侦测接口
- 两相增量码盘接口,支持四种工作模式,拥有四倍频电路
- 16 位定时 / 计数器功能
■ TPM 定时器
- 可同时处理二路捕获输入
- 可产生二路 PWM 输出(中心对称或边沿方式)
- 16 位定时 / 计数器功能
■ 封装
- QFP 和 SDIP 两种封装,
- 42 ~~ 80 脚系列

3函数调用
3.1 调用协议

  模块代码间的调用,是遵循μ'nSPTM体系的调用协议(Calling Convention)。所谓调用协议,是指用于标准子程序之间一个模块与令一个模块的通信约定。即使两个模块是以不同的语言编写而成。
  调用协议是指这样一套法则:它使不同的子程序之间形成一种握手通信接口,并完成一个子程序到另一个子程序之间的参数传递和控制,以及定义出子程序调用与子程序返回值的常规规则。
调用协议包括以下相关要素:
(1)调用子程序间的参数传递;
(2)子程序返回值;
(3)调用子程序过程中所用堆栈;
(4)用于暂存数据的中间寄存器。
μ'nSPTM调用协议的内容如下:
1、由于C编译器产生的所有标号都以下划线(_)为前缀,而C程序在调用汇编程序时要求汇编程序名也以下划线(_)为前缀。
2、参数以相反的顺序(从右到左)被压入堆栈中。必要时所有的参数都被转换成其在函数原型中被声明过的数据类型。但如果函数的调用发生在其声明之前,则传递在调用函数里的参数不会进行任何数据类型转换的。
3、各参数和局部变量在堆栈中的排列如图3-1所示。
4、16-Bit的返回值放在寄存器R1中,32-Bit的返回值存入寄存器R1和R2中,其中低字节在R1中,高字节在R2中。若要返回结构或指针需要在R1中存放一个指向结构的指针。
5、编译器会产生prolog/epilog过程动作来暂存或恢复PC、SR及BP寄存器。汇编器则通过CALL指令可将PC和SR自动压入堆栈中,而通过RETF或RETI指令将其自动弹出堆栈。
6、编译器所认可的指针是16-Bit的。函数指针实际上并非指向函数的入口地址,而是一个段地址的向量_function_entry,在该向量的两个连续Word的数据单元存放的值才是函数的入口地址。

图3-1 程序调用的堆栈使用

3.2 举例说明
◆C程序中调用ASM函数
无参数传递的C语言调用ASM函数。

/*-------------------------------------------------------*/

/* C 程序

/*-------------------------------------------------------*/

extern void F_Function(void);

main()

{

/*-------------------------------------------------------*/

/* C

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top