MICROCHIP dsPIC Technical data

dsPIC
®
语言工具库
2005 Microchip Technology Inc. DS51456B_CN
请注意以下有关 Microchip 器件代码保护功能的要点:
Microchip 的产品均达到 Microchip 数据手册中所述的技术指标。
Microchip 确信:在正常使用的情况下, Microchip 系列产品是当今市场上同类产品中最安全的产品之一。
目前,仍存在着恶意、甚至是非法破坏代码保护功能的行为。就我们所知,所有这些行为都不是以 Microchip 数据手册中规定的 操作规范来使用 Microchip 产品的。这样做的人极可能侵犯了知识产权。
Microchip 愿与那些注重代码完整性的客户合作。
Microchip 或任何其他半导体厂商均无法保证其代码的安全性。代码保护并不意味着我们保证产品是 “牢不可破”的。
代码保护功能处于持续发展中。 Microchip 承诺将不断改进产品的代码保护功能。任何试图破坏 Microchip 代码保护功能的行为均可视 为违反了 《数字器件千年版权法案 (Digital Millennium Copyright Act)》。如果这种行为导致他人在未经授权的情况下,能访问您的 软件或其他受版权保护的成果,您有权依据该法案提起诉讼,从而制止这种行为。
提供本文档的中文版本仅为了便于理解。Microchip Technology Inc. 及其分公司和相关公司、各级主管与员工及 事务代理机构对译文中可能存在的任何差错不承担任何责任。
本出版物中所述的器件应用信息及其他类似内容仅为您提供便 利,它们可能由更新之信息所替代。确保应用符合技术规范, 是您自身应负的责任。Microchip 对这些信息不作任何明示或 暗示、书面或口头、法定或其他形式的声明或担保,包括但不 限于针对其使用情况、质量、性能、适销性或特定用途的适用 性的声明或担保。 Microchip 对因这些信息及使用这些信息而 引起的后果不承担任何责任。未经 Microchip 书面批准,不得 将 Microchip 的产品用作生命维持系统中的关键组件。在 Microchip 知识产权保护下,不得暗中或以其他方式转让任何 许可证。
商标
Microchip 的名称和徽标组合、 Microchip 徽标、 Accuron dsPIC、 K
EELOQ、 microID、 MPLAB、 PIC、 PICmicro、
PICSTARTPRO MATEPowerSmart、 rfPIC 和 SmartShunt 均为 Microchip Technology Inc. 在美国和其他国
家或地区的注册商标。
AmpLabFilterLabMigratable MemoryMXDEV MXLABPICMASTERSEEVALSmartSensor The Embedded Control Solutions Company 均为 Microchip Technology Inc. 在美国的注册商标。
Analog-for-the-Digital AgeApplication Maestro dsPICDEMdsPICDEM.netdsPICworksECAN ECONOMONITORFanSenseFlexROMfuzzyLAB In-Circuit Serial Programming、 ICSP、 ICEPIC、 Linear
Active Thermistor、 MPASM、 MPLIB、 MPLINK、 MPSIM、 PICkitPICDEMPICDEM.netPICLABPICtail
PowerCalPowerInfoPowerMatePowerToolrfLAB rfPICDEMSelect ModeSmart SerialSmartTelTot a l
Endurance WiperLock 均为 Microchip Technology Inc.在
美国和其他国家或地区的商标。 SQTP Microchip Technology Inc. 在美国的服务标记。
在此提及的所有其他商标均为各持有公司所有。 © 2005, Microchip Technology Inc.版权所有。
Microchip
10
位单片机、 性存储器和模拟产品方面的质量体系流程均符合
16949:2002
系也已通过了
位于美国亚利桑那州
Mountain View
月通过了
ISO/TS-16949:2002
KEELOQ
。此外,
ISO 9001:2000
的全球总部、设计中心和晶圆生产厂均于
®
跳码器件、串行
Microchip
Chandler和Tem p e
质量体系认证。公司在
EEPROM
在开发系统的设计和生产方面的质量体
认证。
及位于加利福尼亚
、单片机 外设、非易失
ISO/TS-
2003
PICmicro
®
DS51456B_CN ii 2005 Microchip Technology Inc.
8
dsPIC®语言工具库
目录
前言 ................................................................................................................................. 1
1 章 库的概述
1.1 引言 ................................................................................................................ 7
1.2 特定于 OMF 的库 / 启动模块 .......................................................................... 7
1.3 启动代码 ......................................................................................................... 8
1.4 DSP 函数库 .................................................................................................... 8
1.5 dsPIC 外设函数库 ........................................................................................... 8
1.6 标准 C 语言库 (包含数学函数) .................................................................... 8
1.7 MPLAB C30 内建函数 .................................................................................... 8
2 DSP 函数库
2.1 简介 ................................................................................................................ 9
2.2 DSP 函数库的使用 ....................................................................................... 10
2.3 矢量函数 ....................................................................................................... 13
2.4 窗函数 ........................................................................................................... 26
2.5 矩阵函数 ....................................................................................................... 31
2.6 滤波函数 ....................................................................................................... 38
2.7 变换函数 ....................................................................................................... 58
3 dsPIC 外设函数库
3.1 简介 .............................................................................................................. 73
3.2 使用 dsPIC 外设函数库 ................................................................................. 74
3.3 外部 LCD 函数 .............................................................................................. 74
3.4 CAN 函数 ...................................................................................................... 81
3.5 ADC12 函数 .................................................................................................. 95
3.6 ADC10 函数 ................................................................................................ 102
3.7 定时器函数 ................................................................................................. 109
3.8 复位 / 控制函数 ........................................................................................... 117
3.9 I/O 端口函数 ............................................................................................... 120
3.10 输入捕捉函数 ............................................................................................ 125
3.11 输出比较函数 ............................................................................................ 131
3.12 UART 函数 ................................................................................................ 141
3.13 DCI 函数 ................................................................................................... 150
3.14 SPI 函数 .................................................................................................... 158
3.15 QEI 函数 ................................................................................................... 166
3.16 PWM 函数 ................................................................................................. 171
3.17 I2C 函数 .................................................................................................... 183
2005 Microchip Technology Inc. DS51456B_CN 第 iii
dsPIC® 语言工具库
4 章 标准 C 函数库和数学函数
4.1 简介 ............................................................................................................ 193
4.2 使用标准 C 函数库 ...................................................................................... 194
4.3 <assert.h> 诊断 .......................................................................................... 195
4.4 <ctype.h> 字符处理 .................................................................................... 196
4.5 <errno.h> 错误 ............................................................................................ 205
4.6 <float.h> 浮点特征 ...................................................................................... 206
4.7 <limits.h> 实现定义的限制 ( implementation-defined limits) ..................... 211
4.8 <locale.h> 语言环境 ................................................................................... 213
4.9 <setjmp.h> 与语言环境无关的跳转 ............................................................. 214
4.10 <signal.h> 信号处理 ................................................................................. 215
4.11 <stdarg.h> 可变参数列表 .......................................................................... 221
4.12 <stddef.h> 公共定义 ................................................................................. 223
4.13 <stdio.h> 输入和输出 ................................................................................ 225
4.14 <stdlib.h> 实用函数 .................................................................................. 270
4.15 <string.h> 字符串函数 .............................................................................. 294
4.16 <time.h> 日期和时间函数 ......................................................................... 317
4.17 <math.h> 数学函数 ................................................................................... 325
4.18 pic30 函数库 ............................................................................................. 366
5 MPLAB C30 内建函数
5.1 简介 ............................................................................................................ 375
5.2 内建函数列表 .............................................................................................. 376
5.3 内建函数错误消息 ...................................................................................... 379
附录 A ASCII 字符集 ....................................................................................................381
索引 .............................................................................................................................383
全球销售及服务网点 ....................................................................................................400
DS51456B_CN iv 2005 Microchip Technology Inc.
dsPIC®语言工具库
前言
客户须知
所有文档均会更新,本文档也不例外。 Microchip 的工具和文档将不断演变以满足客户的需求,因此 实际使用中有些对话框和 / 或工具说明可能与本文档所述之内容有所不同。请访问我们的网站
www.microchip.com)获取最新文档。
文档均标记有 “DS”编号。该编号出现在每页底部的页码之前。 DS 编号的命名约定为
DSXXXXXA”,其中 “XXXXX”为文档编号,“A”为文档版本。
欲了解开发工具的最新信息,请参考 MPLAB
(主题),打开现有在线帮助文件列表。
简介
本文档的目的是对使用 Microchip dsPIC 语言工具时用到的库进行定义和说明,这 些语言工具是基于 GNU 编译器集 (GNU Compiler CollectionGCC)技术的。相关 的语言工具有:
®
• MPLAB
• MPLAB C30 C 编译器
• MPLAB LINK30 链接器
• MPLAB LIB30 归档程序 / 库管理器
其他使用工具
本章讨论的内容包括:
关于本指南
推荐读物
疑难解答
• Microchip 网站
开发系统变更通知客户服务
客户支持
ASM30 汇编器
®
IDE 在线帮助。从 Help (帮助)菜单选择 Topics
2005 Microchip Technology Inc. DS51456B_CN 1
dsPIC®语言工具库
关于本指南
文档内容编排
本文档介绍了如何使用 GNU 语言工具为 dsPIC® 单片机应用编写代码。文档内容编排 如下:
库的概述—提供对库的概述。
DSP 函数库—列出了 DSP 操作的库函数。
dsPIC 外设函数库—列出了 dsPIC 芯片的软件和硬件外设操作的库函数与宏。
标准 C 数学函数库—列出了标准 C 操作的库函数与宏。
MPLAB C30 内建函数—列出了 C 编译器 MPLAB C30 的内建函数。
DS51456B_CN 第 2 页 2005 Microchip Technology Inc.
前言
本指南中使用的约定
本手册采用以下文档约定:
文档约定
说明 涵义 示例
Arial 字体: 斜体字 参考书目
需强调的文字 ...
首字母大写 窗口 Output 窗口
对话框 Settings 对话框
菜单选项 选择 Enable Programmer 引用 窗口或对话框中的字段名 Save project before build” 带右尖括号且有下划线的斜体文字菜单路径
粗体字 对话框按钮 单击 OK
选项卡 单击 Power 选项卡
‘bnnnn 尖括号 < > 括起的文字 键盘上的按键 <Enter> <F1>
Courier 字体: 常规 Courier 源代码示例
斜体 Courier 变量参数 file.o 其中 file可以是任
0xnnnn
方括号 [ ] 可选参数
花括号和竖线: { | } 选择互斥参数; “或”选择 省略号 ... 代替重复文字
二进制数, n 是其中一位
文件名
文件路径
关键字
命令行选项
位值
常数 0xFF, ‘A’
十六进制数, n 是其中一位 0xFFFF0x007A
表示由用户提供的代码
MPLAB
File>Save
‘b00100, ‘b10
#define START
autoexec.bat
c:\mcc18\h
_asm, _endasm, static
-Opa+, -Opa-
0, 1
一有效文件名
mcc18 [options] file [options]
errorlevel {0|1}
var_name [, var_name...]
void main (void) { ... }
®
IDE User's Guide
仅有
的编译器 ...
2005 Microchip Technology Inc. DS51456B_CN 3
dsPIC®语言工具库
推荐读物
本文档介绍了 dsPIC 的库函数和宏。更多关于 dsPIC 语言工具和其他工具的使用信 息,可以从下面的推荐读物中获得:
README 文件 关于 Microchip 工具的最新信息,请阅读软件附带的 README 文件 (ASCII 文本文
件)。 Getting Started with dsPIC Language Tools DS51316) 关于安装和使用 Microchip dsPIC 数字信号控制器 (digital signal controller, DSC
语言工具 (MPLAB ASM30MPLAB LINK30 MPLAB C30)的指南。同时提供了 使用 dsPIC 仿真器和 MPLAB SIM30 的示例。
MPLAB
指导如何使用 dsPIC DSC 汇编器 MPLAB ASM30dsPIC DSC 链接器 MPLAB LINK30 和各种 dsPIC DSC 实用程序,包括 MPLAB LIB30 归档程序 / 库管理器。
MPLAB
使用 dsPIC DSC C 编译器的指南。 MPLAB LINK30 与这个工具配合使用。 GNU HTML 文档 在语言工具的光盘中提供了这个文档。它介绍了标准 GNU 开发工具, dsPIC DSC
语言工具就是以此为基础的。 dsPIC30F Family Overview DS70043) 关于 dsPIC30F 系列芯片和架构的概述。 dsPIC30F Programmer’s Reference Manual DS70030dsPIC30F 编程人员的指南。包括编程模型和指令集。 Microchip 网站 Microchip 的网站 (http://www.microchip.com)提供了丰富的文档资料,可以方便地
下载各个数据手册、应用笔记、教程和用户指南。所有文档都采用 Adobe Acrobat
pdf)格式。
®
ASM30, MPLAB LINK30 and Utilities User's Guide DS51317
®
C30 C 编译器用户指南 (DS51284C_CN
疑难解答
本文档中没有提到的常见问题信息可查阅 README 文件。
DS51456B_CN 4 2005 Microchip Technology Inc.
MICROCHIP 网站
Microchip 网站 (www.microchip.com)为客户提供在线支持。客户可通过该网站方便 地获取文件和信息。只要使用常用的因特网浏览器即可访问。网站提供以下信息:
产品支持——数据手册和勘误表、应用笔记和样本程序、设计资源、用户指南以及 硬件支持文档、最新的软件版本以及归档软件
一般技术支持——常见问题 (FAQ)、技术支持请求、在线讨论组以及 Microchip 顾问计划成员名单
Microchip 业务——产品选型和订购指南、最新 Microchip 新闻稿、研讨会和活动安 排表、 Microchip 销售办事处、代理商以及工厂代表列表
开发系统变更通知客户服务
Microchip 的客户通知服务有助于客户了解 Microchip 产品的最新信息。注册客户可在 他们感兴趣的某个产品系列或开发工具发生变更、更新、发布新版本或勘误表时,收 到电子邮件通知。
欲注册,请登录 Microchip 网站 www.microchip.com,点击 “变更通知客户
Customer Change Notification)”服务并按照注册说明完成注册。
开发系统产品的分类如下:
编译器——Microchip C 编译器及其他语言工具的最新信息,包括 MPLAB C18 MPLAB C30 C 编译器、 MPASM MPLAB LINK30 目标链接器,以及 MPLIB
仿真器——Microchip 在线仿真器的最新信息,包括 MPLAB ICE 2000 MPLAB ICE 4000
在线调试器——Microchip 在线调试器 MPLAB ICD 2 的最新信息。
MPLAB IDE 的最新信息,主要针对 MPLAB IDEMPLAB SIM 模拟器、MPLAB IDE 项目
管理器以及一般编辑和调试功能。
编程器——Microchip 编程器的最新信息,包括 MPLAB PM3 和PRO MATE 编程器以及 PICSTART
®
前言
TM
MPLAB ASM30 汇编器、 MPLINKTM和
TM
MPLAB LIB30 目标库管理器。
IDE——用于开发系统工具的Windows®集成开发环境Microchip MPLAB
®
®
Plus 和 PICkit® 1 开发编程器。
II 器件
2005 Microchip Technology Inc. DS51456B_CN 第 5
dsPIC®语言工具库
客户支持
Microchip 产品的用户可通过以下渠道获得帮助:
代理商或代表
当地销售办事处
应用工程师 (FAE
技术支持
开发系统信息热线
客户应联系其代理商、代表或应用工程师 (FAE)寻求支持。当地销售办事处也可为 客户提供帮助。本文档后附有销售办事处的联系方式。
也可通过 http://support.microchip.com 获得网上技术支持。
DS51456B_CN 6 2005 Microchip Technology Inc.

1.1 引言

dsPIC® 语言工具库

1 章 库的概述

所谓库就是将一些常用的函数集合在一起,这样用户可以方便地引用和链接。请查阅 MPLAB ASM30, MPLAB LINK30 and Utilities User's Guide 获得有关创建和使用库的更 多信息。
1.1.1 汇编代码的应用
可以从 Microchip 网站下载 dsPIC 语言工具库的免费版本。提供了 DSP 函数库和 dsPIC 外设函数库的目标文件和源代码。仅提供了数学库的目标文件,数学库包含标 准 C 语言头文件 <math.h> 中的函数。其完整的标准 C 语言库随 MPLAB C30 C 编译 器提供。
1.1.2 C 代码的应用
dsPIC 语言工具库存放在 c:\pic30_tools\lib 目录下,其中, c:\pic30_toolsMPLAB C30 C 编译器的安装目录。可以通过 MPLAB LINK30 将这些库直接链接到 应用程序中。
1.1.3 本章内容
本章包括以下内容:
特定于 OMF 的库 / 启动模块
启动代码
•DSP函数库
•dsPIC外设函数库
标准 C 语言库 (包含数学函数)
• MPLAB C30 内建函数

1.2 特定于 OMF 的库 / 启动模块

库文件和启动模块是特定于目标模块格式 (Object Module FormatOMF)的。 OMF 可以为以下格式之一:
• COFF — 默认格式。
•ELF — 用于 ELF 目标文件的调试格式是 DWARF 2.0。
选择 OMF 的方法有两种:
1. 为所有工具设定一个名为 PIC30_OMF 的环境变量。
2. 当调用工具时在命令行中选择 OMF,如:-omf=omf -momf=omf
当我们创建应用程序时, dsPIC 工具先搜索一般的库文件 (非 OMF 格式)。如果没有 找到, dsPIC 工具搜索 OMF 规范的库文件,并确定使用哪个库文件。
例如,如果没有找到 libdsp.a,并且没有设定任何环境变量或命令行选项,默认情 况下将会使用文件 libdsp-coff.a
2005 Microchip Technology Inc. DS51456B_CN 7
dsPIC® 语言工具库

1.3 启动代码

为初始化数据存储器中的变量,链接器创建一个数据初始化模板。这个模板必须在应 用程序获得控制权之前,在启动时处理。对于 C 程序,这个函数是由 libpic30-coff.a 中的启动模块(crt0.o crt1.o),或 libpic30-elf.a 中的 启动模块 (crt0.eocrt1.eo)来完成的。汇编语言程序可以通过与需要的启动 模块文件链接直接来利用这些模块。启动模块的源代码在相应的 .s 文件中。
主启动模块 (crt0)对所有变量 (持久数据段中的变量除外)进行初始化 (根据 ANSI 标准的要求,未初始化的变量设置为 0)。备用启动模块 (crt1)不会进行数据 初始化。
关于启动代码的更多信息,请参阅 MPLAB ASM30, MPLAB LINK30 and Utilities User's Guide。对于 C 语言应用程序,可参阅

1.4 DSP 函数库

DSP 函数库 (libdsp-omf.a)为将在 dsPIC30F 数字信号控制器 (DSC)中执行 的程序提供了一套数字信号处理函数。 DSP 函数库共支持 49 个函数。

1.5 dsPIC 外设函数库

dsPIC (软件和硬件)外设函数库为设置和控制 dsPIC30F DSC 外设提供了函数和 宏。本书的相关章节中有相应的使用示例。
这些库是特定于处理器的,形式为 libpDevice-omf.a,其中, Device dsPIC 器件的编号 (如: libp30F6014-coff.a 是特定于 dsPIC30F6014 器件的)。
MPLAB C30 C
编译器用户指南》

1.6 标准 C 语言库 (包含数学函数)

提供了一整套符合 ANSI-89 的库。标准的 C 语言库文件是 libc-omf.a (由业界领 先的 Dinkumware 公司编写)和 libm-omf.a (由 Microchip 公司编写的数学函 数)。
另外,一些在使用 dsPIC 器件时必须进行修改的 dsPIC 标准 C 语言库辅助函数和标准 函数包含在 libpic30-omf.a
一个典型的 C 应用程序必须包含全部三个库。

1.7 MPLAB C30 内建函数

对于开发人员来说, MPLAB C30 C 编译器包含的内建函数与库函数工作方式相同。
DS51456B_CN 8 2005 Microchip Technology Inc.

2.1 简介

dsPIC® 语言工具库

2 DSP 函数库

DSP 函数库为将在 dsPIC30F 数字信号控制器 (DSC)中执行的程序提供了一系列数 字信号处理函数。 DSP 函数库旨在为 C 软件开发人员提供大部分通用信号处理函数的 高效实现。 DSP 函数库共支持 49 个函数。
函数库的主要目的是最大限度地缩短每个函数的执行时间。为了达到这个目的, DSP 函数库主要由优化的汇编语言编写。与 ANSI C 相比,在代码大小相同的情况下,应用 DSP 函数库可以大大地提高执行速度。另外,由于 DSP 函数库己经过严格的测试, 应用 DSP 函数库将缩短应用程序的开发时间。
2.1.1 汇编代码应用程序
可以从 Microchip 网站获得该库以及相关头文件的免费版本,其中包括源代码。
2.1.2 C 代码应用程序
MPLAB C30 C 编译器安装目录 (c:\pic30_tools)包含以下与库有关的子目录:
libDSP 函数库 / 归档文件。
src\dsp—库函数的源代码以及用于重建库的批处理文件。
support\hDSP 函数库的头文件。
2.1.3 本章内容
本章的内容包括:
•DSP函数库的使用
矢量函数
窗函数
矩阵函数
滤波函数
变换函数
2005 Microchip Technology Inc. DS51456B_CN 第 9
dsPIC® 语言工具库

2.2 DSP 函数库的使用

2.2.1 利用 DSP 函数库构建应用程序
利用 DSP 函数库构建应用程序只需要两个文件:dsp.hlibdsp-omf.adsp.h 是提供函数库中所有函数的原型以及 #define typedef 的头文件。
libdsp-omf.a 是一个归档库文件,它包含所有库函数的目标文件。(更多特定于 OMF 的库的信息,请参阅第 1.2 节 “特定于 OMF 的库 / 启动模块”。)
当编译应用程序时,调用 DSP 库中函数或者使用其符号或 typedef 的所有源文件必 须都 (使用 #include)引用 dsp.h。当链接应用程序时, libdsp-omf.a 必须作 为链接器的一个输入 (使用 --library-l 链接器开关),以便将应用程序使用的 函数链接到应用程序。
链接器将 DSP 库的函数存放到一个名为 .libdsp 的特殊文本段中。这可以通过查看 链接器生成的映射文件看到。
2.2.2 存储模型
DSP 函数库是使用 “小代码”和 “小数据”存储模型创建的,以尽可能生成最小的 库。因为一些 DSP 库函数是用 C 语言编写的,并且使用编译器的浮点库,因此 MPLAB C30 链接描述文件将 .libm .libdsp 文本段相邻存放。这保证了 DSP 数库可以安全地使用 RCALL 指令来调用浮点库中所需的浮点函数。
2.2.3 DSP 库函数的调用约定
DSP 函数库中的所有目标模块都遵循 dsPIC30F DSC C 语言兼容性原则,以及
MPLAB C30 C
8 个工作寄存器 (W0 W7)作为函数参数。任何其他函数参数都通过堆栈传递。 W0 W7 工作寄存器作为暂存存储器,函数调用后,其中的值不能保存。另一方面,
如果函数使用 W8 W13 中地任何一个工作寄存器,工作寄存器的内容先被保存起 来,然后该寄存器,函数返回时恢复其原来的值。函数 (非 void 函数)的返回值可以 保存在 W0 (也称为 WREG)中。当需要时,可以按照
指南》
中描述的 C 语言系统堆栈规则,使用运行时软件堆栈。根据这些规则, DSP
数库的目标模块可以链接到 C 程序、汇编程序或者混合使用这两种语言编写的程序。
编译器用户指南》
中陈述的函数调用约定。特别地,函数可以使用前
MPLAB C30 C
编译器用户
2.2.4 数据类型
DSP 函数库提供的运算利用了 DSP 指令系统和 dsPIC30F DSC 的架构特点。从这种 意义上来讲,大部分运算都是小数计算。
DSP 函数库利用整型定义了小数类型:
#ifndef fractional typedef int fractional; #endif
fractional
义的数据通常被称为 “1.15”数据。
数据类型用来表示带有 1 位符号位和 15 位小数位的数据。使用这种格式定
DS51456B_CN 10 2005 Microchip Technology Inc.
DSP 函数库
对于使用乘法器的函数,结果的计算要使用 40 位的累加器,并利用 “9.31”算法。 这种数据格式带有 9 位符号 / 指数位, 31 位小数位,它提供了更大的计算空间,比
1.15”类型提供的范围 (-1.00 +1.00)大得多。当这些函数计算出结果时,它们
自然会还原为 “1.15”格式的数据类型。 使用小数运算时,要对特定函数的允许输入值集合施加某些约束。如果保证了这些约
束, DSP 函数库提供的运算通常会产生精确到 14 位的数字结果。然而,一些函数会 对输入数据和 / 或输出结果进行隐含的定标,这样会使得输出结果的精度下降 (与浮 点运算相比)。
DSP 函数库中的某些运算需要更高级别的数据精度,要采用浮点算法运算。然而,这 些运算的结果会被转换为小数值以与整个应用程序统一。唯一例外的是 MatrixInvert 函数,它以浮点型算法计算浮点型矩阵的逆矩阵,而提供浮点型格式 的结果。
2.2.5 数据存储器的使用
DSP 函数库不对 RAM 进行分配,这个任务留给用户自己完成。如果您没有分配适当 的存储空间并正确地对齐数据,当函数运行时会出现非期望结果。另外,为了最大限 度地缩短执行时间, DSP 函数库并不会检查提供的函数参数 (包括指向数据存储器的 指针),来判断这些参数是否合法。
大部分函数都接受数据指针作为函数的参数,函数参数包含要操作的数据,通常情况 下还包含存放结果的存储单元。为方便起见, DSP 函数库中的大部分函数期望将其输 入参数分配到默认的 RAM 存储空间 (X 数据空间或 Y 数据空间),而将输出存放回默 认的 RAM 存储空间。然而,计算密集型的函数要求将一些操作数存放到 X 数据空间 和 Y 数据空间 (或是程序存储器和 Y 数据空间)中,这样运算能够利用 dsPIC30F 架 构的取双数据功能。
2.2.6 CORCON 寄存器的使用
DSP 函数库中的很多函数通过修改 CORCON 寄存器来使 dsPIC30F 器件工作在特定 的运算模式。在这些函数的入口, CORCON 寄存器被压入堆栈。接着,它被修改以正 确地执行期望的运算,最后 CORCON 寄存器从堆栈中弹出以恢复它原来的值。这种 机制允许库的执行尽可能正确,而不破坏 CORCON 的设定值。
当修改 CORCON 寄存器时,一般情况下它会被设置为 0x00F0。这使得 dsPIC30F 器 件工作在以下运算模式:
•DSP乘法被设定为有符号的小数运算
使能累加器 A 和累加器 B 的饱和模式
饱和模式设定为 “9.31”饱和 (超饱和)模式
使能数据空间写饱和 (Data Space Write Saturation
禁止程序空间可视性 (Program Space Visibility, PSV)
使能收敛 (无偏的)舍入法
关于 CORCON 寄存器及其影响的详细信息,可参阅
dsPIC30F
系列参考手册》
2005 Microchip Technology Inc. DS51456B_CN 11
dsPIC® 语言工具库
2.2.7 溢出和饱和处理
DSP 函数库使用 “9.31”饱和进行大多数计算,但是必须以 “1.15”格式存储输出结 果。如果在运算过程中,使用的累加器发生饱和(超过 0x7F FFFF FFFF 或低于 0x80 0000 0000),状态寄存器中的相应饱和位 (SA SB)就会被置位。这个位将一直保 持置位直到被清零。这样允许您在执行函数后检查 SA SB 位,以确定是否应该对函 数的输入数据进行定标。
同样地,如果一个计算导致累加器溢出(累加器值超过 0x00 7FFF FFFF 或低于 0xFF 8000 0000),状态寄存器中相应的溢出位(OA OB)就会被置位。与 SA SB 位不 同, OA OB 位不会一直保持置位到被清零。每次执行使用累加器的运算时都会更新 这些位。如果超出这个指定的范围,这是很重要的事件,建议要通过 INTCON1 寄存 器中的 OVATE 位和 OVBTE 位来使能累加器溢出陷阱。这使得一旦发生溢出就会产生 算术错误陷阱,这样您就可以进行需要的操作。
2.2.8 集成到利用中断和 RTOS 的应用程序中
DSP 函数库可以很容易地集成到利用中断和 RTOS 的应用程序中,但要遵循某些规 则。为了最大限度地缩短执行时间, DSP 函数库利用了 DO 循环、 REPEAT 循环,模 寻址和位反转寻址等。这些都是 dsPIC30F DSC 中的有限硬件资源,当中断 DSP 库 函数的执行时,后台代码必须考虑每个资源的使用。
当与 DSP 函数库集成时,必须检查下文中每个函数描述中的 “资源使用情况”,以确 定使用哪些资源。如果库函数将被中断,要自己保存和恢复函数用到的所有寄存器的 内容,包括 DOREPEAT 和特殊寻址硬件的状态。这当然也包括存储和恢复 CORCON 寄存器和状态寄存器的内容。
2.2.9 重建 DSP 函数库
提供了名为 makedsplib.bat 的批处理文件来重建 DSP 函数库。 MPLAB C30 编译 器需要重建 DSP 函数库,批处理文件假定编译器安装在默认的目录 c:\pic30_tools 下。如果您的语言工具安装在不同的目录下,您必须修改批处理文 件中的目录以符合语言工具的实际位置。
DS51456B_CN 12 2005 Microchip Technology Inc.

2.3 矢量函数

DSP 函数库
本节将讨论 DSP 函数库的小数矢量的概念,并描述执行矢量操作的各个函数。
2.3.1 小数矢量运算
小数矢量是矢量元素和相应的元素编号组成的集合,在存储器中连续分配,其中第一 个元素位于最低的存储地址。存储单元的一个字 (两个字节)用于存储一个元素的 值,且这个量必须解释为用 “1.15”数据格式表示的小数。
指向矢量第一个元素的指针用作访问每个矢量值的句柄。第一个元素的地址称为矢量 的基地址。因为矢量的每个元素都是 16 位的,基地址必须对齐到偶数地址。
一维矢量的配置与器件的存储器存储模型相适应,所以对于一个具有 N 个元素的矢 量,其第 n 个元素可以用如下方法通过矢量的基地址 BA 访问:
BA + 2(n-1),其中 1 n N
dsPIC30F 器件的字节寻址能力,故系数选择为 2。 在 DSP 函数库中,实现了一元和二元的小数矢量运算。一元运算中的操作数矢量称为
源矢量。在二元运算中,第一个操作数称为第一源矢量,第二个操作数称为第二源矢 量。每个运算都对一个或几个源矢量元素进行计算。某些运算的结果是标量值 (同样 会被表示为 “1.15”类型的小数),而另外一些运算的结果是矢量。当结果也是矢量 时,也称为为目标矢量。
某些计算结果是矢量的运算允许 “原址”计算。即运算的结果被重新存放到源矢量中
(或者是二元运算中的第一源矢量)。在这种情况下,目标矢量被认为会 (在物理上)
替代 (第一)源矢量。如果一个运算可以 “原址”计算,那么下文中函数描述的 “说 明”中会指出这一点。
对于某些二元运算,(在物理上)两个操作数可以有相同的源矢量,这表示对源矢量和 其本身进行运算。如果一个给定的运算可以进行这种类型的计算,那么下文中函数描 述的 “说明”中会指出这一点。
某些运算既可以对源矢量和其本身进行计算,又可以 “原址”计算。 DSP 函数库中的所有小数矢量运算都将操作数矢量的基数 (元素数目)作为参数。基
于这个参数的值,作了以下假设: a) 一个特定运算所涉及到的所有矢量总共占用的存储空间在目标器件的可用数据存
储空间范围内。
b) 在二元运算情况下,两个操作数矢量的基数都
参阅 VectorConvolve VectorCorrelate 函数的 “说明”)。
c) 目标矢量
必须
足够大以接受运算的结果。
必须
符合矢量代数规则 (具体请
2005 Microchip Technology Inc. DS51456B_CN 13
dsPIC® 语言工具库
2.3.2 用户需要注意的事项
a) 不对这些函数执行边界检查。基数超出范围 (包括零长度的矢量)以及二元运
算中源矢量大小不一致都可能产生预想不到的结果。
b) 如果源矢量中相应元素的运算结果大于 1-2
导致饱和。同样地,如果运算结果大于 1-2 也会导致饱和。
c) 建议在每个函数调用结束后检查状态寄存器 (Status registerSR)。尤其是,
用户可以在函数返回后检查 SASB SAB 标志,以判断是否发生了饱和。
d) 所有函数都设计为对分配到默认 RAM 存储空间 (X 数据空间或 Y 数据空间)中
的小数矢量进行运算。
e) 返回一个目标矢量的运算可以是嵌套的,例如,如果:
a = Op1 (b, c),且 b = Op2 (d)c = Op3 (e, f),则
a = Op1 (Op2 (d), Op3 (e, f))
2.3.3 附加说明
函数的描述将其范围限制在了这些运算的正常使用范围内。然而,由于这些函数的计 算过程中不进行边界检查,因此可根据特定需要自由地解释运算及其结果。
例如,当计算函数 VectorMax 时,源矢量的长度可能会超过 numElems。这种情况 下,可以使用这个函数
再如,您可能对用位于 M M+numElems-1 之间的源矢量的 numElems 个元素来替 换位于 NN+numElems-1 之间的目标矢量的 numElems 个元素感兴趣。可以用以 下方法使用 VectorCopy 函数:
fractional* dstV[DST_ELEMS] = {...}; fractional* srcV[SRC_ELEMS] = {...}; int n = NUM_ELEMS; int N = N_PLACE; /* NUM_ELEMS+N int M = M_PLACE; /* NUM_ELEMS+M fractional* dstVector = dstV+N; fractional* srcVector = srcV+M;
-15
或者小于 -1.0,矢量的加减运算会
-15
或小于 -1.0,矢量的点积和幂运算
仅仅
在源矢量的前 numElems 个元素中查找最大值。
DST_ELEMS */ SRC_ELEMS */
dstVector = VectorCopy (n, dstVector, srcVector);
dstVector = VectorCopy (n, dstVector, srcVector);
在这个例子中, VectorZeroPad 函数可以 “原址”运算,现在 dstV = srcV,其 中, numElems 为要保存的源矢量开头的元素数目, numZeros 为要设置为零的矢量 末尾的元素数目。
另外,可以利用不执行边界检查开发出更多的功能。
DS51456B_CN 14 2005 Microchip Technology Inc.
DSP 函数库
2.3.4 各个函数
下面将说明实现矢量运算的各函数。
VectorAdd
描述: VectorAdd 函数将第一源矢量中每个元素的值与第二源矢量中对应元
素的值相加,并将结果存放在目标矢量中。 头文件: 函数原型:
参数:
返回值: 指向目标矢量基地址的指针 说明:
源文件: 资源使用情况: 系统资源的使用:
dsp.h
extern fractional* VectorAdd (
int numElems,
fractional* dstV,
fractional* srcV1,
fractional* srcV2
);
numElems 源矢量中的元素数目
dstV 指向目标矢量的指针
srcV1 指向第一源矢量的指针
srcV2 指向第二源矢量的指针
如果 rcV1[n] + srcV2[n] 的绝对值大于 1-2
元素饱和。
该函数可 “原址”计算。
该函数可以对源矢量和其本身进行计算。
vadd.asm
W0..W4 使用,不恢复 ACCA 使用,不恢复 CORCON 保存,使用,恢复
-15
,运算会导致第 n 个
DO REPEAT 指令的使用:
一级 DO 指令 无 REPEAT 指令
程序字 (24 位指令):
13
周期数 (包括 C 函数调用和返回开销):
17 + 3(numElems
2005 Microchip Technology Inc. DS51456B_CN 15
dsPIC® 语言工具库
VectorConvolve
描述: VectorConvolve 函数计算两个源矢量的卷积,并且将结果存储在目
头文件: 源文件:
参数:
返回值: 指向目标矢量基地址的指针 说明: 第二源矢量中的元素数目
源文件:
标矢量中。结果用以下公式计算:
n
yn() xk()hn k()
=
k0=
n
=
yn() xk()hn k()
yn() xk()hn k()
式中, x(k) 为大小为 N 的第一源矢量, h(k) 为大小为 M 的第二源矢量
M N)。
dsp.h
extern fractional* VectorConvolve ( int numElems1, int numElems2, fractional* dstV, fractional* srcV1, fractional* srcV2 );
numElems1 第一源矢量中的元素数目 numElems2 第二源矢量中的元素数目 dstV 指向目标矢量的指针 srcV1 指向第一源矢量的指针 srcV2 指向第二源矢量的指针
knM 1+=
N1
=
knM 1+=
其中 0
必须
目标矢量必须已经存在,且元素数目应为 numElems1+numElems2-1。
该函数可以对源矢量和其本身进行计算。
vcon.asm
n < M
,其中 M
,其中 N
小于或等于第一源矢量中的元素数目。
n < N
n < N+M-1
DS51456B_CN 16 2005 Microchip Technology Inc.
VectorConvolve (续)
DSP 函数库
资源使用情况: 系统资源的使用:
W0..W7 使用,不恢复 W8..W10 保存,使用,恢复 ACCA 使用,不恢复 CORCON 保存,使用,恢复
DO REPEAT 指令的使用:
两级 DO 指令 无 REPEAT 指令
程序字 (24 位指令):
58
周期数 (包括 C 函数调用和返回开销)
对于 N = numElems1M = numElems2
M
28 13M 6 m
++
28 13M 6 m
m1=
M
m1=
NM()73M+()++ +
,其中 M = N
VectorCopy
描述:
头文件: 函数原型:
参数:
返回值: 指向目标矢量基地址的指针。 说明:
源文件: 资源使用情况: 系统资源的使用:
VectorCopy 函数将源矢量的元素复制到目标矢量 (已经存在)的开
头,使得:
dstV[n] = srcV[n]0
dsp.h
extern fractional* VectorCopy (
int numElems,
fractional* dstV,
fractional* srcV
);
numElems 源矢量中的元素数目
dstV 指向目标矢量的指针
srcV 指向源矢量的指针
必须
目标矢量
多)。
函数可以 “原址”计算。关于这种运算模式的更多信息,可参阅本章的
“附加说明”部分。
vcopy.asm
W0..W3 使用,不恢复
已经存在,并且必须至少有 numElems 个元素 (可以更
n < numElems
,其中 M < N
DO REPEAT 指令的使用:
DO 指令 一级 REPEAT 指令
程序字 (24 位指令):
6
周期数 (包括 C 函数的调用与返回开销):
12 + numElems
2005 Microchip Technology Inc. DS51456B_CN 第 17
dsPIC® 语言工具库
VectorCorrelate
描述:
头文件: 函数原型:
参数:
返回值: 指向目标矢量基地址的指针。 说明: 第二源矢量中的元素数目
源文件: 资源使用情况: 系统资源的使用:
VectorCorrelate 函数计算两个源矢量的相关,并且将结果存储在目 标矢量中。其结果可以通过下式计算:
N1
rn() xk()yk n+()
=
k0=
式中, x(k) 为大小为 N 的第一源矢量 y(k) 为大小为 M 的第二源矢量,其中 (M N)。
dsp.h
extern fractional* VectorCorrelate ( int numElems1, int numElems2, fractional* dstV, fractional* srcV1, fractional* srcV2 );
numElems1 第一源矢量中的元素数目 numElems2 第二源矢量中的元素数目 dstV 指向目标矢量的指针 srcV1 指向第一源矢量的指针 srcV2 指向第二源矢量的指针
,其中 0
必须
目标矢量 numElems1+numElems2-1。
该函数可以对源矢量和其本身进行计算。
该函数使用 VectorConvolve 函数。
vcor.asm
必须
已经存在,其元素数目应为
W0..W7 使用,不恢复, 以及 VectorConvolve 使用的资源
n < N+M-1
小于或等于第一源矢量中的元素数目。
DO REPEAT 指令的使用:
一级 DO 指令 无 REPEAT 指令 以及 VectorConvolve DO/REPEAT 指令。
程序字 (24 位指令):
14, 加上 VectorConvolve 的程序字。
周期数 (包括 C 函数的调用与返回开销):
19 + floor(M/2)*3,其中 M = numElems2, 加上 VectorConvolve 的周期。
注:在 VectorConvolve 的描述中,周期数包括 4 个周期的 C 函数调 用开销。因此, VectorCorrelate 中因 VectorConvolve 而增加 的实际周期数比单独的 VectorConvolve 所用的周期数少 4 个周期。
DS51456B_CN 18 2005 Microchip Technology Inc.
VectorDotProduct
描述:
头文件: 函数原型:
参数:
返回值: 乘积的和。 说明:
函数原型: 资源使用情况: 系统资源的使用:
VectorDotProduct 函数计算第一源矢量和第一源矢量中相应元素乘
积的和 (矢量点积)。
dsp.h
extern fractional VectorDotProduct (
int numElems,
fractional* srcV1,
fractional* srcV2
);
numElems 源矢量中的元素数目
srcV1 指向第一源矢量的指针
srcV2 指向第二源矢量的指针
如果乘积之和的绝对值大于 1-2
该函数可以对源矢量和其本身进行计算。
vdot.asm
W0..W2 使用,不恢复 W4..W5 使用,不恢复 ACCA 使用,不恢复 CORCON 保存,使用,恢复
DSP 函数库
-15
,该运算将导致饱和。
DO REPEAT 指令的使用:
一级 DO 指令 无 REPEAT 指令
程序字 (24 位指令):
13
周期数 (包括 C 函数的调用与返回开销):
17 + 3(numElems)
.
VectorMax
描述:
头文件: 函数原型:
参数:
返回值: 矢量中的最大值。 说明:
源文件:
VectorMax 函数在源矢量中查找值大于或等于前面任何一个矢量元素
的最后一个元素。然后,它输出最大值以及最大值元素的下标。
dsp.h
extern fractional VectorMax (
int numElems,
fractional* srcV,
int* maxIndex
);
numElems 源矢量中的元素数目
srcV 指向源矢量的指针
maxIndex 指向保存 (最后一个)最大元素的下标的存储单元的指
如果 srcV[i] = srcV[j] = maxVal,且 i < j,则
*maxIndex = j
vmax.asm
2005 Microchip Technology Inc. DS51456B_CN 19
dsPIC® 语言工具库
VectorMax (续)
资源使用情况: 系统资源的使用:
VectorMin
描述:
头文件: 函数原型:
参数:
返回值: 矢量中的最小值。 说明:
源文件: 资源使用情况: 系统资源的使用:
W0..W5 使用,不恢复
DO REPEAT 指令的使用:
DO 指令 无 REPEAT 指令
程序字 (24 位指令):
13
周期数 (包括 C 函数的调用与返回开销):
14 如果 numElems = 1 20 + 8(numElems-2) 如果 srcV[n] 19 + 7(numElems-2) 如果 srcV[n] > srcV[n+1], 0
VectorMin 函数在源矢量中查找值小于或等于前面任何一个矢量元素 的最后一个元素。然后,它输出最小值以及最小值元素的下标。
dsp.h
extern fractional VectorMin ( int numElems, fractional* srcV, int* minIndex );
numElems 源矢量中的元素数目 srcV 指向源矢量的指针 minIndex 指向保存 (最后一个)最小元素下标的存储单元的指针
如果 srcV[i] = srcV[j] = minVal,且 i < j,则 *minIndex = j
vmin.asm
W0..W5 使用,不恢复
srcV[n+1]0 ≤ n < numElems-1
n < numElems-1
DO REPEAT 指令的使用:
DO 指令 无 REPEAT 指令
程序字 (24 位指令):
13
周期数 (包括 C 函数的调用与返回开销):
14 如果 numElems = 1 20 + 8(numElems-2) 如果 srcV[n] srcV[n+1], 0 19 + 7(numElems-2) 如果 srcV[n] < srcV[n+1], 0
DS51456B_CN 20 2005 Microchip Technology Inc.
n < numElems-1
n < numElems-1
VectorMultiply
描述:
头文件: 函数原型:
参数:
返回值: 指向目标矢量基地址的指针。 说明:
源文件: 资源使用情况: 系统资源的使用:
VectorMultiply 函数将第一源矢量中每个元素的值与第二源矢量中
对应元素的值相乘,并将结果存放在目标矢量相应的元素中。
dsp.h
extern fractional* VectorMultiply (
int numElems,
fractional* dstV,
fractional* srcV1,
fractional* srcV2
);
numElems 源矢量中元素的数目
dstV 指向目标矢量的指针
srcV1 指向第一源矢量的指针
srcV2 指向第二源矢量的指针
该运算也可看作是矢量中逐个元素相乘。
该函数可以 “原址”计算。
该函数可以对源矢量和其本身进行计算。
vmul.asm
W0..W5 使用,不恢复 ACCA 使用,不恢复 CORCON 保存,使用,恢复
DSP 函数库
DO REPEAT 指令的使用:
一级 DO 指令 无 REPEAT 指令
程序字 (24 位指令):
14
周期数 (包括 C 函数的调用和返回开销):
17 + 4(numElems)
VectorNegate
描述:
头文件: 函数原型:
参数:
返回值: 指向目标矢量基地址的指针 说明:
源文件:
VectorNegate 函数对源矢量中元素的值取反 (改变其符号),并将结
果存放在目标矢量中。
dsp.h
extern fractional* VectorNeg (
int numElems,
fractional* dstV,
fractional* srcV
);
numElems 源矢量中的元素的数目
dstV 指向目标矢量的指针
srcV 指向源矢量的指针
0x8000 取反的值设置为 0x7FFF
该函数可以 “原址”计算。
vneg.asm
2005 Microchip Technology Inc. DS51456B_CN 21
dsPIC® 语言工具库
VectorNegate (续)
资源使用情况: 系统资源的使用:
VectorPower
描述: 头文件: 函数原型:
参数:
返回值: 矢量幂 (元素平方和)的值。 说明:
源文件: 资源使用情况: 系统资源的使用:
W0..W5 使用,不恢复 ACCA 使用,不恢复 CORCON 保存,使用,恢复
DO REPEAT 指令的使用:
一级 DO 指令 无 REPEAT 指令
程序字 (24 位指令):
16
周期数 (包括 C 函数的调用和返回开销):
19 + 4(numElems)
VectorPower 函数计算源矢量元素的平方和。
dsp.h
extern fractional VectorPower ( int numElems, fractional* srcV );
numElems 源矢量中元素的数目 srcV 指向源矢量的指针
-15
如果元素平方和的绝对值大于 1-2 该函数可以对源矢量和其本身进行计算。
vpow.asm
W0..W2 使用,不恢复 W4 使用,不恢复 ACCA 使用,不恢复 CORCON 保存,使用,恢复
,该运算将导致饱和。
DO REPEAT 指令的使用:
DO 指令 一级 REPEAT 指令
程序字 (24 位指令):
12
周期数 (包括 C 函数的调用和返回开销):
16 + 2(numElems)
DS51456B_CN 22 2005 Microchip Technology Inc.
VectorScale
描述:
头文件: 函数原型:
参数:
返回值: 指向目标矢量基地址的指针 说明:
源文件: 资源使用情况: 系统资源的使用:
VectorScale 函数用一个定标值对源矢量中所有元素的值进行换算
(乘以定标值),并将结果存放在目标矢量中。
dsp.h
extern fractional* VectorScale (
int numElems,
fractional* dstV,
fractional* srcV,
fractional sclVal
);
numElems 源矢量中元素的数目
dstV 指向目标矢量的指针
srcV 指向源矢量的指针
sclVal 换算矢量元素的定标值
sclVal 必须是 “1.15 “格式的小数。
该函数可以 “原址”计算。
vscl.asm
W0..W5 使用,不恢复 ACCA 使用,不恢复 CORCON 保存,使用,恢复
DSP 函数库
DO REPEAT 指令的使用:
一级 DO 指令 无 REPEAT 指令
程序字 (24 位指令):
14
周期数 (包括 C 函数的调用和返回开销):
18 + 3(numElems)
VectorSubtract
描述:
头文件: 函数原型:
参数:
返回值: 指向目标矢量基地址的指针。 说明:
VectorSubtract 函数将第一源矢量中每个元素的值减去第二源矢量
中对应元素的值,并将结果存放在目标矢量中。
dsp.h
extern fractional* VectorSubtract (
int numElems,
fractional* dstV,
fractional* srcV1,
fractional* srcV2
);
numElems 源矢量中元素的数目
dstV 指向目标矢量的指针
srcV1 指向第一源矢量 (被减数)的指针
srcV2 指向第二源矢量 (减数)的指针
如果 rcV1[n] - srcV2[n] 结果的绝对值大于 1-2
n 个元素饱和。
该函数可以 “原址”计算。
该函数可以对源矢量和其本身进行计算。
-15
,该运算会导致
2005 Microchip Technology Inc. DS51456B_CN 23
dsPIC® 语言工具库
VectorSubtract (续)
源文件: 资源使用情况: 系统资源的使用:
VectorZeroPad
vsub.asm
W0..W4 使用,不恢复 ACCA 使用,不恢复 ACCB 使用,不恢复 CORCON 保存,使用,恢复
DO REPEAT 指令的使用:
一级 DO 指令 无 REPEAT 指令
程序字 (24 位指令):
14
周期数 (包括 C 函数的调用和返回开销)
17 + 4(numElems)
描述:
头文件: 函数原型:
参数:
返回值: 指向目标矢量基地址的指针。 说明:
源文件:
VectorZeroPad 函数将源矢量复制到已经存在的目标矢量的开头,并 对目标矢量中剩余的 numZeros 个元素填充零:
dstV[n] = srcV[n]0 dstV[n] = 0numElems
dsp.h
extern fractional* VectorZeroPad ( int numElems, int numZeros, fractional* dstV, fractional* srcV );
numElems 源矢量中元素的数目 numZeros 目标矢量末端被填充零的元素数目 dstV 指向目标矢量的指针 srcV 指向源矢量的指针
必须
目标矢量 该函数可以 “原址”计算。关于这种运算模式的更多信息,可参阅本章
的 “附加说明”部分。 该函数使用了 VectorCopy 函数。
vzpad.asm
已经存在,并且元素数目为 numElems+numZeros
n < numElems
n<numElems+numZeros
DS51456B_CN 24 2005 Microchip Technology Inc.
VectorZeroPad (续)
资源使用情况: 系统资源的使用:
W0..W6 使用,不恢复 以及 VectorCopy 使用的资源。
DO REPEAT 指令的使用:
DO 指令 一级 REPEAT 指令 以及 VectorCopy 使用的 DO/REPEAT 指令
程序字:
13 加上 VectorCopy 的程序字
周期数 (包括 C 函数的调用和返回开销):
18 + numZeros 加上 VectorCopy 函数的周期数。
注:在对 VectorCopy 的描述中,周期数包括 C 函数调用开销的 3
周期。因此, VectorZeroPad 中因 VectorCopy 而增加的实际周期
数比单独的 VectorCopy 函数所用的周期数少 3 个周期。
DSP 函数库
2005 Microchip Technology Inc. DS51456B_CN 25
dsPIC® 语言工具库

2.4 窗函数

窗是在其定义域 (0 n < numElems)内具有特定值分布的矢量。特定的值分布取决 于窗生成时的特性。
对矢量加窗可改变其值分布。在这种情况下,窗 元素。
对矢量加窗之前,必须先创建窗。窗初始化操作将生成窗元素的值。为获得更高的精 度,这些值是以浮点型算法计算的,其结果以 “1.15”小数格式存储。
当应用窗操作时,为了避免过多的开销,在程序的执行过程中只生成一次特定的窗, 但多次使用生成的窗。因此,建议将任何初始化操作返回的窗存储在持久 (静态)矢 量中。
2.4.1 用户需要注意的事项
a) 所有窗初始化函数都设计为将生成的窗矢量存放到默认的 RAM 存储空间 (X
据空间或 Y 数据空间)中。
b) 窗函数设计为对存放在默认 RAM 存储空间 (X 数据空间或 Y 数据空间)中的矢
量进行操作。
c) 建议在每个函数调用结束后,对状态寄存器 (SR)进行检查。 d) 由于窗初始化函数是用 C 语言实现的,关于周期数的最新信息,可参考最新发
布的有关电子文档。
必须
与修改后的矢量具有相同数目的
2.4.2 各个函数
下面将描述实现窗操作的各函数。
BartlettInit
描述:
头文件: 函数原型:
参数:
返回值: 指向被初始化窗的基地址的指针。 说明: 源文件:
BartlettInit 函数初始化一个长度为 numElems 的三角形(Barlett 窗。
dsp.h
extern fractional* BartlettInit ( int numElems, fractional* window );
numElems 窗中元素的数目 window 指向要被初始化的窗的指针
必须
window 矢量
initbart.c
已经存在,且其元素数目应为 numElems
DS51456B_CN 26 2005 Microchip Technology Inc.
BartlettInit (续)
DSP 函数库
资源使用情况: 系统资源的使用:
W0..W7 使用,不恢复 W8..W14 保存,使用,不恢复
DO REPEAT 指令的使用:
都未使用
程序字 (24 位指令):
参阅 pic30_tools\src\dsp 目录下的 “readme.txt”。
周期数 (包括 C 函数的调用和返回开销):
参阅 pic30_tools\src\dsp 目录下的 “readme.txt”。
BlackmanInit
描述:
头文件: 函数原型:
参数:
返回值: 指向被初始化窗的基地址的指针。 说明: 源文件: 资源使用情况: 系统资源的使用:
BlackmanInit 函数初始化一个长度为 numElems 的布莱克曼
Blackman)(3 term)窗。
dsp.h
extern fractional* BlackmanInit (
int numElems,
fractional* window
);
numElems 窗中元素的数目
window 指向要被初始化的窗的指针
必须
window 矢量
initblck.c
W0..W7 使用,不恢复 W8..W14 保存,使用,不恢复
已经存在,且其元素的数目应为 numElems
DO REPEAT 指令的使用:
都未使用
程序字 (24 位指令):
参阅 pic30_tools\src\dsp 目录下的 “readme.txt”。
周期数 (包括 C 函数的调用和返回开销):
参阅 pic30_tools\src\dsp 目录下的 “readme.txt”。
2005 Microchip Technology Inc. DS51456B_CN 27
dsPIC® 语言工具库
HammingInit
描述:
头文件: 函数原型:
参数:
返回值: 指向被初始化窗的基地址的指针。 说明: 源文件: 资源使用情况: 系统资源的使用:
HammingInit 函数初始化一个长度为 numElems 的海明(Hamming) 窗。
dsp.h
extern fractional* HammingInit ( int numElems, fractional* window );
numElems 窗中元素的数目 window 指向要被初始化的窗的指针
必须
window 矢量
inithamm.c
W0..W7 使用,不恢复 W8..W14 保存,使用,不恢复
DO REPEAT 指令的使用:
都未使用
程序字 (24 位指令):
参阅 pic30_tools\src\dsp 目录下的 “readme.txt”。
已经存在,且其元素的数目应为 numElems
周期数 (包括 C 函数的调用和返回开销):
参阅 pic30_tools\src\dsp 目录下的 “readme.txt”。
HanningInit
描述:
头文件: 函数原型:
参数:
返回值: 指向被初始化窗的基地址的指针。 说明: 源文件: 资源使用情况: 系统资源的使用:
HanningInit 函数初始化一个长度为 numElems 的汉宁 (Hanning 窗。
dsp.h
extern fractional* HanningInit ( int numElems, fractional* window );
numElems 窗中元素的数目 window 指向要被初始化的窗的指针
必须
window 矢量
inithann.c
W0..W7 使用,不恢复 W8..W14 保存,使用,不恢复
DO REPEAT 指令的使用:
都未使用
已经存在,且其元素数目应为 numElems
程序字 (24 位指令):
参阅 pic30_tools\src\dsp 目录下的 “readme.txt”。
周期数 (包括 C 函数的调用和返回开销):
参阅 pic30_tools\src\dsp 目录下的 “readme.txt”。
DS51456B_CN 28 2005 Microchip Technology Inc.
KaiserInit
描述:
头文件: 函数原型:
参数:
返回值: 指向被初始化窗的基地址的指针。 说明: 源文件: 资源使用情况: 系统资源的使用:
KaiserInit 函数初始化一个形状由参数 betaVal 定义,长度为
numElems 的凯撒 (Kaiser)窗。
dsp.h
extern fractional* KaiserInit (
int numElems,
fractional* window,
float betaVal
);
numElems 窗中元素的数目
window 指向要被初始化的窗的指针
betaVal 窗形状参数
必须
window 矢量
initkais.c
W0..W7 使用,不恢复 W8..W14 保存,使用,不恢复
DO REPEAT 指令的使用:
都未使用
已经存在,且其元素的数目应为 numElems
DSP 函数库
程序字 (24 位指令):
参阅 pic30_tools\src\dsp 目录下的 “readme.txt”。
周期数 (包括 C 函数的调用和返回开销):
参阅 pic30_tools\src\dsp 目录下的 “readme.txt”。
VectorWindow
描述:
头文件: 函数原型:
参数:
返回值: 目标矢量基地址的指针。 说明:
源文件:
VectorWindow 函数对给定的源矢量进行加窗操作,并将加窗后的矢
量存放到目标矢量中。
dsp.h
extern fractional* VectorWindow (
int numElems,
fractional* dstV,
fractional* srcV,
fractional* window
);
numElems 源矢量元素的数目
dstV 指向目标矢量的指针
srcV 指向源矢量的指针
window 指向被初始化窗的指针
必须
window 矢量
该函数可以 “原址”计算。
该函数可以对源矢量和其本身进行计算。
该函数用到 VectorMultiply 函数。
dowindow.asm
已经存在,且其元素的数目应为 numElems
2005 Microchip Technology Inc. DS51456B_CN 29
dsPIC® 语言工具库
VectorWindow (续)
资源使用情况: 系统资源的使用:
VectorMultiply 函数使用的资源
DO REPEAT 指令的使用:
DO 指令 无 REPEAT 指令, VectorMultiply 函数使用的 DO/REPEAT 指令。
程序字 (24 位指令):
3 加上 VectorMultiply 函数的程序字。
周期数 (包括 C 函数的调用和返回开销):
9 加上 VectorMultiply 函数的周期数。
注:VectorMultiply 的描述中,周期数包括 C 函数调用开销的 3 个周期。因此, VectorWindow 函数中因 VectorMultiply 函数增 加的实际周期数比单独的 VectorMultiply 函数所用的周期数少 3 个 周期。
DS51456B_CN 30 2005 Microchip Technology Inc.

2.5 矩阵函数

DSP 函数库
这一节将讲述 DSP 函数库中的小数矩阵的概念,并描述进行矩阵运算的各个函数。
2.5.1 小数矩阵运算
小数矩阵是由矩阵元素及相应的元素编号组成的集合,按照地址连续地分配在存储器 中,第一个元素存放到最低的存储器地址。用存储器的一个字 (2 个字节)来存储每 个元素的值,这个量必须解释为用 “1.15”数据格式表示的小数。
指向矩阵第一个元素的指针可用作访问每个矩阵值的句柄。矩阵第一个元素的地址称 为矩阵的基地址。因为每个矩阵元素都是 16 位的,基地址
二阶矩阵的元素是按照行主序存储在存储器中的。因此,存储到存储器中的第一个值 是第一行的第一个元素,后面是第一行的其他元素。接着是第二行的元素,依此类推, 直至分配好存储器的所有行。采用这种方式,对于一个基地址为 BA,共 r c 列的矩 阵,其第 r 行、 c 列的元素地址为:
BA + 2(C(r-1) + c-1),其中 1 r R1 c C
注:使用系数 2 是由于 dsPIC30F 的字节寻址能力。 DSP 函数库实现了一元和二元的小数矩阵运算。一元运算中的操作数矩阵称为源矩
阵,而二元运算中的第一个操作数称为第一源矩阵,第二个操作数称为第二源矩阵。 每个运算对源矩阵的一个或几个元素进行计算。运算的结果为矩阵,称为目标矩阵。
某些小数矩阵运算允许 “原址”计算。即运算的结果被存放回源矩阵中 (或者是二元 运算中的第一源矩阵)。在这种情况下,目标矩阵被认为 (在物理上)替代了 (第 一)源矩阵。如果一个运算可以 “原址”计算,那么下文中函数描述的 “说明”中会 指出这一点。
对于某些二元运算,两个操作数 (在物理上)可以是同一个源矩阵,这表明是对源矩 阵和其本身进行运算。如果一个给定的运算可以进行这种类型的计算,那么下文中函 数描述的 “说明”中会指出这一点。
某些运算可以对源矢量和其本身进行计算,且可以 “原址”计算。
必须
对齐到偶数地址。
2005 Microchip Technology Inc. DS51456B_CN 31
dsPIC® 语言工具库
本函数库中的所有小数矩阵运算都将操作数矩阵的行数和列数作为参数。基于这些参 数的值,作了以下的假设:
a) 特定操作中涉及到的所有矩阵的总的大小必须在目标器件的可用数据存储空间范
围内。
b) 对于二元运算,操作数矩阵的行数和列数
的加减运算,两个矩阵必须具有相同的行数和列数;而对于矩阵的乘法运算,第 一个操作数的列数必须与第二个操作数的行数相同。矩阵求逆运算的源矩阵必须 是方阵 (行数和列数相等),并且是非奇的 (其行列式不等于零)。
c)
目标矩阵
2.5.2 用户需要注意的事项
a) 不对这些函数执行边界检查。阶数超出范围 (包括零行和 / 或零列的矩阵)以及
二元运算中矩阵大小不一致都可能产生预想不到的结果。
b) 在矩阵加减运算中,如果源矩阵中相应元素的运算结果大于 1-2
-1.0,矩阵的加减运算会导致饱和。
c) 在矩阵乘法运算中,如果相应行和列的运算结果大于 1-2
法运算也会导致饱和。
d) 建议在每个函数调用结束后检查状态寄存器 (SR)。尤其是,用户可以在函数
返回后检查 SASB SAB 标志,以判断是否发生了饱和。
e) 所有函数都设计为对分配到默认 RAM 存储空间 (X 数据空间或 Y 数据空间)中
的小数矩阵进行运算。
f) 返回一个目标矩阵的运算可以是嵌套的,例如,如果:
a = Op1 (b, c),且 b = Op2 (d)c = Op3 (e, f),则
必须
足够大以存放运算的结果。
必须
遵从矢量代数规则;即,对于矩阵
-15
或者小于
-15
或小于 -1.0,矩阵乘
a = Op1 (Op2 (d), Op3 (e, f))
2.5.3 附加说明
函数的描述将其范围限制在了这些运算的正常使用范围内。然而,由于这些函数的计 算过程中不进行边界检查,可以根据特定的需要自由地解释运算及其结果。
例如,当计算 MatrixMultiply 函数时,矩阵的阶数不需要满足第一源矩阵为
{
numRows1, numCos1Rows2 },第二源矩阵为 { numCols1Rows2, numCols2 },以及目
标矩阵为 { 以使指针不会超出存储空间范围。
再如,当对阶数为 {
{
numCols, numRows }。因此,恰当地说,
“原址”计算。然而,矩阵转置运算可以对非方阵进行 “原址”计算;需要注意的是
矩阵阶数的隐含变化。
numRows1, numCols2 }。事实上,只要求在计算过程中它们的大小足够大,
numRows, numCols } 的源矩阵进行转置运算后,目标矩阵的阶数为
当源矩阵是方阵时,矩阵转置运算才能
DS51456B_CN 32 2005 Microchip Technology Inc.
另外,可以利用不执行边界检查开发出更多的功能。
2.5.4 各个函数
下面将描述实现矩阵运算的各函数。
MatrixAdd
DSP 函数库
描述:
头文件: 函数原型:
参数:
返回值: 指向目标矩阵基地址的指针。 说明:
源文件: 资源使用情况: 系统资源的使用:
MatrixAdd 函数将第一源矩阵中每个元素的值与第二源矩阵中相应元
素的值相加,并将结果存放在目标矩阵中。
dsp.h
extern fractional* MatrixAdd (
int numRows,
int numCols,
fractional* dstM,
fractional* srcM1,
fractional* srcM2
);
numRows 源矩阵的行数
numCols 源矩阵的列数
dstM 指向目标矩阵的指针
srcM1 指向第一源矩阵的指针
srcM2 指向第二源矩阵的指针
如果 srcM1[r][c]+srcM2[r][c] 的绝对值大于 1-2
致第 (r,c) 个元素饱和。
该函数可以 “原址”计算。
该函数可以对源矢量和其本身进行计算。
madd.asm
W0..W4 使用,不恢复 ACCA 使用,不恢复 CORCON 保存,使用,恢复
-15
,该运算将导
DO REPEAT 指令的使用:
一级 DO 指令 无 REPEAT 指令
程序字 (24 位指令)
14
周期数 (包括 C 函数的调用和返回开销):
20 + 3(numRows*numCols)
2005 Microchip Technology Inc. DS51456B_CN 第 33
dsPIC® 语言工具库
MatrixMultiply
描述:
MatrixMultiply 函数对第一源矩阵和第二源矩阵执行矩阵乘法,并 将结果存放在目标矩阵中。如下式:
dstM i[]j[] srcM1 i[]k[]()srcM2i k[]j[]()
式中:
i < numRows1
0
j < numCols2
0 0
k < numCols1Rows2
头文件: 函数原型
参数:
返回值: 指向目标矩阵基地址的指针。 说明: 如果
源文件: 资源使用情况: 系统资源的使用:
dsp.h
extern fractional* MatrixMultiply ( int numRows1, int numCols1Rows2, int numCols2, fractional* dstM, fractional* srcM1, fractional* srcM2 );
numRows1 第一源矩阵的行数 numCols1Rows2 第一源矩阵的列数,其值
numCols2 第二源矩阵的列数 dstM 指向目标矩阵的指针 srcM1 指向第一源矩阵的指针 srcM2 指向第二源矩阵的指针
srcM1 i[]k[]()srcM2i k[]j[]()
k
的绝对值大于 1-2 如果第一源矩阵为方阵,则该函数可以 “原址”计算,且可以对源矢量 和其本身进行计算。关于这种运算模式的更多信息,可参阅本节开始部 分的 “附加说明”。
mmul.asm
W0..W7 使用,不恢复 W8..W13 保存,使用,恢复 ACCA 使用,不恢复 CORCON 保存,使用,恢复
=
k
数相等
-15
,该运算会导致第 (i,j) 个元素饱和。
必须
与第二源矩阵的行
DO REPEAT 指令的使用:
两级 DO 指令 无 REPEAT 指令
程序字 (24 位指令):
35
周期数 (包括 C 函数的调用和返回开销):
36+numRows1*(8+numCols2*)7+4*numCols1Rows2))
DS51456B_CN 34 2005 Microchip Technology Inc.
MatrixScale
描述:
头文件: 函数原型:
参数:
返回值: 指向目标矩阵基地址的指针。 说明: 该函数可以 “原址”计算。 源文件: 资源使用情况: 系统资源的使用:
MatrixScale 函数用一个定标值对源矩阵中所有元素的值进行换算
(乘以定标值),并将结果存放在目标矩阵中。
dsp.h
extern fractional* MatrixScale (
int numRows,
int numCols,
fractional* dstM,
fractional* srcM,
fractional sclVal
);
numRows 源矩阵的行数
numCols 源矩阵的列数
dstM 指向目标矩阵的指针
srcM 指向源矩阵的指针
sclVal 定标值
mscl.asm
W0..W5 使用,不恢复 ACCA 使用,不恢复 CORCON 保存,使用,恢复
DSP 函数库
DO REPEAT 指令的使用:
一级 DO 指令 无 REPEAT 指令
程序字 (24 位指令):
14
周期数 (包括 C 函数的调用和返回开销):
20 + 3(numRows*numCols)
MatrixSubtract
描述:
头文件: 函数原型:
参数:
返回值: 指向目标矩阵基地址的指针。
MatrixSubtract 函数将第一源矩阵中每个元素的值与第二源矩阵中
对应的元素值相减,并将结果存放在目标矩阵中。
dsp.h
extern fractional* MatrixSubtract (
int numRows,
int numCols,
fractional* dstM,
fractional* srcM1,
fractional* srcM2
);
numRows 源矩阵的行数
numCols 源矩阵的列数
dstM 指向目标矩阵的指针
srcM1 指向第一源矩阵 (被减数)的指针
srcM2 指向第二源矩阵 (减数)的指针
2005 Microchip Technology Inc. DS51456B_CN 35
dsPIC® 语言工具库
MatrixSubtract (续)
说明:
源文件: 资源使用情况 :
如果 srcM1[r][c]-srcM2[r][c] 结果的绝对值大于 1-2 会导致 (r,c) 个元素饱和。
该函数可以 “原址”计算。 该函数可以对源矢量和其本身进行计算。
msub.asm
系统资源的使用:
W0..W4 使用,不恢复 ACCA 使用,不恢复 ACCB 使用,不恢复 CORCON 保存,使用,恢复
DO REPEAT 指令的使用:
一级 DO 指令 无 REPEAT 指令
程序字 (24 位指令):
15
周期数 (包括 C 函数的调用和返回开销):
20 + 4(numRows*numCols)
-15
,该运算
MatrixTranspose
描述:
头文件: 函数原型:
参数:
返回值: 指向目标矩阵基地址的指针 说明: 如果源矩阵是方阵,该函数可以 “原址”计算。关于这种运算模式的更
源文件: 资源使用情况: 系统资源的使用:
MatrixTranspose 函数对源矩阵的行和列进行转置,并将结果存放在 目标矩阵中。运算结果: dstM[i][j] = srcM[j][i],
i < numRows0 j < numCols
0
dsp.h
extern fractional* MatrixTranspose ( int numRows, int numCols, fractional* dstM, fractional* srcM );
numRows 源矩阵的行数 numCols 源矩阵的列数 dstM 指向目标矩阵的指针 srcM 指向源矩阵的指针
多信息,可参阅本节开始部分的 “附加说明”。
mtrp.asm
W0..W5 使用,不恢复
DO REPEAT 指令的使用:
两级 DO 指令 无 REPEAT 指令
程序字 (24 位指令):
14
周期数 (包括 C 函数的调用和返回开销):
16 + numCols*(6 + (numRows-1)*3)
DS51456B_CN 36 2005 Microchip Technology Inc.
2.5.5 矩阵求逆
DSP 函数库
对一个非奇的小数方阵求逆的结果也是一个方阵 (阶数相同),其元素值没必要限制 在离散的小数集合 { -1,……, 1-2
-15
} 内。因此,对于小数矩阵,没有提供矩阵求逆
运算。 然而,因为矩阵求逆是非常有用的运算, DSP 函数库中提供了基于浮点型数字表示与
算法的实现。如下所述。
MatrixInvert
描述:
头文件: 函数原型:
参数:
返回值: 指向目标矩阵基地址的指针,当源矩阵为奇矩阵时为 NULL。 说明:
源文件: 资源使用情况: 系统资源的使用:
MatrixInvert 函数对源矩阵进行求逆计算,并将结果存放在目标矩
阵中。
dsp.h
extern float* MatrixInvert (
int numRowsCols,
float* dstM,
float* srcM,
float* pivotFlag,
int* swappedRows,
int* swappedCols
);
numRowCols 源 (方)矩阵的行数和列数
dstM 指向目标矩阵的指针
srcM 指向源矩阵的指针
内部使用必需的参数:
pivotFlag 指向长度为 numRowsCols 的矢量的指针
swappedRows 指向长度为 numRowsCols 的矢量的指针
swappedCols 指向长度为 numRowsCols 的矢量的指针
尽管矢量 pivotFlagswappedRows swappedCols 只在内部使
用,它们需要在调用该函数之前进行分配。
如果源矩阵为奇矩阵 (行列式等于零),矩阵不能进行求逆。这种情况
下,函数返回 NULL
该函数可以 “原址”计算。
minv.asm (由 C 代码汇编的)
W0..W7 使用,不恢复 W8, W14 保存,使用,恢复
DO REPEAT 指令的使用:
都未使用
程序字 (24 位指令):
参阅 pic30_tools\src\dsp 目录下的 “readme.txt”。
周期数 (包括 C 函数的调用和返回开销):
参阅 pic30_tools\src\dsp 目录下的 “readme.txt”。
2005 Microchip Technology Inc. DS51456B_CN 37
dsPIC® 语言工具库

2.6 滤波函数

本节将讲述 DSP 函数库中小数滤波器的概念,并介绍执行滤波运算的各个函数。
2.6.1 小数滤波器运算
对小数矢量 x[n] 0 n < N)表示的数据序列进行滤波运算等价于求解下面的差分方 程:
P1
yn[] ap[]–()yn p[]()
+ bm[]()xn m[]()
p1=
对于每第 n 个样本,其结果都是经滤波的数据序列 y[n]。这样,小数滤波器就可以用 称为滤波器系数集的小数矢量 a[p] 0 p < P)和 b[m] (0 ≤ m < M)来表示,它们 设计为在输入数据序列表示的信号中引起一些预先指定的变化。
当进行滤波运算时,了解和管理输入和输出数据序列 (x[n] -M+1 ≤ n < 0,和 y[n]
-P+1 n < 0)的历史记录非常重要,这些历史记录提供了滤波运算的初始条件。而 且,当对输入数据序列中连续的数据段重复应用滤波器时,必须记住最后一次滤波运 算(x[n], N-M+1 ≤ n < N-1, 和 y[n], N-P+1 ≤ n < N-1)的最终状态。在下一次级 滤波的计算中将要考虑到这个最终状态。要进行正确的滤波运算,必须考虑到历史记 录和当前状态。
对滤波运算的历史记录和当前状态的管理通常是通过附加序列 (同样是小数矢量)来 实现的,它们称为滤波器的延迟线。在应用滤波器运算之前,延迟记述滤波器的历史 记录。当完成滤波运算后,延迟包含最新的滤波数据样本集合以及最新的输出数据。
(注:为确保特定滤波器实现的正确运算,建议通过调用相应的初始化函数将延迟值初
始化为零。) 在 DSP 函数库提供的滤波器实现中,输入数据序列称为源样本序列,而滤波运算所得
的序列称为目标序列。在建立一个滤波器结构时,通常要考虑系数 (ab) 和延迟。在 所有的滤波器实现中,输入和输出数据样本可分配到默认的 RAM 存储空间 (X 数据 空间或 Y 数据空间)中。滤波器系数可以存放在 X 数据存储空间或程序存储器中,而 滤波器延迟的值必须
M1
=
m0=
通过 Y 数据进行访问。
2.6.2 FIR IIR 滤波器实现
滤波器的特性取决于它的系数值分布。特别要注意滤波器有两种重要的类型:有限冲 激响应 (Finite Impulse Response FIR)滤波器,当 1 m < M 时,其 a[m] = 0 ; 和无限冲激响应 (Infinite Impulse ResponseIIR)滤波器,其 a[0] 0,且当 m
{ 1, ……, M } 范围内, a[m] ≠ 0。考虑到滤波器运算对输入数据序列的影响, FIR 和 IIR 滤波器系列内部还有其他分类。
此外,尽管滤波运算是对上述差分方程进行求解,还提供了一些比直接求解差分方程 更有效的一些实现。另外,另外一些实现设计为在小数算法的限制下执行滤波运算。
所有这些考虑使得滤波运算函数范围很广, DSP 函数库也提供了一部分这样的函数。
DS51456B_CN 38 2005 Microchip Technology Inc.
DSP 函数库
2.6.3 单样本滤波
DSP 函数库提供的滤波函数设计为进行块处理。每个滤波函数都接受一个名为
numSamps 的参数,它表示要运算的输入数据的字数 (块的大小)。如果是单样本滤 波器,应将 numSamps 置为 1。这样将对一个输入样本进行滤波运算,而函数将计算 滤波器的单个输出样本。
2.6.4 用户需要注意的事项
本库中的所有小数滤波运算都依赖于输入参数或数据结构成员的值,这些值指定要处 理的样本数以及系数和延迟矢量的大小。基于这些值,作了以下假设:
a) 某个运算中涉及的所有矢量 (样本序列)的总的大小是有限的,该限制取决于
当前所选用芯片的数据存储器 (RAM)的大小。
b) 目标矢量 c) 不对这些函数执行边界检查。超出范围 (包括零长度矢量)以及源矢量和系数
集使用的不一致都会产生预想不到的结果。
d) 建议在每个函数调用结束后检查状态寄存器 (SR)。尤其是,用户可以在函数
返回后检查 SASB SAB 标志,以判断是否发生了饱和。
e) 返回一个目标矢量的运算可以是嵌套的,例如,如果:
a = Op1 (b, c),且 b = Op2 (d)c = Op3 (e, f),则
a = Op1 (Op2 (d), Op3 (e, f))
必须
足够大以保存运算的结果。
2005 Microchip Technology Inc. DS51456B_CN 39
dsPIC® 语言工具库
2.6.5 各个函数
下面将讲述实现滤波运算的各函数。关于数字滤波器的更多论述,请参阅 Alan Oppenheim Ronald Schafer Discrete-Time Signal ProcessingPrentice Hall 1989。关于最小均方 FIR 滤波器的实现细节,请参阅 T. H sia Convergence Analy-
sis of LMS and NLMS Adaptive AlgorithmsProc. ICASSPpp. 667-6701983,以Sangil Park Garth Hillman On Acoustic-Echo Cancellation Implementation with Multiple Cascadable Adaptive FIR Filter ChipsProc. ICASSP1989
FIRStruct
结构: 头文件: 描述:
参数:
说明: 缓冲区中的系数数目为 M
FIRStruct 函数描述任何 FIR 滤波器的结构。
dsp.h
typedef struct { int numCoeffs; fractional* coeffsBase; fractional* coeffsEnd; int coeffsPage; fractional* delayBase; fractional* delayEnd; fractional* delay; } FIRStruct;
numCoeffs 滤波器中系数的数目 (也可为 M coeffsBase 滤波器系数的基地址 (也可为 h coeffsEnd 滤波器系数的末地址 coeffsPage 系数缓冲区的页号 delayBase 延迟缓冲区的基地址 delayEnd 延迟缓冲区的末地址 delay 延迟指针的当前值 (也可为 d
系数 h[m]0 m < M 中,可存储在 X 数据空间或程序存储器中。 延迟缓冲区 d[m]0 m < M, 如果系数存储在 X 数据空间中, coeffsBase 指向系数分配的实际地
址。如果系数存储在程序存储器中, coeffsBase 为包含系数的程序 页边界与系数在该页中分配的地址之间的偏移量。这个偏移量值可以通 过使用行内汇编操作符 psvoffset() 计算出来。
coeffsEnd 为滤波器系数缓冲区最后一个字节在 X 数据空间中的地址
(如果是程序存储器,则为偏移量)
如果系数是存放在 X 数据空间数据存储器中, coeffsPage 必须被置 为 0xFF00 (定义值 COEFFS_IN_DATA)。如果系数是存放在程序存储 器中,则为包含系数的程序页号。后面这个值可通过使用行内汇编操作 符 psvpage() 计算出来。
delayBase 指向延迟缓冲区分配的实际地址。 delayEnd 为滤波器延迟缓冲区的最后一个字节的地址。
可存储在 Y 数据空间中。
DS51456B_CN 40 2005 Microchip Technology Inc.
FIRStruct (续)
FIR
DSP 函数库
当系数和延迟缓冲区作为循环递增模缓冲区时, coeffsBase
必须
delayBase
都是奇数地址)。这些缓冲区是否作为循环增递增模缓冲区,会在每个
FIR 滤波器函数描述中的 “说明”部分中指出。
当系数和延迟缓冲区不作为循环递增模缓冲区时, coeffsBase
delayBase 不需要对齐到两个地址的 “0”幂,而在特定的 FIR 滤波器
函数实现中, coeffsEnd delayEnd 的值将被忽略。
对齐到两个地址的“0”幂 (oeffsEnddelayEnd
描述:
头文件: 函数原型:
参数:
返回值: 指向目标样本基地址的指针。 说明:
源文件:
FIR 函数对源样本序列应用 FIR滤波器,将结果存放在目标样本序列中,
并更新延迟值。
dsp.h
extern fractional* FIR (
int numSamps,
fractional* dstSamps,
fractional* srcSamps,
FIRStruct* filter
);
numSamps 滤波器的输入样本数 (也可为 N
dstSamps 指向目标样本的指针 (也可为 y
srcSamps 指向源样本的指针 (也可为 x
filter FIRStruct 滤波器结构的指针
滤波器中系数的数目为 M
系数 h[m] (定义在 0 m < M 范围内),作为循环递增模缓冲区。
延迟 d[m] (定义在 0 m < M 范围内),作为循环递增模缓冲区。
源样本 x[n] 定义在 0 n < N 范围内。
目标样本 y[n] 定义在 0 n < N 范围内。
(参见 FIRStructFIRStructInit FIRDelayIni。)
fir.asm
2005 Microchip Technology Inc. DS51456B_CN 41
dsPIC® 语言工具库
FIR (续)
资源使用情况: 系统资源的使用:
W0..W6 使用,不恢复 W8, W10 保存,使用,恢复 ACCA 使用,不恢复 CORCON 保存,使用,恢复 MODCON 保存,使用,恢复 XMODSTRT 保存,使用,恢复 XMODEND 保存,使用,恢复 YMODSTRT 保存,使用,恢复 PSVPAG 保存,使用,恢复(仅当系数在程序存储器中
时)
DO REPEAT 指令的使用:
一级 DO 指令 一级 REPEAT 指令
程序字 (24 位指令):
55
周期数 (包括 C 函数的调用和返回开销):
53 + N(4+M), 或当系数在程序存储器中,为 56 + N(8+M)。
FIRDecimate
描述:
头文件: 函数原型:
参数:
返回值: 指向目标样本基地址的指针。 说明: 滤波器中系数的数目为 M,而 M R 的整数倍。
源文件:
FIRDecimate 函数以 1/R 的比率从源样本序列中抽取样本,或者以系R 对信号降采样。实际上, y[n] = x[Rn]
为了减小混叠的影响,要先对源样本进行滤波,然后降采样。抽取结果 存放在目标样本序列中,并更新延迟的值。
dsp.h
extern fractional* FIRDecimate ( int numSamps, fractional* dstSamps, fractional* srcSamps, FIRStruct* filter, int rate );
输出
numSamps dstSamp 指向目标样本的指针 (也可为 y) srcSamps 指向源样本的指针 (也可为 x) filter 指向 FIRStruct 滤波器结构的指针 rate 抽取比率 (降采样系数,也可为 R)
系数 h[m] (定义在 0 m < M 范围内),不作为循环递增模缓冲区。 延迟 d[m] (定义在 0 m < M 范围内),不作为循环递增模缓冲区。 源样本 x[n],定义在 0 n < NR 范围内。 目标样本 y[n],定义在 0 n < N 范围内。
(参见 FIRStruct、 FIRStructInit FIRDelayInit。)
firdecim.asm
样本的数目 (也可为 NN = Rpp 为整数)
DS51456B_CN 42 2005 Microchip Technology Inc.
FIRDecimate (续)
DSP 函数库
资源使用情况: 系统资源的使用:
W0..W7 使用,不恢复 W8..W12 保存,使用,恢复 ACCA 使用,不恢复 CORCON 保存,使用,恢复 PSVPAG 保存,使用,恢复 (仅当系数在程序存储器中
DO REPEAT 指令的使用:
一级 DO 指令 一级 REPEAT 指令
程序字 (24 位指令):
48
周期数 (包括 C 函数的调用和返回开销):
45 + N(10 + 2M), 或者,当系数在程序存储器中,为 48 + N(13 + 2M)。
FIRDelayInit
描述:
头文件: 函数原型:
参数: 说明:
源文件: 资源使用情况: 系统资源的使用:
FIRDelayInit 函数将 FIRStruct 滤波器结构中的延迟值初始化为
零。
dsp.h
extern void FIRDelayInit (
FIRStruct* filter
);
filter 指向 FIRStruct 滤波器结构的指针。
参阅上面关于 FIRStruct 结构的描述。
注:FIR 插值器的延迟由函数 FIRInterpDelayInit 初始化。
firdelay.asm
W0..W2 使用,不恢复
时)
DO REPEAT 指令的使用:
DO 指令 一级 REPEAT 指令
程序字 (24 位指令):
7
周期数 (包括 C 函数的调用和返回开销):
11 + M
2005 Microchip Technology Inc. DS51456B_CN 第 43
dsPIC® 语言工具库
FIRInterpolate
描述:
头文件: 函数原型:
参数:
返回值: 指向目标样本基地址的指针。 说明:
源文件: 资源使用情况: 系统资源的使用:
FIRInterpolate 函数以 1:R 比率在源样本序列中插入样本,或者以系R 对信号进行过采样。实际上, y[n] = x[n/R]
为了减小信号混叠的影响,要先对源样本进行过采样,然后滤波。结果 存放在目标样本序列中,并更新延迟的值。
dsp.h
extern fractional* FIRInterpolate ( int numSamps, fractional* dstSamps, fractional* srcSamps, FIRStruct* filter, int rate );
numSamps 输入样本的数目 (也可为 NN = Rpp 为整数) dstSamps 指向目标样本的指针 (也可为 y srcSamps 指向源样本的指针 (也可为 x filter FIRStruct 指向滤波器结构的指针 rate 插值的比率 (过采样系数,也可为 R
滤波器中系数的数目为 M,而 M R 的整数倍。 系数 h[m] (定义在 0 m < M 范围内),不作为循环递增模缓冲区。 延迟 d[m] (定义在 0 m < M/R 范围内),不作为循环递增模缓冲区。 源样本 x[n],定义在 0 n < N 范围内。 目标样本 y[n],定义在 0 n < NR 范围内。
(参见 FIRStructFIRStructInit FIRInterpDelayInit。)
firinter.asm
W0..W7 使用,不恢复 W8..W13 保存,使用,恢复 ACCA 使用,不恢复 CORCON 保存,使用,恢复 PSVPAG 保存,使用,恢复 (仅当系数在程序存储器中
时)
DO REPEAT 指令的使用:
两级 DO 指令 一级 REPEAT 指令
程序字 (24 位指令):
63
周期数 (包括 C 函数的调用和返回开销):
45 + 6(M/R) + N(14 + M/R + 3M + 5R),
或者,当系数在程序存储器中,为
48 + 6(M/R) + N(14 + M/R + 4M + 5R)
DS51456B_CN 44 2005 Microchip Technology Inc.
DSP 函数库
FIRInterpDelayInit
描述:
头文件: 函数原型:
参数:
说明: 延迟 d[m],定义在 0 m < M/R 范围内,其中 M 为插值器中滤波器系
源文件: 资源使用情况: 系统资源的使用:
FIRInterpDelayInit函数将FIRStruct滤波器结构中的延迟值初始
化为零,优化供 FIR 插值滤波器使用。
dsp.h
extern void FIRDelayInit (
FIRStruct* filter,
int rate
);
filter 指向 FIRStruct 滤波器结构的指针
rate 插值的比率 (过采样系数,也可为 R
数的数目。
参阅上面关于 FIRStruct 结构的描述。
firintdl.asm
W0..W4 使用,不恢复
DO REPEAT 指令的使用:
DO 指令 一级 REPEAT 指令
程序字 (24 位指令):
13
周期数 (包括 C 函数的调用和返回开销):
10 + 7M/R
FIRLattice
描述:
头文件: 函数原型:
参数:
返回值: 指向目标样本基地址的指针。 说明: 滤波器中的系数数目为 M
源文件:
FIRLattice 函数使用格型 (Lattice)结构实现对源样本序列应用 FIR
滤波器,接着将结果存放在目标样本序列中,并更新延迟值。
dsp.h
extern fractional* FIRLattice (
int numSamps,
fractional* dstSamps,
fractional* srcSamps,
FIRStruct* filter
);
numSamps 滤波器输入样本的数目 (也可为 N
dstSamps 指向目标样本的指针 (也可为 y
srcSamps 指向源样本的指针 (也可为 x
filter 指向 FIRStruct 滤波器结构的指针
格型滤波器系数 k[m] (定义在 0 m < M 范围内),不作为循环递增
模缓冲区。
延迟 d[m] (定义在 0 m < M 范围内),不作为循环递增模缓冲区。
源样本 x[n],定义在 0 n < N 范围内。
目标样本 y[n],定义在 0 n < N 范围内。
(参见 FIRStructFIRStructInit FIRDelayInit。)
firlatt.asm
2005 Microchip Technology Inc. DS51456B_CN 45
dsPIC® 语言工具库
FIRLattice (续)
资源使用情况: 系统资源的使用:
W0..W7 使用,不恢复 W8..W12 保存,使用,恢复 ACCA 使用,不恢复 ACCB 使用,不恢复 CORCON 保存,使用,恢复 PSVPAG 保存,使用,恢复 (仅当系数在程序存储器中
时)
DO REPEAT 指令的使用:
两级 DO 指令 无 REPEAT 指令
程序字 (24 位指令):
50
周期数 (包括 C 函数的调用和返回开销):
41 + N(4 + 7M), 当系数在程序存储器中,为 44 + N(4 + 8M) 。
FIRLMS
描述:
头文件: 函数原型:
参数:
返回值: 指向目标样本基地址的指针。
FIRLMS 函数对源样本序列应用自适应 FIR 滤波器,将结果存放在目标 样本序列中,并更新延迟值。
针对每个样本,使用最小均方算法,对参考样本进行处理,同时滤波器 的系数也被更新。
dsp.h
extern fractional* FIRLMS ( int numSamps, fractional* dstSamps, fractional* srcSamps, FIRStruct* filter, fractional* refSamps, fractional muVal );
numSamps 输入样本的数目 (也可为 N dstSamps 指向目标样本的指针 (也可为 y srcSamps 指向源样本的指针 (也可为 x filter 指向 FIRStruct 滤波器结构的指针 refSamps 指向参考样本的指针 (也可为 r muVal 自适应系数 (也可为 mu
DS51456B_CN 46 2005 Microchip Technology Inc.
FIRLMS (续)
说明: 滤波器中的系数数目为 M
系数 h[m] (定义在 0 m < M 范围内),作为循环递增模缓冲区。
延迟 d[m] (定义在 0 m < M-1 范围内),作为循环递增模缓冲区。
源样本 x[n],定义在 0 n < N 范围内。
参考样本 r[n],定义在 0 n < N 范围内。
目标样本 y[n],定义在 0 n < N 范围内。
修改:
h_m[n] = h_m[n-1] + mu*(r[n] - y[n]*x[n-m] 式中, 0 n < N, 0 m < M
当(r[n] - y[n]) 的绝对值大于或等于 1,该运算会导致饱和。
不能
滤波器系数
修改。如果检测到滤波器系数存放在程序存储器中,函数会返回
NULL
(参见 FIRStructFIRStructInit FIRDelayInit。)
源文件: 资源使用情况: 系统资源的使用:
firlms.asm
W0..W7 使用,不恢复 W8..W12 保存,使用,恢复 ACCA 使用,不恢复 ACCB 使用,不恢复 CORCON 保存,使用,恢复 MODCON 保存,使用,恢复 XMODSTRT 保存,使用,恢复 XMODEND 保存,使用,恢复 YMODSTRT 保存,使用,恢复
存放在程序存储器中,因为在这种情况下,其值不能被
DSP 函数库
FIRLMSNorm
描述:
头文件: 函数原型:
DO REPEAT 指令的使用:
两级 DO 指令 一级 REPEAT 指令
程序字 (24 位指令):
76
周期数 (包括 C 函数的调用和返回开销):
61 + N(13 + 5M)
FIRLMSNorm 函数对源样本序列应用自适应 FIR 滤波器,将结果存放在
目标样本序列中,并更新延迟值。
针对每个样本,使用最小均方算法,对参考样本进行处理,同时滤波器
的系数也被更新。
dsp.h
extern fractional* FIRLMSNorm (
int numSamps,
fractional* dstSamps,
fractional* srcSamps,
FIRStruct* filter,
fractional* refSamps,
fractional muVal,
fractional* energyEstimate
);
2005 Microchip Technology Inc. DS51456B_CN 47
dsPIC® 语言工具库
FIRLMSNorm (续)
参数:
返回值: 指向目标样本基地址的指针。 说明: 滤波器中系数的数目为 M
源文件:
numSamps 输入样本的数目 (也可为 N dstSamps 指向目标样本的指针 (也可为 y srcSamps 指向源样本的指针 (也可为 x filter 指向 FIRStruct 滤波器结构的指针 refSamps 参考样本的指针 (也可为 r muVal 自适应参数 (也可为 mu energyEstimate 最后M 个输入信号样本的估计能量值,其中M
滤波器系数的数目。
系数 h[m] (定义在 0 m < M 范围内),作为循环递增模缓冲区。 延迟 d[m] (定义在 0 m < M 范围内),作为循环递增模缓冲区。 源样本 x[n],定义在 0 n < N 范围内。 参考样本 r[n],定义在 0 n < N 范围内。 目标样本 y[n],定义在 0 n < N 范围内。 修改:
h_m[n] = h_m[n-1] + nu[n]*(r[n] - y[n]*x[n-m]
n < N, 0 m < M
0 其中 nu[n] = mu/(mu+E[n]), E[n]=E[n-1]+(x[n])
再该函数的开头, energyEstimate 应被初始化为 E[ -1 ] 的值 (当第 一次调用该滤波器时为零)。返回时, energyEstimate 被更新为 E[N-1] 的值 (如果对扩展的输入信号进行滤波,该值可作为下一次函数 调用的初始值)。 当(r[n] - y[n]) 的绝对值大于或等于 1 时,该运算会导致饱和。 注: 能量估计值另外的另外一个表达式为: E[n] = (x[n]
因此,为了避免在估计值计算中出现饱和,输入样本值应该受到限制, 依下式:
M 2+
m0=
滤波器系数不能存放到程序存储器中,因为在这种情况下,它们的值不 能被修改。如果检测到滤波器系数存放在程序存储器中,函数会返回 NULL
(参见 FIRStructFIRStructInitFIRDelayInit。)
firlmsn.asm
2
+ (x[n-1)2 + ... + (x[n-M+2])2。
xn m+[]()
2
-(x[n-M+1])2 为输入信号能量的估计值。
2
1<
0
n < N
DS51456B_CN 48 2005 Microchip Technology Inc.
FIRLMSNorm (续)
资源使用情况: 系统资源的使用:
W0..W7 使用,不恢复 W8..W13 保存,使用,恢复 ACCA 使用,不恢复 ACCB 使用,不恢复 CORCON 保存,使用,恢复 MODCON 保存,使用,恢复 XMODSTRT 保存,使用,恢复 XMODEND 保存,使用,恢复 YMODSTRT 保存,使用,恢复
DO REPEAT 指令的使用:
两级 DO 指令 一级 REPEAT 指令
程序字 (24 位指令):
91
周期数 (包括 C 函数的调用和返回开销):
66 + N(49 + 5M)
DSP 函数库
FIRStructInit
描述:
头文件: 函数原型:
参数:
说明:
源文件: 资源使用情况: 系统资源的使用:
FIRStructInit 函数的功能是:对 FIR 滤波器结构 FIRStruct 中参数
的值进行初始化 。
dsp.h
extern void FIRStructInit (
FIRStruct* filter,
int numCoeffs,
fractional* coeffsBase,
int coeffsPage,
fractional* delayBase
);
filter 指向 FIRStruct 滤波器结构的指针
numCoeffs 滤波器中系数的数目 (也可为 M
coeffsBase 滤波器系数的基地址 (也可为 h
coeffsPage 系数缓冲区的页号
delayBase 延迟缓冲区的基地址
参见上面关于 FIRStruct 结构的描述。
函数结束时, FIRStructInit 相应地初始化 coeffsEnd
delayEnd 指针。而且, delay 设置为等于 delayBase
firinit.asm
W0..W5 使用,不恢复
DO REPEAT 指令的使用:
DO 指令 无 REPEAT 指令
程序字 (24 位指令):
10
周期数 (包括 C 函数的调用和返回开销):
19
2005 Microchip Technology Inc. DS51456B_CN 第 49
dsPIC® 语言工具库
IIRCanonic
描述:
头文件: 函数原型:
参数: 滤波器结构:
IIRCanonic 函数对源样本序列应用正准型 (直接型 II)的二阶节级联 IIR 滤波器,将结果存放在目标样本序列中,并更新延迟值。
dsp.h
typedef struct { int numSectionsLess1; fractional* coeffsBase; int coeffsPage; fractional* delayBase; int initialGain; int finalShift; } IIRCanonicStruct;
extern fractional* IIRCanonic ( int numSamps, fractional* dstSamps, fractional* srcSamps, IIRCanonicStruct* filter );
numSectionsLess1 级联的二阶节数减去 1 (可以为 S 1 coeffsBase 指向X数据空间或程序存储器中滤波器系数的
指针 (也可为 { a, b }
coeffsPage 系数缓冲区的页号,或者当系数在数据存储
空间时,为 0xFF00 (定义的值 COEFFS_IN_DATA
只能
delayBase 指向滤波器延迟的指针 (也可为 d),
Y 数据空间
initialGain 初始增益值 finalShift 输出定标 (左移)
滤波器的描述:
numSamps 滤波器输入样本的数目 (也可为 N dstSamps 指向目标样本的指针 (也可为 y srcSamps 指向源样本的指针 (也可为 x filter 指向 IIRCanonicStruct 滤波器结构的指针
返回值: 指向目标样本基地址的指针。 说明:
源文件:
每二阶节有 5 个系数,排列为有序集合 {a2[s], a1[s], b2[s], b1[s], b0[s]}0 ≤ s < S。利用 Momentum Data Systems 公司的 dsPICFD 滤波 器设计包或相似工具算出系数值。 延迟由每节的滤波器状态的两个字 ({d1[s], d2[s]}0 s < S)组成。
源样本 x[n],定义在 0 n < N 范围内。 目标样本 y[n],定义在 0 n < N 范围内。
进入
初始增益值在 在将结果存放到输出序列中之前,对滤波器结构的输出进行移位进行输
出定标。这用于将滤波器的增益恢复为 0 dB。移位计数可以为 0 ;如果 不为 0,它表示移位的位数:负数表示左移,正数表示右移。
iircan.asm
滤波器结构前应用于每个输入样本。
DS51456B_CN 50 2005 Microchip Technology Inc.
IIRCanonic (续)
资源使用情况: 系统资源的使用:
W0..W7 使用,不恢复 W8..W11 保存,使用,恢复 ACCA 使用,不恢复 CORCON 保存,使用,恢复 PSVPAG 保存,使用,恢复
DO REPEAT 指令的使用:
两级 DO 指令 一级 REPEAT 指令
程序字 (24 位指令):
42
周期数 (包括 C 函数的调用和返回开销):
36 + N(8 + 7S), 或者,当系数在程序存储器中,为 39 + N(9 + 12S)。
IIRCanonicInit
描述:
头文件: 函数原型:
参数: 滤波器结构:
IIRCanonicInit函数将 IIRCanonicStruct 滤波器结构中的延迟值
初始化为零。
dsp.h
extern void IIRCanonicInit (
IIRCanonicStruct* filter
);
(参见 IIRCanonic 函数的描述。)
DSP 函数库
初始化描述:
filter 指向 IIRCanonicStruct 滤波器结构的指针。
说明: 源文件: 资源使用情况: 系统资源的使用:
每二阶节的滤波器状态的两个字 ({d1[s], d2[s]}0
iircan.asm
W0W1 使用,不恢复
DO REPEAT 指令的使用:
一级 DO 指令 无 REPEAT 指令
程序字 (24 位指令):
7
周期数 (包括 C 函数的调用和返回开销):
10 + S2
s < S)。
2005 Microchip Technology Inc. DS51456B_CN 51
dsPIC® 语言工具库
IIRLattice
描述:
头文件: 函数原型:
参数: 滤波器结构:
IIRLattice 函数的功能是:使用格型结构 (Lattice) 对源样本序列进IIR 滤波,将结果存放在目标样本序列中,并更新延迟值。
dsp.h
typedef struct { int order; fractional* kappaVals; fractional* gammaVals; int coeffsPage; fractional* delay; } IIRLatticeStruct;
extern fractional* IIRLattice ( int numSamps, fractional* dstSamps, fractional* srcSamps, IIRLatticeStruct* filter );
order 滤波器阶次 (也可为 MM N N 参见
FIRLattice
kappaVals X 数据空间或程序存储器中的格型系数的基地址 (也
可为 k
gammaVals X 数据空间或程序存储器中梯度系数的基地址 (也可
g)。如果为 NULL,函数将实现一个全极点滤波 器。
coeffsPage 系数缓冲区的页号,或者当系数在数据存储空间中
时,为 0xFF00 (定义的值 COEFFS_IN_DATA
delay 延迟的基地址 (也可为 d),
存放在 Y 数据空间中
滤波器描述: numSamps 滤波器输入样本的数目(也可为 NN M M 可参
IIRLatticeStruct
dstSamps 指向目标样本的指针 (也可为 y srcSamps 指向源样本的指针 (也可为 x filter 指向 IIRLatticeStruct 滤波器结构的指针
返回值: 指向目标样本基地址的指针。 说明: 格型系数 k[m],定义在 0 m M 范围内。
梯度系数 g[m],定义在 0 m M 范围内 (除非是实现一个全极点滤 波器)。 延迟 d[m],定义在 0 m M 范围内。 源样本 x[n],定义在 0 n < N 范围内。 目标样本 y[n],定义在 0 n < N 范围内。
注:本函数亚库提供的小数实现容易造成饱和。可利用如 OCTAVE 模 型 (见本节最后部分)这样的小数实现 “离线”设计和测试滤波器。 然后,应该在执行浮点型运算的过程中监控前向和后向中间值,查找超 出 [-1, 1)范围的值。如果任意一个中间值超出该范围,则应在实时应 用小数滤波器之前,将最大绝对值用于定标输入信号;也就是说,用该 最大值的倒数与信号相乘。这样可以避免小数实现出现饱和。
源文件:
iirlatt.asm
DS51456B_CN 52 2005 Microchip Technology Inc.
IIRLattice (续)
资源使用情况: 系统资源的使用:
W0..W7 使用,不恢复 W8..W13 保存,使用,恢复 ACCA 使用,不恢复 ACCB 使用,不恢复 CORCON 保存,使用,恢复
DO REPEAT 指令的使用:
两级 DO 指令 无 REPEAT 指令
程序字 (24 位指令):
76
周期数 (包括 C 函数的调用和返回开销):
46 + N(16 + 7M),
或者,当系数在程序存储器中,为 49 + N(20 + 8M)。
如果实现一个全极点滤波器:
46 + N(16 + 6M), 或者,当系数在程序存储器中,为 49 + N(16 + 7M) 。
DSP 函数库
IIRLatticeInit
描述:
头文件: 函数原型:
参数: 滤波器结构:
源文件: 资源使用情况: 系统资源的使用:
IIRLatticeInit函数将 IIRLatticeStruct 滤波器结构中的延迟值
初始化为零。
dsp.h
extern void IIRLatticeInit (
IIRLatticeStruct* filter
);
(参见 IIRLattice 函数的描述)。
初始化描述:
filter 指向 IIRLatticeStruct 滤波器结构的指针。
iirlattd.asm
W0..W2 使用,不恢复
DO REPEAT 指令的使用:
DO 指令 一级 REPEAT 指令
程序字 (24 位指令):
6
周期数 (包括 C 函数的调用和返回开销):
10 + M
2005 Microchip Technology Inc. DS51456B_CN 第 53
dsPIC® 语言工具库
IIRTransposed
描述:
头文件: 函数原型:
参数: 滤波器结构:
IIRTransposed 函数对源样本序列应用转置型 (直接型 II)的二阶节 级联 IIR 滤波器,将结果存放在目标样本序列中,并更新延迟值。
dsp.h
typedef struct { int numSectionsLess1; fractional* coeffsBase; int coeffsPage; fractional* delayBase1; fractional* delayBase2; int finalShift; } IIRTransposedStruct;
extern fractional* IIRTransposed ( int numSamps, fractional* dstSamps, fractional* srcSamps, IIRTransposedStruct* filter );
numSectionsLess1 级联的二阶节数减去 1 (可以为 S-1 coeffsBase 指向X数据空间或程序存储器中滤波器系数的
指针 (也可为 { a, b }
coeffsPage 系数缓冲区的页号,或者当系数在数据存储
空间时,为 0xFF00 (定义的值 COEFFS_IN_DATA
delayBase1 指向滤波器状态 1 的指针,每二阶节延迟一个
存放在 Y 数据空间中 (也可为 d1)。
字,
delayBase2 指向滤波器状态 2 的指针,每二阶节延迟一个
字,仅存放在 Y 数据空间中 (也可为 d2)。
finalShift 输出定标 (左移)
滤波器描述:
numSamps 滤波器输入样本的数目 (也可为 N dstSamps 指向目标样本的指针 (也可为 y srcSamps 指向源样本的指针 (也可为 x filter 指向 IIRTransposedStruct 滤波器结构的指针
返回值: 指向目标样本基地址的指针。 说明:
源文件:
每二阶节有 5 个系数,排列为有序集合
{b0[s], b1[s], a1[s], b2[s],a2[s]}0 s < S。利用 Momentum Data Systems 公司的 dsPICFD 滤波器设计包或相似工具算出系数值。
延迟由每节的滤波器状态的两个字 ({d1[s], d2[s]}0 s < S)组成。 源样本 x[n],定义在 0 n < N 范围内。
目标样本 y[n],定义在 0 n < N 范围内。
进入
初始增益值在 在将结果存放到输出序列中之前,对滤波器结构的输出进行移位进行输 出定标。这用于将滤波器的增益恢复为 0 dB。移位计数可以为 0 ;如果 不为 0,它表示移位的位数:负数表示左移,正数表示右移。
iirtrans.asm
滤波器结构前应用于每个输入样本。
DS51456B_CN 54 2005 Microchip Technology Inc.
IIRTransposed (续)
资源使用情况: 系统资源的使用:
W0..W7 使用,不恢复 W8..W11 保存,使用,恢复 ACCA 使用,不恢复 ACCB 使用,不恢复 CORCON 保存,使用,恢复 PSVPAG 保存,使用,恢复
DO REPEAT 指令的使用:
两级 DO 指令 一级 REPEAT 指令
程序字 (24 位指令):
48
周期数 (包括 C 函数的调用和返回开销):
35 + N(11 + 11S),
或者,当系数存放在程序存储器中,为 38 + N( 9 + 17S)。 其中, S 为二阶节的数目。
DSP 函数库
IIRTransposedInit
描述:
头文件: 函数原型:
参数: 滤波器结构:
说明:
源文件: 资源使用情况: 系统资源的使用:
IIRTransposedInit 函数将 IIRTransposedStruct 滤波器结构中
的延迟值初始化为零。
dsp.h
extern void IIRTransposedInit (
IIRTransposedStruct* filter
);
(参见 IIRTransposed 函数的描述)。
初始化描述:
filter 指向 IIRTransposedStruct 滤波器结构的指针。
延迟由两个独立的缓冲区组成,每个缓冲区包含每节的滤波器状态的一
个字 ({d2[s], d1[s]}0 s < S)。
iirtrans.asm
W0..W2 使用,不恢复
DO REPEAT 指令的使用:
一级 DO 指令 无 REPEAT 指令
程序字 (24 位指令):
8
周期数 (包括 C 函数的调用和返回开销):
11 + 2S S 二阶节的数目。
2005 Microchip Technology Inc. DS51456B_CN 第 55
dsPIC® 语言工具库
2.6.6 可用于分析格型 IIR 滤波器的 OCTAVE 模型
下面的 OCTAVE 模型可以用来在使用 IIRLattice 函数提供的小数实现之前检验格型 IIR 滤波器的性能。
IIRLattice OCTAVE model
function [out, del, forward, backward] = iirlatt (in, kappas, gammas, delay) ## FUNCTION.­## IIRLATT: IIR Fileter Lattice implementation. ## ## [out, del, forward, backward] = iirlatt (in, kappas, gammas, delay) ## ## forward: records intermediate forward values. ## backward: records intermediate backward values.
#..............................................................................
## Get implicit parameters. numSamps = length(in); numKapps = length(kappas); if (gammas != 0) numGamms = length(gammas); else numGamms = 0; endif numDels = length(delay); filtOrder = numDels-1;
## Error check. if (numGamms != 0) if (numGamms != numKapps) fprintf ("ERROR! %d should be equal to %d.\n", numGamms, numKapps); return; endif endif if (numDels != numKapps) fprintf ("ERROR! %d should equal to %d.\n", numDels, numKapps); return; endif
## Initialize. M = filtOrder; out = zeros(numSamps,1); del = delay; forward = zeros(numSamps*M,1); backward = forward; i = 0;
## Filter samples. for n = 1:numSamps ## Get new sample. current = in(n);
DS51456B_CN 56 2005 Microchip Technology Inc.
## Lattice structure. for m = 1:M after = current - kappas(M+1-m) * del(m+1); del(m) = del(m+1) + kappas(M+1-m) * after; i = i+1; forward(i) = current; backward(i) = after; current = after; end del(M+1) = after;
## Ladder structure (computes output). if (gammas == 0) out(n) = del(M+1); else for m = 1:M+1 out(n) = out(n) + gammas(M+2-m)*del(m); endfor endif endfor
## Return. return;
DSP 函数库
#..............................................................................
endfunction
2005 Microchip Technology Inc. DS51456B_CN 57
dsPIC® 语言工具库

2.7 变换函数

本节将讲述 DSP 函数库中小数变换的概念,并描述执行变换运算的各个函数。
2.7.1 小数变换运算
小数变换是线性、时不变和离散的运算,当应用于一个小数的时域样本序列时,会在 频域内生成小数频率。相反地,当将小数变换运算的反变换应用于频域数据时,会生 成其时域表示。
DSP 函数库提供了一套变换 (以及一部分反变换)。第一组变换对复数数据集 (参见 下面关于复杂小数复数值的描述)应用离散傅里叶变换 (Discrete Fourier transform
DFT)(或反变换)。第二组变换对实数值序列应用类型 II 离散余弦变换 (Discrete Cosine Transform, DCT)。这些变换设计为可以 “原址”运算,或非 “原址”运
算。前一种类型将变换结果保存到输出序列中。而对于后一种类型,输入序列 (在物 理上)被变换后的序列替代。对于非 “原址”运算,需要有足够的存储空间来存放计 算的结果。
变换使用了在调用变换函数时必须提供的变换因子 (或常数)。这些因子都是复数的 数据集合,以浮点型算法进行计算,然后变换成小数以供运算使用。当应用变换时, 为了避免过多的计算开销,可以一次生成一组特定的变换因子,在程序执行过程中多 次使用这组因子。因此,建议将任何初始化运算返回的因子存放在持久 (静态)复数 矢量中。“离线”生成因子,并将它们存放在程序存储器中,以备程序以后指向时使 用,这样做也是非常有用的。这样,当一个应用程序有变换运算时,可以节省运行时 间 (周期数)和 RAM 空间。
2.7.2 小数型复数矢量
复数矢量通过数据集合来表示,在该数据集合中,矢量中每个元素由两个值组成。其 中第一个值是元素的实部,第二个值是元素的虚部。用存储器的一个字 (2 个字节) 来存储实部和虚部,且必须都表示为 “1.15”小数格式。与小数矢量一样,小数型复 数矢量将其元素连续地存放在存储器中。
小数型复数矢量的结构可以通过下面的数据结构访问来说明:
#ifdef fractional #ifndef fractcomplex typedef struct { fractional real; fractional imag; } fractcomplex; #endif #endif
DS51456B_CN 58 2005 Microchip Technology Inc.
DSP 函数库
2.7.3 用户需要注意的事项
a) 不对这些函数执行边界检查。超出范围 (包括零长度的矢量)以及源复数矢量
和因子集合使用的不一致都可能产生预想不到的结果。
b) 建议在每个函数调用结束后检查状态寄存器 (SR)。尤其是,用户可以在函数
返回后检查 SASB SAB 标志,以判断是否发生了饱和。
c) 在变换运算中用到的输入和输出复数矢量
可以存放在 X 数据空间或程序存储器中。
d) 因为位反转寻址需要矢量集合按模数对齐,明确或隐含地使用
BitReverseComplex 函数的运算中的输入和输出复数矢量必须正确地分配。
e) 返回一个目标复数矢量的运算可以是嵌套的,例如,如果:
a = Op1 (b, c),且 b = Op2 (d)c = Op3 (e, f),则
a = Op1 (Op2 (d), Op3 (e, f))
必须
存放在 Y 数据空间中。变换因子
2005 Microchip Technology Inc. DS51456B_CN 59
dsPIC® 语言工具库
2.7.4 各个函数
下面将描述实现变换及其反变换运算的各函数。
BitReverseComplex
描述: 头文件: 函数原型:
参数:
返回值: 指向源复数矢量基地址的指针。 说明: N
源文件: 资源使用情况: 系统资源的使用:
BitReverseComplex 函数以位反转顺序重新组织复数矢量的元素。
dsp.h
extern fractcomplex* BitReverseComplex ( int log2N, fractcomplex* srcCV );
log2N 2 为底的 N 的对数 (N 为源矢量中复数元素的数目) srcCV 指向源复数矢量的指针
必须
2 的整数次幂。
srcCV 矢量必须以 N 为模对齐分配。 该函数 “原址”运算。
bitrev.asm
W0..W7 使用,不恢复 MODCON 保存,使用,恢复 XBREV 保存,使用,恢复
DO REPEAT 指令的使用:
一级 DO 指令 无 REPEAT 指令
程序字 (24 位指令):
27
周期数 (包括 C 函数的调用和返回开销):
变换大小
32 32 245 64 64 485
128 128 945
256 256 1905
复数元素数 周期数
DS51456B_CN 60 2005 Microchip Technology Inc.
CosFactorInit
描述:
头文件: 函数原型:
参数:
返回值: 指向余弦因子基地址的指针。 说明: N
源文件: 资源使用情况: 系统资源的使用:
CosFactorInit 函数的功能是:生成离散余弦变换 (类型 II)需要的
余弦因子集合的前半部分,并将结果存放在复数目标矢量中。实际上,
参数集合包含以下值:
πk
-------
j
CN k() e
dsp.h
extern fractcomplex* CosFactorInit (
int log2N,
fractcomplex* cosFactors
);
log2N 2 为底的N的对数(N DCT 所需要的复数因子的数
cosFactors 指向复数余弦因子的指针
必须
只生成前面 N/2 个余弦因子。
在调用函数之前,大小为 N/2 的复数矢量
cosFactors。复数矢量
因子以浮点运算进行计算,并转换为 “1.15”格式的复数小数。
initcosf.c
W0..W7 使用,不恢复 W8..W14 保存,使用,恢复
2N
=
,其中, 0
目)
2 的整数次幂。
k < N/2
必须
DSP 函数库
必须
已经分配并指定给
存放在 X 数据空间中。
DCT
描述:
头文件: 函数原型:
DO REPEAT 指令的使用:
都未使用
程序字 (24 位指令):
参阅 pic30_tools\src\dsp 目录下的 “readme.txt”。
周期数 (包括函数的调用和返回):
参阅 pic30_tools\src\dsp 目录下的 “readme.txt”。
DCT 函数的功能是:对源矢量进行离散余弦变换,并将结果存放在目标
矢量中。
dsp.h
extern fractional* DCT (
int log2N,
fractional* dstV,
fractional* srcV,
fractcomplex* cosFactors,
fractcomplex* twidFactors,
int factPage
);
2005 Microchip Technology Inc. DS51456B_CN 61
dsPIC® 语言工具库
DCT (续)
参数:
返回值: 指向目标矢量基地址的指针。 说明: N
源文件: 资源使用情况: 系统资源的使用:
log2N 2 为底的 N 的对数 (N 为源矢量中复数元素的数
目)
dstCV 指向目标矢量的指针 srcCV 指向源矢量的指针 cosFactors 指向余弦因子的指针 twidFactors 指向旋转因子的指针 factPage 变换因子的存储器页
必须
2 的整数次幂。
该函数非 “原址”运算。大小为 2N 个元素的矢量 给 dstVdstV 矢量必须以 N 为模对齐分配。
计算的结果存放在目标矢量的前 N 个元素中。 为了避免在计算过程出现饱和 (溢出),源矢量的值
范围内。 仅需要前面 N/2 个余弦因子。
仅需要前面 N/2 个旋转因子。 如果变换因子存放在 X 数据空间中, cosFactors twidFactors
指向因子分配的实际地址。如果变换因子存放在程序存储器中, cosFactorstwidFactors 为相对于因子所在页边界的偏移量。后 面这个值可以利用行内汇编操作符 psvoffset() 计算出来。 如果变换因子存放在 X 数据空间中, factPage 必须设置为 0xFF00
(定义的值 COEFFS_IN_DATA)。如果它们存放在程序存储器中,
factPage 为因子所在的程序页号。后面这个值可以利用行内汇编操作 符 psvpage() 计算出来。
必须
旋转因子 仅需要前面 N/2 个余弦因子。
输出要乘以因子 进行定标。
dctoop.asm
W0..W5 使用,不恢复 以及 VectorZeroPad DCTIP 使用的系统资源。
被初始化, conjFlag 设置为一个不等于零的值。
12N()
必须
已经分配并指定
应该
[-0.5, 0.5]
DO REPEAT 指令的使用:
DO 指令 无 REPEAT 指令
以及 VectorZeroPad DCTIP 使用的 DO/REPEAT 指令。
程序字 (24 位指令):
16
加上 VectorZeroPad DCTIP 的程序字。
周期数 (包括 C 函数的调用和返回开销):
22
加上 VectorZeroPad DCTIP 的周期数。
注:VectorZeroPad 的描述中,周期数包括 C 函数调用开销的四 个周期。所以, DCT 中由于 VectorZeroPad 所增加的实际周期数比 单独的 ectorZeroPad 所用的周期数少 4 个周期。同样地, DCT 中由 于 DCTIP 所增加的实际周期数比单独的 DCTIP 所用的周期数少 3 个周 期。
DS51456B_CN 62 2005 Microchip Technology Inc.
DCTIP
DSP 函数库
描述:
头文件: 函数原型:
参数:
返回值: 指向目标矢量基地址的指针。 说明: N
源文件:
DCTIP 函数的功能是:计算源矢量的离散余弦变换,计算结果丢回“原
址”(In Place)。
dsp.h
extern fractional* DCTIP (
int log2N,
fractional* srcV,
fractcomplex* cosFactors,
fractcomplex* twidFactors,
int factPage
);
log2N 2 为底的 N 的对数(N 为源矢量中复数元素的数目)
srcCV 指向源矢量的指针
cosFactors 指向余弦因子的指针
twidFactors 指向旋转因子的指针
factPage 变换因子的存储器页号
必须
2 的整数次幂。
该函数要求源矢量填补零至 2N 长度。
srcV 矢量必须以 N 为模对齐分配。
计算的结果存放在源矢量的前面 N 个元素内。
为了避免在计算过程中出现饱和 (溢出),源矢量的值应该在
[-0.5, 0.5] 范围内。
仅仅需要前面 N/2 个余弦因子。
仅仅需要前面 N/2 个旋转因子。
如果变换因子存放在 X 数据空间中, cosFactorstwidFactors
指向因子分配的实际地址。如果变换因子存放在程序存储器中,
cosFactors twidFactors 为相对于因子所在页边界的偏移量。后
面这个值可以利用行内汇编操作符 psvoffset() 计算出来。
如果变换因子存放在 X 数据空间中, factPage 必须被设定为 0xFF00
(定义的值 COEFFS_IN_DATA)。如果它们存放在程序存储器中,
factPage 为因子所在的程序页号。后面这个值可以利用行内汇编操作
psvpage() 计算出来。
必须
旋转因子
输出要乘以因子 进行定标。
dctoop.asm
被初始化, conjFlag 设置为一个不等于零的值。
12N()
2005 Microchip Technology Inc. DS51456B_CN 63
dsPIC® 语言工具库
DCTIP (续)
资源使用情况: 系统资源的使用:
W0..W7 使用,不恢复 W8..W13 保存,使用,恢复 ACCA 使用,不恢复 CORCON 保存,使用,恢复 PSVPAG 保存,使用,恢复 (仅当因子在程序存储器中
时)
DO REPEAT 指令的使用:
一级 DO 指令 一级 REPEAT 指令 以及 IFFTComplexIP 使用的 DO/REPEAT 指令。
程序字 (24 位指令):
92
加上 IFFTComplexIP 的程序字。
周期数 (包括 C 函数的调用和返回开销):
71 + 10N, 或者,当因子存放在程序存储器中,为 73 + 11N , 加上 IFFTComplexIP 的周期数。
注:在 IFFTComplexIP 的描述开销中,周期数包括 C 函数调用的 4 个周期。因此, DCTIP 中因 IFFTComplexIP 增加的实际周期数比单 独的 IFFTComplexIP 所用的周期数少 4 个周期。
FFTComplex
描述:
头文件: 函数原型:
参数:
返回值: 指向目标复数矢量基地址的指针。
FFTComplex 函数对源复数矢量进行离散傅里叶变换,并将结果存放在 目标复数矢量中。
dsp.h
extern fractcomplex* FFTComplex ( int log2N, fractcomplex* dstCV, fractcomplex* srcCV, fractcomplex* twidFactors, int factPage );
log2N 2 为底的 N 的对数(N 为源矢量中复数元素的数目) dstCV 指向目标复数矢量的指针 srcCV 指向源复数矢量的指针 twidFactors 旋转因子的基地址 factPage 变换因子的存储器页
DS51456B_CN 64 2005 Microchip Technology Inc.
FFTComplex (续)
说明: N
源文件: 资源使用情况: 系统资源的使用:
必须
2 的整数次幂。
该函数不 “原址”运算。一个足够大以接收运算结果的复数矢量
经分配并指定给 dstCV
dstCV 矢量必须以 N 为模对齐分配。
要求源复数矢量中的元素按照自然顺序存储。
目标复数矢量中的元素按照自然顺序生成。
为了避免在计算过程中出现饱和 (溢出),源复数矢量的幅值应该处于
[-0.5, 0.5] 范围内。
仅需要前面 N/2 个旋转因子。
如果旋转因子存放在 X 数据空间内, twidFactors 指向因子所分配的
实际地址。如果旋转因子存放在程序存储器中, twidFactors 为相对
于因子所在页边界的偏移量。后面这个值可以利用行内汇编操作符
psvoffset() 计算出来。
如果旋转因子存放在 X 数据空间中, factPage 必须被设置为 0xFF00
(定义的值 COEFFS_IN_DATA)。如果它们存放在程序存储器中,
factPage 为因子所在的程序页号。后面这个值可以利用行内汇编操作
psvpage() 计算出来。
必须
旋转因子
输出必须乘以因子 1/N 来定标。
fftoop.asm
W0..W4 使用,不恢复 以及 VectorCopyFFTComplexIP BitReverseComplex 所 使用的系统资源。
被初始化, conjFlag 设置为零。
DSP 函数库
必须
DO REPEAT 指令的使用:
DO 指令 无 REPEAT 指令
以及 VectorCopyFFTComplexIP BitReverseComplex 使 用的 DO/REPEAT 指令。
程序字 (24 位指令):
17
加上 VectorCopyFFTComplexIP BitReverseComplex 的 程序字。
周期数 (包括 C 函数的调用和返回开销):
23
加上 VectorCopyFFTComplexIP BitReverseComplex 的 周期数。
注:VectorCopy 的描述中,周期数包括 C 函数调用开销的 3 个周
期。因此, FFTComplex 中因 VectorCopy 所增加的实际周期数比单
独的 VectorCopy 所用的周期数少 3 个周期。同样地, FFTComplex
中因 FFTComplexIP 所增加的周期数比单独的 FFTComplexIP 所用
的周期数少 4 个周期。而因 BitReverseComplex 所增加的周期数比
单独的 FFTComplex 所用的周期数少 2 个周期。
2005 Microchip Technology Inc. DS51456B_CN 65
dsPIC® 语言工具库
FFTComplexIP
描述:
头文件: 函数原型:
参数:
返回值: 指向源复数矢量基地址的指针。 说明: N
源文件:
FFTComplexIP 函数的功能是:计算源复数矢量的离散傅里叶变换,, 计算结果丢回 “原址”(In Place)。
dsp.h
extern fractcomplex* FFTComplexIP ( int log2N, fractcomplex* srcCV, fractcomplex* twidFactors, int factPage );
log2N 2 为底的 N 的对数 (N 为源矢量中复数元素的数
目)
srcCV 指向源复数矢量的指针 twidFactors 旋转因子的基地址 factPage 变换因子的存储器页
必须
2 的整数次幂。 要求源复数矢量中的元素按照自然顺序存储。 变换结果以位反转顺序存放。
为了避免在计算程中出现饱和 (溢出),源复数矢量的值的幅值应该在 [-0.5, 0.5] 范围内。
仅需要前面 N/2 个旋转因子。 如果旋转因子存放在 X 数据空间中, twidFactors 指向因子分配的实
际地址。如果旋转因子存放在程序存储器中, twidFactors 为相对于 因子所在页边界的偏移量。后面这个值可以利用行内汇编操作符 psvoffset() 计算出来。 如果旋转因子存放在 X 数据空间中, factPage 必须被设定为 0xFF00
(定义的值 COEFFS_IN_DATA)。如果它们存放在程序存储器中,
factPage 为因子所在的程序页号。后面这个值可以利用内嵌的算子 psvpage() 计算出来。
必须
旋转因子 输出应乘以因子 1/N 进行定标。
fft.asm
被初始化, conjFlag 设置为零。
DS51456B_CN 66 2005 Microchip Technology Inc.
FFTComplexIP (续)
资源使用情况: 系统资源的使用:
W0..W7 使用,不恢复 W8..W13 保存,使用,恢复 ACCA 使用,不恢复 ACCB 使用,不恢复 CORCON 保存,使用,恢复 PSVPAG 保存,使用,恢复 (仅当因子在程序存储器中
DO REPEAT 指令的使用:
两级 DO 指令 无 REPEAT 指令
程序字 (24 位指令):
59
周期数 (包括 C 函数的调用和返回开销):
变换大小
32 1,633 1,795
64 3,739 4,125 128 8,485 9,383 256 19,055 21,105
时)
当旋转因子在 X 数据 空间中时的周期数
DSP 函数库
当旋转因子在程序存 储器中时的周期数
IFFTComplex
描述:
头文件: 函数原型:
参数:
返回值: 指向目标复矢量基地址的指针。
IFFTComplex 函数计算源复数矢量的离散傅里叶反变换,并将结果存 放在目标复矢量中。
dsp.h
extern fractcomplex* IFFTComplex ( int log2N, fractcomplex* dstCV, fractcomplex* srcCV, fractcomplex* twidFactors, int factPage );
log2N 2 为底的 N 的对数(N 为源矢量中复数元素的数目) dstCV 指向目标复矢量的指针 srcCV 指向源复矢量的指针 twidFactors 旋转因子的基地址 factPage 转换因子的存储器页
2005 Microchip Technology Inc. DS51456B_CN 67
dsPIC® 语言工具库
IFFTComplex (续)
说明:
源文件: 资源使用情况: 系统资源的使用:
必须
2 的整数次幂。
N
必须
该函数不 “原址”运算。一个足够大以接收运算结果的复数矢量 经分配并指定给 dstCVdstCV 矢量必须以 N 为模对齐分配。
要求源复数矢量中的元素按照自然顺序存储。 目标复数矢量中的元素按照自然顺序生成。
为了避免在计算过程中出现饱和 (溢出),源复数矢量的值的幅值 在 [-0.5, 0.5] 范围内。 如果旋转因子存放在 X 数据空间中, twidFactors 指向因子分配的实 际地址。如果旋转因子存放在程序存储器中, twidFactors 为相对于 因子所在页边界的偏移量。后面这个值可以利用行内汇编操作符 psvoffset() 计算出来。 如果旋转因子存放在 X 数据空间间中, factPage 必须被设定为 0xFF00 (定义的值 COEFFS_IN_DATA)。如果它们存放在程序存储器 中, factPage 为因子所在的程序页号。后面这个值可以利用行内汇编 操作符 psvpage() 计算出来。
必须
旋转因子 仅需要前面 N/2 个旋转因子。
ifftoop.asm
W0..W4 使用,不恢复 以及 VectorCopy IFFTComplexIP 使用的系统资源。
被初始化, conjFlag 设置为一个不等于零的值。
应该
DO REPEAT 指令的使用:
DO 指令 无 REPEAT 指令
以及 VectorCopy IFFTComplexIP 使用的 DO/REPEAT 指令。
程序字 (24 位指令):
12
加上 VectorCopy IFFTComplexIP 的程序字。
周期数 (包括 C 函数的调用和返回开销):
15
加上 VectorCopy IFFTComplexIP 的周期数。
注:VectorCopy 的描述中,周期数包括 C 函数调用开销的 3 个周 期。因此, FFTComplex 中因 VectorCopy 所增加的实际周期数比单 独的 VectorCopy 所用的周期数少 3 个。同样地, FFTComplex 中因 IFFTComplexIP 所增加的周期数比单独的 IFFTComplexIP 所用的周 期数少 4 个。
DS51456B_CN 68 2005 Microchip Technology Inc.
IFFTComplexIP
描述:
头文件: 函数原型:
参数:
返回值: 指向源复矢量基地址的指针。 说明:
源文件:
IFFTComplexIP 函数计算源复数矢量的离散傅里叶反变换,计算结果 丢回 “原址”(In Place)。
dsp.h
extern fractcomplex* IFFTComplexIP ( int log2N, fractcomplex* srcCV, fractcomplex* twidFactors, int factPage );
log2N 2 为底的 N 的对数(N 为源矢量中复数元素的数目) srcCV 指向源复矢量的指针 twidFactors 旋转因子的基地址 factPage 转换因子的存储器页
必须
2 的整数次幂。
N
要求源复数矢量中按照位反转顺序排列。 变换结果按照自然顺序存放。
srcCV 矢量必须以 N 为模对齐分配。 为了避免在计算过程中出现饱和 (溢出),源复数矢量的值的幅值应该 在 [-0.5, 0.5] 范围内。 如果旋转因子存放在 X 数据空间中, twidFactors 指向因子分配的实 际地址。如果旋转因子存放在程序存储器中, twidFactors 为相对于 因子所在页边界的偏移量。后面这个值可以利用行内汇编操作符 psvoffset() 计算出来。 如果旋转因子存放在 X 数据空间中, factPage 必须被设定为 0xFF00
(定义的值 COEFFS_IN_DATA)。如果它们存放在程序存储器中,
factPage 为因子所在的程序页号。后面这个值可以利用行内汇编操作 符 psvpage() 计算出来。
必须
旋转因子 仅需要前面 N/2 个旋转因子。
ifft.asm
被初始化, conjFlag 设置为一个不等于零的值。
DSP 函数库
2005 Microchip Technology Inc. DS51456B_CN 69
dsPIC® 语言工具库
IFFTComplexIP (续)
资源使用情况: 系统资源的使用:
W0..W3 使用,不恢复 以及 FFTComplexIP BitReverseComplex 使用的系统资源。
DO REPEAT 指令的使用:
DO 指令 无 REPEAT 指令 以及 FFTComplexIP BitReverseComplex 使用的 DO/REPEAT 指令。
程序字:
11
加上 FFTComplexIP BitReverseComplex 的程序字。
周期数 (包括 C 函数的调用和返回开销):
15
加上 FFTComplexIP BitReverseComplex 的周期数。
注:在 FFTComplexIP 的描述中,周期数包括 C 函数调用开销的 3 个 周期。因此, IFFTComplexIP 中因 FFTComplexIP 所增加的实际周 期数比单独的 FFTComplexIP 所用的周期数少 3 个。同样地,
IFFTComplexIP中因 BitReverseComplex 所增加的周期数比单独的 BitReverseComplex 所用的周期数少 2 个。
TwidFactorInit
描述:
TwidFactorInit 函数生成离散傅里叶变换或离散余弦变换所需要的 旋转因子集合的前半部分,并将结果存放在复数目标矢量中。实际上, 该集合包含下列值:
2π k
--------- -
j
N
,当 conjFlag = 0 时,其中 0 k N/2
2π k
--------- -
j
N
,当 conjFlag ! = 0 时,其中 0
头文件: 函数原型:
WN k() e
WN k() e
=
=
dsp.h
extern fractcomplex* TwidFactorInit ( int log2N, fractcomplex* twidFactors, int conjFlag );
参数:
log2N 2 为底的N 的对数(NDFT 需要的复数因子的数
目)
twidFactors 指向复数旋转因子的指针 conjFlag 指示是否要生成共轭值的标志
返回值: 指向旋转因子基地址的指针。
k N/2
DS51456B_CN 70 2005 Microchip Technology Inc.
TwidFactorInit (续)
必须
2 的整数次幂。
说明:
源文件: 资源使用情况: 系统资源的使用:
N 仅生成前面 N/2 个旋转因子。
conjFlag 的值确定指数函数参数的符号。对于傅里叶变换,
conjFlag 应被设为 0,对于傅里叶反变换和离散余弦变换, conjFlag 应被设为 1
在调用函数之前,一个大小为 N/2 的复数矢量必须已经分配并指定给 twidFactors。复数矢量
因子以浮点运算进行计算,并转换为 “1.15”格式的复数小数形式。
inittwid.c
W0..W7 使用,不恢复 W8..W14 使用,保存,恢复
DO REPEAT 指令的使用:
都未使用
程序字 (24 位指令):
参阅 pic30_tools\src\dsp 目录下的 “readme.txt”。
周期数 (包括 C 函数的调用和返回开销):
参阅 pic30_tools\src\dsp 目录下的 “readme.txt”。
应该
分配到 X 数据空间中。
DSP 函数库
2005 Microchip Technology Inc. DS51456B_CN 71
dsPIC® 语言工具库
注:
DS51456B_CN 72 2005 Microchip Technology Inc.

3.1 简介

dsPIC® 语言工具库

3 dsPIC 外设函数库

本章介绍了 dsPIC 外设函数库中包含的函数和宏,并提供了使用示例。 在 pic30_tools\src\peripheral 中的 readme.txt 文件中可以查到每个库函数
或宏的代码大小。
3.1.1 汇编代码应用程序
Microchip 网站上可以获得这些库和相关的头文件的免费版本,其中包括源代码。
3.1.2 C 代码应用程序
与库相关的文件存放在 MPLAB C30 C 编译器安装目录 (c:\pic30_tools)的如下 子目录中:
lib——dsPIC 外设库文件
src\peripheral——库函数的源代码以及用于重建库的批处理文件
support\h——库的头文件
3.1.3 章节组织
本章的结构如下:
使用 dsPIC 外设函数库 软件函数
外部 LCD 函数 硬件函数
•CAN函数
•ADC12函数
•ADC10函数
定时器函数
复位 / 控制函数
• I/O 端口函数
输入捕捉函数
输出比较函数
•UART函数
• DCI 函数
•SPI函数
•QEI函数
•PWM函数
•I2C 函数
2005 Microchip Technology Inc. DS51456B_CN 第 73
dsPIC® 语言工具库

3.2 使用 dsPIC 外设函数库

构建利用 dsPIC 外设函数库的应用程序需要特定处理器的库文件和每个外设模块的头 文件。
对于每个外设,相应的头文件都提供了所有函数原型、以及库使用的 #define typedef。归档库文件包含了每个库函数的目标文件。
头文件的形式为 peripheral.h,其中 peripheral
(如, can.h 对应 CAN)。
库文件的形式为 libpDevice-omf.a,其中 Device dsPIC 器件编号 (如, libp30F6014-coff.a 对应 dsPIC30F6014 器件)。关于特定于 OMF 的库的更多信 息,请参阅第 1.2 节 “特定于 OMF 的库 / 启动模块”
当编译应用程序时,调用库中函数或者使用其符号或 typedef 的所有源文件必须都
(使用 #include)引用头文件。当链接应用程序时,库文件必须作为链接器的一个输
入(使用--library-l 链接器开关),这样应用程序使用的函数就会被链接到应 用程序。
批处理文件 makeplib.bat 可以用来重建库。默认的操作是为支持的所有目标处理器 建立外设函数库;但也可以在命令行中指定特定的处理器。例如:
makeplib.bat 30f6014
makeplib.bat 30F6014
使用的特定外设的名称
将为 dsPIC30F6014 器件重建库。

3.3 外部 LCD 函数

本节给出了用于与 P-tec PCOG1602B LCD 控制器接口的各个函数以及使用这些函数的例 子。函数也可以用宏来实现。
仅下列器件支持外部 LCD 函数:
• dsPIC30F5011
• dsPIC30F5013
• dsPIC30F6010
• dsPIC30F6011
• dsPIC30F6012
• dsPIC30F6013
• dsPIC30F6014
DS51456B_CN 74 2005 Microchip Technology Inc.
3.3.1 各个函数
BusyXLCD
dsPIC 外设函数库
描述: 头文件: 函数原型: 参数: 无 返回值:
说明: 源文件: 代码示例:
该函数检查 P-tec PCOG1602B LCD 控制器的忙标志。
xlcd.h
char BusyXLCD(void);
如果返回 “1”,表明 LCD 控制器忙,无法接收任何命令。 如果返回 “0”,表明 LCD 控制器准备接收下一个命令。
该函数返回 P-tec PCOG1602B LCD 控制器忙标志的状态。
BusyXLCD.c
while(BusyXLCD());
OpenXLCD
描述: 头文件: 函数原型: 参数:
返回值: 无 说明:
该函数配置 I/O 引脚并初始化 P-tec PCOG1602B LCD 控制器。
xlcd.h
void OpenXLCD (unsigned char lcdtype);
lcdtype 包含如下定义的要配置的 LCD 控制器参数:
该函数对用来控制 P-tec PCOG1602B LCD 控制器的 I/O 引脚进行配 置。同时初始化 LCD 控制器。为确保外部 LCD 正确工作,必须进行如 下 I/O 引脚定义:
接口类型
FOUR_BIT EIGHT_BIT
行数
SINGLE_LINE TWO_LINE
段数据传输方向
SEG1_50_SEG51_100 SEG1_50_SEG100_51 SEG100_51_SEG50_1 SEG100_51_SEG1_50
数据传输方向
COM
COM1_COM16 COM16_COM1
2005 Microchip Technology Inc. DS51456B_CN 75
dsPIC® 语言工具库
OpenXLCD (续)
源文件: 代码示例:
控制 I/O 引脚定义
RW_PIN PORTxbits.Rx? TRIS_RW TRISxbits.Rx? RS_PIN PORTxbits.Rx? TRIS_RS TRISxbits.Rx? E_PIN PORTxbits.Rx? TRIS_E TRISxbits.Rx?
其中 x 是端口, ? 是引脚号 数据引脚定义
DATA_PIN_? PORTxbits.RD? TRIS_DATA_PIN_? TRISxbits.TRISD?
其中 x 是端口, ? 是引脚号 数据引脚可以来自一个或多个端口。 控制引脚可以来自任意端口而不必来自同一个端口。数据接口必须定义
4 位或 8 位。当头文件 xlcd.h 中包含 #define EIGHT_BIT_INTERFACE 时,则定义了 8 位接口。如果不包 含这个定义,则默认定义了 4 位接口。
这些定义完成后,用户必须将应用代码编译成要链接的目标文件。
该函数还需要三个特定的外部延时子程序:
DelayFor18TCY() 延时 18Tcy DelayPORXLCD() 延时 15ms DelayXLCD() 延时 5ms Delay100XLCD() 延时 100Tcy
openXLCD.c
OpenXLCD(EIGHT_BIT & TWO_LINE & SEG1_50_SEG51_100 &COM1_COM16);
putsXLCD putrsXLCD
描述: 头文件: 函数原型:
参数: 返回值: 无 说明:
源文件:
代码示例:
该函数向 P-tec PCOG1602B LCD 控制器写入一个字符串。
xlcd.h
void putsXLCD (char *buffer); void putrsXLCD (const rom char *buffer);
buffer 指向要写入 LCD 控制器的字符的指针。
这些函数将 buffer 中的字符串写入 P-tec PCOG1602B LCD 控制器 中,直到在字符串中遇到空字符为止。 为了连续显示写入 P-tec PCOG1602B LCD 控制器的数据,必须将显示 设置成移位模式。
PutsXLCD.c PutrsXLCD.c
char display_char[13]; putsXLCD(display_char);
DS51456B_CN 76 2005 Microchip Technology Inc.
ReadAddrXLCD
描述: 头文件: 函数原型: 参数: 无 返回值:
说明:
源文件: 代码示例:
该函数从 P-tec PCOG1602B LCD 控制器中读出一个地址字节。
xlcd.h
unsigned char ReadAddrXLCD (void);
该函数返回一个 8 位值,这个字节的低 7 位是 7 位地址,第 8 位是 BUSY 状态标志。
该函数从 P-tec PCOG1602B LCD 控制器中读出地址字节。用户必须首 先通过调用 BusyXLCD() 函数来检查 LCD 控制器是否正忙。 从控制器中读出的地址是字符发生器 (CGRAM 还是显示数据
DDRAM 中的地址,取决于前面调用的 Set??RamAddr() 函数,
其中 ?? CG DD
ReadAddrXLCD.c
char address; while(BusyXLCD()); address = ReadAddrXLCD();
ReadDataXLCD
描述: 头文件: 函数原型: 参数: 无 说明:
返回值: 该函数返回地址指定的 8 位数据值。 源文件: 代码示例:
该函数从 P-tec PCOG1602B LCD 控制器中读出一个数据字节。
xlcd.h
char ReadDataXLCD (void);
该函数从 P-tec PCOG1602B LCD 控制器中读出一个数据字节。用户必 须首先通过调用 BusyXLCD() 函数来检查 LCD 控制器是否正忙。 从控制器中读出的数据是来自于字符发生器 (CGRAM 还是显示数据
DDRAM,取决于前面调用的 Set??RamAddr() 函数,其中 ??
CG DD
ReadDataXLCD.c
char data; while (BusyXLCD()); data = ReadDataXLCD();
dsPIC 外设函数库
2005 Microchip Technology Inc. DS51456B_CN 77
dsPIC® 语言工具库
SetCGRamAddr
描述: 该函数设定字符发生器的地址。 头文件: 函数原型: 参数: 返回值: 无 说明:
源文件: 代码示例:
SetDDRamAddr
描述: 该函数设定显示数据的地址。 头文件: 函数原型: 参数: 返回值: 无 说明:
源文件: 代码示例:
xlcd.h
void SetCGRamAddr (unsigned char CGaddr);
CGaddr 字符发生器地址。
该函数设定 P-tec PCOG1602B LCD 控制器的字符发生器地址。用户必 须首先通过调用 BusyXLCD() 函数来检查 LCD 控制器是否正忙。
SetCGRamAddr.c
char cgaddr = 0x1F; while (BusyXLCD()); SetCGRamAddr(cgaddr);
xlcd.h
void SetDDRamAddr (unsigned char DDaddr);
DDaddr 显示数据的地址。
该函数设定 P-tec PCOG1602B LCD 控制器显示数据的地址。用户必须 首先通过调用 BusyXLCD() 函数来检查 LCD 控制器是否正忙。
SetDDRamAddr.c
char ddaddr = 0x10; while (BusyXLCD()); SetDDRamAddr(ddaddr);
WriteDataXLCD
描述:
头文件: 函数原型: 参数:
返回值: 无 说明:
源文件: 代码示例:
该函数向 P-tec PCOG1602B LCD 控制器写入一个数据字节 (一个字 符)。
xlcd.h
void WriteDataXLCD (char data);
data 数据的值可以是任意 8 位的值,但应与 P-tec PCOG1602B LCD
该函数向 P-tec PCOG1602B LCD 控制器写入一个数据字节。 用户必须 首先通过调用 BusyXLCD() 函数来检查 LCD 控制器是否正忙。 写入控制器的数据是存放到字符发生器 (CGRAM 还是显示数据
DDRAM,取决于前面调用的 Set??RamAddr() 函数,其中 ??
CG DD
WriteDataXLCD.c
WriteDataXLCD(0x30);
控制器的字符 RAM 表相对应。
DS51456B_CN 78 2005 Microchip Technology Inc.
WriteCmdXLCD
描述: 头文件: 函数原型: 参数:
返回值: 无 说明:
源文件: 代码示例:
该函数向 P-tec PCOG1602B LCD 控制器写入一个命令。
xlcd.h
void WriteCmdXLCD (unsigned char cmd);
cmd 包含需配置的 LCD 控制器参数,定义如下:
该函数向 P-tec PCOG1602B LCD 控制器写入命令字节。 用户必须首先 通过调用 BusyXLCD() 函数来检查 LCD 控制器是否正忙。
WriteCmdXLCD.c
while(BusyXLCD()); WriteCmdXLCD(EIGHT_BIT & TWO_LINE); WriteCmdXLCD(DON); WriteCmdXLCD(SHIFT_DISP_LEFT);
接口类型
FOUR_BIT EIGHT_BIT
行数
SINLE_LINE TWO_LINE
段数据传输方向
SEG1_50_SEG51_100 SEG1_50_SEG100_51 SEG100_51_SEG50_1 SEG100_51_SEG1_50
数据传输方向
COM
COM1_COM16 COM16_COM1
/ 关控制
显示开
DON DOFF CURSOR_ON CURSOR_OFF BLINK_ON BLINK_OFF
光标或显示移位定义
SHIFT_CUR_LEFT SHIFT_CUR_RIGHT SHIFT_DISP_LEFT SHIFT_DISP_RIGHT
dsPIC 外设函数库
2005 Microchip Technology Inc. DS51456B_CN 79
dsPIC® 语言工具库
3.3.2 使用示例
#define __dsPIC30F6014__ #include <p30fxxxx.h> #include<xlcd.h> /* holds the address of message */ char * buffer; char data ; char mesg1[] = {'H','A','R','D','W','A','R','E','\0'}; char mesg2[] = {'P','E','R','I','P’,’H’,’E’,’R’,’A’,’L’ ‘ ‘, ‘L’,’I’,’B’,’ ‘,'\0'}; int main(void) { /* Set 8bit interface and two line display */ OpenXLCD(EIGHT_BIT & TWO_LINE & SEG1_50_SEG51_100 & COM1_COM16); /* Wait till LCD controller is busy */ while(BusyXLCD()); /* Turn on the display */ WriteCmdXLCD(DON & CURSOR_ON & BLINK_OFF); buffer = mesg1; PutsXLCD(buffer); while(BusyXLCD()); /* Set DDRam address to 0x40 to dispaly data in the second line */ SetDDRamAddr(0x40); while(BusyXLCD()); buffer = mesg2; PutsXLCD(buffer); while(BusyXLCD()); return 0; }
DS51456B_CN 80 2005 Microchip Technology Inc.

3.4 CAN 函数

dsPIC 外设函数库
本节给出了有关 CAN 的各个函数以及使用这些函数的例子。函数也可以用宏来实现。
3.4.1 各函数
CAN1AbortAll CAN2AbortAll
描述: 该函数中止所有等待的发送。 头文件: 函数原型:
参数: 无 返回值: 无 说明:
源文件:
代码示例:
can.h
void CAN1AbortAll(void); void CAN2AbortAll(void);
该函数对 CiCTRL 寄存器中的 ABAT 位置位,从而中止等待的发送。但 是,正在进行的发送不会中止。当消息发送成功中止时,该位由硬件清 零。
CAN1AbortAll.c CAN2AbortAll.c
CAN1AbortAll();
CAN1GetRXErrorCount CAN2GetRXErrorCount
描述: 该函数返回接收错误计数值。 头文件: 函数原型:
参数: 无 返回值: 说明:
源文件:
代码示例:
can.h
unsigned char CAN1GetRXErrorCount(void); unsigned char CAN2GetRXErrorCount(void);
CiRERRCNT 的内容,长度为 8 位。 该函数返回 CiRERRCNT CiEC 寄存器的低字节)的内容,其值表明
接收错误计数。
CAN1GetRXErrorCount.c CAN2GetRXErrorCount.c
unsigned char rx_error_count; rx_error_count = CAN1GetRXErrorCount();
2005 Microchip Technology Inc. DS51456B_CN 81
dsPIC® 语言工具库
CAN1GetTXErrorCount CAN2GetTXErrorCount
描述: 该函数返回发送错误计数值。 头文件: 函数原型:
参数: 无 返回值: 说明:
源文件:
代码示例:
CAN1IsBusOff CAN2IsBusOff
can.h
unsigned char CAN1GetTXErrorCount(void); unsigned char CAN2GetTXErrorCount(void);
CiTERRCNT 中的值,长度为 8 位。 该函数返回 CiTERRCNT CiEC 寄存器的高字节)的内容,其值表明
发送错误计数。
CAN1GetTXErrorCount.c CAN2GetTXErrorCount.c
unsigned char tx_error_count; tx_error_count = CAN1GetTXErrorCount();
描述: 头文件: 函数原型:
参数: 无 返回值:
说明: 源文件:
代码示例:
该函数确定 CAN 节点是否处于总线关闭模式。
can.h
char CAN1IsBusOff(void); char CAN2IsBusOff(void);
如果 TXBO 的值为 “1”,那么返回 “1”,表明总线由于发送错误而 关闭了。 如果 TXBO 的值为 “0”,那么返回 “0”,表明总线没有关闭。
该函数返回 CiINTF 寄存器中 TXBO 位的状态。
CAN1IsBusOff.c CAN2IsBusOff.c
while(CAN1IsBusOff());
CAN1IsRXReady CAN2IsRXReady
描述: 该函数返回接收缓冲器是否为满状态。 头文件: 函数原型:
参数: 返回值:
说明: 该函数返回接收控制寄存器的 RXFUL 位的状态。 源文件:
代码示例:
can.h
char CAN1IsRXReady(char); char CAN2IsRXReady(char);
buffno buffno 的值,指明需要知道其状态的接收缓冲器。 如果 RXFUL 1,表明接收缓冲器中有一个接收到的消息。
如果 RXFUL 0,表明接收缓冲器是空的,可以接收新消息。
CAN1IsRXReady.c CAN2IsRXReady.c
char rx_1_status; rx_1_status = CAN1IsRXReady(1);
DS51456B_CN 82 2005 Microchip Technology Inc.
dsPIC 外设函数库
CAN1IsRXPassive CAN2IsRXPassive
描述: 该函数确定接收器是否处于错误被动状态。 头文件: 函数原型:
参数: 无 返回值:
说明: 源文件:
代码示例:
CAN1IsTXPassive CAN2IsTXPassive
can.h
char CAN1IsRXPassive(void); char CAN2IsRXPassive(void);
如果 RXEP 的值为 “1”,那么返回 “1”,表明节点由于接收错误变 为被动。 如果 RXEP 的值为 “0”,那么返回 “0”,表明总线上没有错误。
该函数返回 CiINTF 寄存器的 RXEP 位的状态。
CAN1IsRXPassive.c CAN2IsRXPassive.c
char rx_bus_status; rx_bus_status = CAN1IsRXPassive();
描述: 该函数确定发送器是否处于错误被动状态。 头文件: 函数原型:
参数: 无 返回值:
说明: 源文件:
代码示例:
can.h
char CAN1IsTXPassive(void); char CAN2IsTXPassive(void);
如果 TXEP 的值为 “1”,那么返回 “1”,表明发送总线上有错误且总 线变为被动。 如果 TXEP 的值为 “0”,那么返回 “0”,表明发送总线上没有错误。
该函数返回 CiINTF 寄存器的 TXEP 位的状态。
CAN1IsTXPassive.c CAN2IsTXPassive.c
char tx_bus_status; tx_bus_status = CAN1IsTXPassive();
2005 Microchip Technology Inc. DS51456B_CN 83
dsPIC® 语言工具库
CAN1IsTXReady CAN2IsTXReady
描述: 头文件: 函数原型:
参数: 返回值:
说明: 源文件:
代码示例:
该函数返回发送器的状态,指明 CAN 节点是否准备好下一次发送。
can.h
char CAN1IsTXReady(char); char CAN2IsTXReady(char);
buffno buffno 的值,指明需要知道其状态的发送缓冲器。 如果 TXREQ 为“1”,返回 “0”,表明发送缓冲器不是空的。
如果 TXREQ 为“0”,返回 “1”,表明发送缓冲器是空的并准备好进 行下一次发送。
该函数返回发送控制寄存器中的 TXREQ 状态位的反码。
CAN1IsTXReady.c CAN2IsTXReady.c
char tx_2_status; tx_2_status = CAN1IsTXReady(2);
CAN1ReceiveMessage CAN2ReceiveMessage
描述: 该函数从接收缓冲器中读出数据。 头文件: 函数原型:
参数:
说明: 返回值: 无。 源文件:
代码示例:
can.h
void CAN1ReceiveMessage(unsigned char * data, unsigned char datalen, char MsgFlag); void CAN2ReceiveMessage(unsigned char * data, unsigned char datalen,char MsgFlag);
data 指向存储接收到的数据的地址的指针。 datalen 要读的数据字节数。 MsgFlag 接收数据的缓冲器编号。
如果为 “1”,读出从 CiRX1B1 CiRX1B4 的数据。 如果为 “0”或其他,读出从 CiRX0B1 CiRX0B4 的数 据。
该函数将接收到的数据读入由输入参数 data 所指向的地址。
CAN1ReceiveMessage.c CAN2ReceiveMessage.c
unsigned char*rx_data; CAN1ReceiveMessage(rx_data, 5, 0);
DS51456B_CN 84 2005 Microchip Technology Inc.
CAN1SendMessage CAN2SendMessage
dsPIC 外设函数库
描述:
头文件: 函数原型:
参数:
返回值: 无 说明:
源文件:
代码示例:
该函数把将要发送的数据写入 TX 寄存器中,设置数据长度并启动发 送。
can.h
void CAN1SendMessage(unsigned int sid, unsigned long eid, unsigned char *data, unsigned char datalen, char MsgFlag); void CAN2SendMessage(unsigned int sid, unsigned long eid, unsigned char *data, unsigned char datalen, char MsgFlag);
sid 要写入 CiTXnSID 寄存器中的 16 位值。
eid 要写入 CiTXnEID CiTXnDLC 寄存器的 32 位值。
data 指向要发送数据的储存地址的指针。 datalen 要发送数据的字节数。 MsgFlag 从中发送数据的缓冲器编号 (“0”、“1”或 “2”)。
该函数将标识值写入 SID EID 寄存器,将要发送的数据写入 TX 寄存 器,设置数据长度并通过置位 TXREQ 位来启动发送。
CAN1SendMessage.c CAN2SendMessage.c
CAN1SendMessage((CAN_TX_SID(1920)) & (CAN_TX_EID_EN) & (CAN_SUB_NOR_TX_REQ), (CAN_TX_EID(12344)) & (CAN_NOR_TX_REQ), Txdata, datalen, tx_rx_no);
CAN_TX_SID(x) x 是所需的 SID 值。
替代远程请求
CAN_SUB_REM_TX_REQ CAN_SUB_NOR_TX_REQ
消息 ID 类型
CAN_TX_EID_EN CAN_TX_EID_DIS
CAN_TX_EID(x) x 是所需的 EID 值。
替代远程请求
CAN_REM_TX_REQ CAN_NOR_TX_REQ
如果是 “1”,数据写入 CiTX1B1 CiTX1B4。 如果是 “2”,数据写入 CiTX2B1 CiTX2B4。 如果是 “0”或其他数,数据写入 CiTX0B1 CiTX0B4
2005 Microchip Technology Inc. DS51456B_CN 85
dsPIC® 语言工具库
CAN1SetFilter CAN2SetFilter
描述: 头文件: 函数原型:
参数:
返回值: 无 说明:
源文件:
代码示例:
该函数为指定的过滤器设置接收过滤器值 (SID EID)。
can.h
void CAN1SetFilter(char filter_no, unsigned int sid, unsigned long eid); void CAN2SetFilter(char filter_no, unsigned int sid, unsigned long eid);
filter_no 必须配置新过滤器值的过滤器 (01234
sid 要写入 CiRXFnSID 寄存器的 16 位值。
eid 要写入 CiRXFnEIDH CiRXFnEIDL 寄存器的 32 位值。
该函数将 sid 中的 16 位值写入 CiRXFnSID 寄存器中,或将 eid 中的 32 位值写入与由 filter_no 指定的过滤器相对应的 CiRXFnEIDH CiRXFnEIDL 寄存器中。 默认为过滤器 0
CAN1SetFilter.c CAN2SetFilter.c
CAN1SetFilter(1, CAN_FILTER_SID(7) & CAN_RX_EID_EN, CAN_FILTER_EID(3));
5)。
CAN_FILTER_SID(x) x 是所需的 SID 值。 要接收的消息类型
CAN_RX_EID_EN CAN_RX_EID_DIS
CAN_FILTER_EID(x) x 是所需的 EID 值。
CAN1SetMask CAN2SetMask
描述: 头文件: 函数原型:
参数:
返回值:
该函数为指定的屏蔽器设置接收屏蔽器值 (SID EID)。
can.h
void CAN1SetMask(char mask_no, unsigned int sid, unsigned long eid); void CAN2SetMask(char mask_no, unsigned int sid, unsigned long eid);
mask_no 要配置屏蔽值的屏蔽器 (“0”或 “1”)。 sid 要写入 CiRXMnSID 寄存器的 16 位值。
eid 要写入 CiRXMnEIDH CiRXMnEIDL 寄存器的 32位值。
CAN_MASK_SID(x) x 是所需的 SID 值。 过滤器中指定的匹配 / 忽略消息类型
CAN_MATCH_FILTER_TYPE CAN_IGNORE_FILTER_TYPE
CAN_MASK_EID(x) x 是所需的 EID 值。
DS51456B_CN 86 2005 Microchip Technology Inc.
CAN1SetMask (续) CAN2SetMask
dsPIC 外设函数库
说明:
源文件:
代码示例:
该函数将 sid 16 位值写入 CiRXFnSID 寄存器,或者将 eid 32 位 值写入与由 mask_no 指定的屏蔽器相对应的 CiRXFnEIDH CiRXFnEIDL 寄存器。
默认为屏蔽器 0
CAN1SetMask.c CAN2SetMask.c
CAN1SetMask(1, CAN_MASK_SID(7) & CAN_MATCH_FILTER_TYPE, CAN_MASK_EID(3));
CAN1SetOperationMode CAN2SetOperationMode
描述: 头文件: 函数原型:
参数:
返回值: 无 说明:
源文件:
代码示例:
该函数配置 CAN 模块
can.h
void CAN1SetOperationMode(unsigned int config); void CAN2SetOperationMode(unsigned int config);
config 要装入 CiCTRL 寄存器的 16 位值,为以下定义的组合。
该函数对 CiCTRL 寄存器中下面的位进行配置:CSIDLREQOP<2:0>CANCKS
CAN1SetOperationMode.c CAN2SetOperationMode.c
CAN1SetOperationMode(CAN_IDLE_STOP & CAN_MASTERCLOCK_0 & CAN_REQ_OPERMODE_DIS & CAN_CAPTURE_DIS);
CAN_IDLE_CON 在空闲模式下 CAN 启用 CAN_IDLE_STOP 在空闲模式下 CAN 停止
CAN_MASTERCLOCK_1 F CAN_MASTERCLOCK_0 FCAN 4 FCY
CAN 操作模式
CAN_REQ_OPERMODE_NOR CAN_REQ_OPERMODE_DIS CAN_REQ_OPERMODE_LOOPBK CAN_REQ_OPERMODE_LISTENONLY CAN_REQ_OPERMODE_CONFIG CAN_REQ_OPERMODE_LISTENALL
捕捉使能 / 禁止
CAN
CAN_CAPTURE_EN CAN_CAPTURE_DIS
CAN 为 FCY
2005 Microchip Technology Inc. DS51456B_CN 第 87
dsPIC® 语言工具库
CAN1SetOperationModeNoWait CAN2SetOperationModeNoWait
描述: 头文件: 函数原型:
参数:
返回值: 无 说明:
源文件:
代码示例:
该函数中止等待的发送并对 CAN 模块进行配置。
can.h
void CAN1SetOperationModeNoWait( unsigned int config); void CAN2SetOperationModeNoWait( unsigned int config);
config 要装入 CiCTRL 寄存器的 16 位值,为以下定义的组合。
该函数对 ABAT 位进行置位来中止所有等待的发送,并对 CiCTRL 寄存 器中下面的位进行配置:CSIDLREQOP<2:0> CANCKS
CAN1SetOperationModeNoWait.c CAN2SetOperationModeNoWait.c
CAN1SetOperationModeNoWait(CAN_IDLE_CON & CAN_MASTERCLOCK_1 & CAN_REQ_OPERMODE_LISTEN & CAN_CAPTURE_DIS_NO_WAIT);
CAN_IDLE_CON_NO_WAIT 在空闲模式下 CAN 启用 CAN_IDLE_STOP_NO_WAIT 在空闲模式下 CAN 停止
CAN_MASTERCLOCK_1_NO_WAIT F CAN_MASTERCLOCK_0_NO_WAIT FCAN 4 FCY
CAN 操作模式
CAN_REQ_OPERMODE_NOR_NO_WAIT CAN_REQ_OPERMODE_DIS_NO_WAIT CAN_REQ_OPERMODE_LOOPBK_NO_WAIT CAN_REQ_OPERMODE_LISTENONLY_NO_WAIT CAN_REQ_OPERMODE_CONFIG_NO_WAIT CAN_REQ_OPERMODE_LISTENALL_NO_WAIT
捕捉使能 / 禁止
CAN
CAN_CAPTURE_EN_NO_WAIT CAN_CAPTURE_DIS_NO_WAIT
CAN 为 FCY
CAN1SetRXMode CAN2SetRXMode
描述: 头文件: 函数原型:
参数:
DS51456B_CN 88 2005 Microchip Technology Inc.
该函数对 CAN 接收器进行配置。
can.h
void CAN1SetRXMode(char buffno, unsigned int config); void CAN2SetRXMode(char buffno, unsigned int config);
buffno buffno 指明要配置的控制寄存器。 config 要写入 CiRXnCON 寄存器的值,为以下定义的组合。
RXFUL
清零
CAN_RXFUL_CLEAR
双缓冲器使能 / 禁止
CAN_BUF0_DBLBUFFER_EN CAN_BUF0_DBLBUFFER_DIS
CAN1SetRXMode (续) CAN2SetRXMode
返回值: 无 说明:
源文件:
代码示例:
该函数对 CiRXnCON 寄存器下面的位进行配置: RXRTRRXFUL (只能设置为 0)、 RXM<1:0> DBEN
CAN1SetRXMode.c CAN2SetRXMode.c
CAN1SetRXMode(0,CAN_RXFUL_CLEAR & CAN_BUF0_DBLBUFFER_EN);
CAN1SetTXMode (function) CAN2SetTXMode
描述: 头文件: 函数原型:
参数:
返回值: 无 说明:
源文件:
代码示例:
该函数配置 CAN 发送器模块。
can.h
void CAN1SetTXMode(char buffno, unsigned int config); void CAN2SetTXMode(char buffno, unsigned int config);
buffno buffno 指明要配置的控制寄存器。 config 要写入 CiTXnCON 寄存器的值,为以下定义的组合。
消息发送请求
CAN_TX_REQ CAN_TX_STOP_REQ
消息发送优先级
CAN_TX_PRIORITY_HIGH CAN_TX_PRIORITY_HIGH_INTER CAN_TX_PRIORITY_LOW_INTER CAN_TX_PRIORITY_LOW
该函数对 CiTXnCON 寄存器下面的位进行配置: TXRTRTXREQDLC TXPRI<1:0>
CAN1SetTXMode.c CAN2SetTXMode.c
CAN1SetTXMode(1, CAN_TX_STOP_REQ & CAN_TX_PRIORITY_HIGH);
dsPIC 外设函数库
2005 Microchip Technology Inc. DS51456B_CN 89
dsPIC® 语言工具库
CAN1Initialize CAN2Initialize
描述: 头文件: 函数原型:
参数:
返回值: 无 说明:
源文件:
代码示例:
该函数配置 CAN 模块。
can.h
void CAN1Initialize(unsigned int config1, unsigned int config2); void CAN2Initialize(unsigned int config1, unsigned int config2);
config1 要写入 CiCFG1 寄存器的值,为以下定义的组合。
config2 要写入 CiCFG2 寄存器的值,为以下定义的组合。
该函数对寄存器 CiCFG1 CiCFG2 的以下位进行配置: SJW<1:0>BRP<5:0>CANCAPWAKEFILSEG2PH<2:0> SEGPHTSSAMSEG1PH<2:0> PRSEG<2:0>
CAN1Initialize.c CAN2Initialize.c
CAN1Initialize(CAN_SYNC_JUMP_WIDTH2 & CAN_BAUD_PRE_SCALE(2), CAN_WAKEUP_BY_FILTER_DIS & CAN_PHASE_SEG2_TQ(5) & CAN_PHASE_SEG1_TQ(4) & CAN_PROPAGATIONTIME_SEG_TQ(4) & CAN_SEG2_FREE_PROG & CAN_SAMPLE1TIME);
同步跳转宽度
CAN_SYNC_JUMP_WIDTH1 CAN_SYNC_JUMP_WIDTH2 CAN_SYNC_JUMP_WIDTH3 CAN_SYNC_JUMP_WIDTH4
波特率预分频比
CAN_BAUD_PRE_SCALE(x) (((x-1) & 0x3f) | 0xC0)
选择 CAN 总线滤波器用于唤醒
CAN_WAKEUP_BY_FILTER_EN CAN_WAKEUP_BY_FILTER_DIS
传播段长度
CAN
CAN_PROPAGATIONTIME_SEG_TQ(x)
(((x-1) & 0x7) | 0xC7F8)
相位段 1 的长度
CAN
CAN_PHASE_SEG1_TQ(x)
((((x-1) & 0x7) *0x8) | 0xC7C7)
相位段 2 的长度
CAN
CAN_PHASE_SEG2_TQ(x)
((((x-1) & 0x7) *0x100) | 0xC0FF)
相位段 2 模式
CAN
CAN_SEG2_FREE_PROG CAN_SEG2_TIME_LIMIT_SET
CAN
总线采样
CAN_SAMPLE3TIMES CAN_SAMPLE1TIME
DS51456B_CN 90 2005 Microchip Technology Inc.
ConfigIntCAN1 ConfigIntCAN2
dsPIC 外设函数库
描述: 头文件: 函数原型:
参数:
返回值: 无 说明:
源文件:
该函数对 CAN 中断进行配置。
can.h
void ConfigIntCAN1(unsigned int config1, unsigned int config2); void ConfigIntCAN2(unsigned int config1, unsigned int config2);
config1 定义如下的各个中断允许 / 禁止信息:
config2 定义如下的 CAN 中断优先级和允许 / 禁止信息:
该函数对 CAN 中断进行配置。它允许 / 禁止各个 CAN 中断。它还可以 允许 / 禁止 CAN 中断并设置优先级。
ConfigIntCAN1.c ConfigIntCAN2.c
用户必须选择对所有各中断进行允许或禁止。 中断允许
CAN_INDI_INVMESS_EN CAN_INDI_WAK_EN CAN_INDI_ERR_EN CAN_INDI_TXB2_EN CAN_INDI_TXB1_EN CAN_INDI_TXB0_EN CAN_INDI_RXB1_EN CAN_INDI_RXB0_EN
中断禁止
CAN_INDI_INVMESS_DIS CAN_INDI_WAK_DIS CAN_INDI_ERR_DIS CAN_INDI_TXB2_DIS CAN_INDI_TXB1_DIS CAN_INDI_TXB0_DIS CAN_INDI_RXB1_DIS CAN_INDI_RXB0_DIS
中断允许 / 禁止
CAN
CAN_INT_ENABLE CAN_INT_DISABLE
中断优先级
CAN
CAN_INT_PRI_0 CAN_INT_PRI_1 CAN_INT_PRI_2 CAN_INT_PRI_3 CAN_INT_PRI_4 CAN_INT_PRI_5 CAN_INT_PRI_6 CAN_INT_PRI_7
2005 Microchip Technology Inc. DS51456B_CN 91
dsPIC® 语言工具库
ConfigIntCAN1 (续) ConfigIntCAN2
代码示例:
3.4.2 各个宏
EnableIntCAN1 EnableIntCAN2
描述: 头文件: 参数: 无 说明: 代码示例:
DisableIntCAN1 DisableIntCAN2
描述: 头文件: 参数: 无 说明: 代码示例:
ConfigIntCAN1(CAN_INDI_INVMESS_EN & CAN_INDI_WAK_DIS & CAN_INDI_ERR_DIS & CAN_INDI_TXB2_DIS & CAN_INDI_TXB1_DIS & CAN_INDI_TXB0_DIS & CAN_INDI_RXB1_DIS & CAN_INDI_RXB0_DIS , CAN_INT_PRI_3 & CAN_INT_ENABLE);
该宏允许 CAN 中断。
can.h
该宏置位中断允许控制寄存器的 CAN 中断允许位。
EnableIntCAN1;
该宏禁止 CAN 中断。
can.h
该宏清零中断允许控制寄存器的 CAN 中断允许位。
DisableIntCAN2;
SetPriorityIntCAN1 SetPriorityIntCAN2
描述: 头文件: 参数: 说明: 代码示例:
DS51456B_CN 92 2005 Microchip Technology Inc.
该宏设置 CAN 中断的优先级。
can.h
priority
该宏对中断优先级控制寄存器的 CAN 中断优先位进行设置。
SetPriorityIntCAN1(2);
dsPIC 外设函数库
3.4.3 使用示例
#define __dsPIC30F6014__ #include<p30fxxxx.h> #include<can.h> #define dataarray 0x1820 int main(void) { /* Length of data to be transmitted/read */ unsigned char datalen; unsigned char Txdata[] = {'M','I','C','R','O','C','H','I','P','\0'}; unsigned int TXConfig, RXConfig; unsigned long MaskID,MessageID; char FilterNo,tx_rx_no; unsigned char * datareceived = (unsigned char *) dataarray; /* Holds the data received */ /* Set request for configuration mode */ CAN1SetOperationMode(CAN_IDLE_CON & CAN_MASTERCLOCK_1 & CAN_REQ_OPERMODE_CONFIG & CAN_CAPTURE_DIS); while(C1CTRLbits.OPMODE <=3); /* Load configuration register */ CAN1Initialize(CAN_SYNC_JUMP_WIDTH2 & CAN_BAUD_PRE_SCALE(2), CAN_WAKEUP_BY_FILTER_DIS & CAN_PHASE_SEG2_TQ(5) & CAN_PHASE_SEG1_TQ(4) & CAN_PROPAGATIONTIME_SEG_TQ(4) & CAN_SEG2_FREE_PROG & CAN_SAMPLE1TIME); /* Load Acceptance filter register */ FilterNo = 0; CAN1SetFilter(FilterNo, CAN_FILTER_SID(1920) & CAN_RX_EID_EN, CAN_FILTER_EID(12345)); /* Load mask filter register */ CAN1SetMask(FilterNo, CAN_MASK_SID(1920) & CAN_MATCH_FILTER_TYPE, CAN_MASK_EID(12344)); /* Set transmitter and receiver mode */ tx_rx_no = 0; CAN1SetTXMode(tx_rx_no, CAN_TX_STOP_REQ & CAN_TX_PRIORITY_HIGH ); CAN1SetRXMode(tx_rx_no, CAN_RXFUL_CLEAR & CAN_BUF0_DBLBUFFER_EN); /* Load message ID , Data into transmit buffer and set transmit request bit */ datalen = 8; CAN1SendMessage((CAN_TX_SID(1920)) & CAN_TX_EID_EN & CAN_SUB_NOR_TX_REQ, (CAN_TX_EID(12344)) & CAN_NOR_TX_REQ, Txdata,datalen,tx_rx_no);
2005 Microchip Technology Inc. DS51456B_CN 93
dsPIC® 语言工具库
/* Set request for Loopback mode */ CAN1SetOperationMode(CAN_IDLE_CON & CAN_CAPTURE_DIS & CAN_MASTERCLOCK_1 & CAN_REQ_OPERMODE_LOOPBK); while(C1CTRLbits.OPMODE !=2); /* Wait till message is transmitted completely */ while(!CAN1IsTXReady(0)) /* Wait till receive buffer contain valid message */ while(!CAN1IsRXReady(0)); /* Read received data from receive buffer and store it into user defined dataarray */ CAN1ReceiveMessage(datareceived, datalen, tx_rx_no); while(1); return 0; }
DS51456B_CN 94 2005 Microchip Technology Inc.

3.5 ADC12 函数

本节给出了关于 12 ADC 的各个函数及其使用示例。这些函数也可以用宏来实现。
3.5.1 各个函数
BusyADC12
描述: 头文件: 函数原型: 参数: 无 返回值:
说明:
源文件: 代码示例:
CloseADC12
dsPIC 外设函数库
该函数返回 ADC 转换的状态。
adc12.h
char BusyADC12(void);
如果 DONE 的值为 “0”,那么返回 “1 “,表明 ADC 正忙于转换。 如果 DONE 的值为 “1”,那么返回 “0”,表明 ADC 已经完成了转 换。
该函数返回 ADCON1 <DONE> 位状态的反码,表明 ADC 是否正忙于 转换。
BusyADC12.c
while(BusyADC12());
描述: 头文件: 函数原型: 参数: 无 返回值: 无 说明:
源文件: 代码示例:
该函数关闭 ADC 模块并禁止 ADC 中断。
adc12.h
void CloseADC12(void);
该函数首先禁止 ADC 中断,然后关闭 ADC 模块。同时清除中断标志位
ADIF)。
CloseADC12.c
CloseADC12();
ConfigIntADC12
描述: 头文件: 函数原型: 参数:
该函数配置 ADC 中断。
adc12.h
void ConfigIntADC12(unsigned int config);
config 如下定义的 ADC 中断优先级和允许 / 禁止信息:
中断允许 / 禁止
ADC
ADC_INT_ENABLE ADC_INT_DISABLE
2005 Microchip Technology Inc. DS51456B_CN 95
dsPIC® 语言工具库
ConfigIntADC12 (续)
返回值: 无 说明:
源文件: 代码示例:
ConvertADC12
描述: 头文件: 函数原型: 参数: 无 返回值: 无 说明:
源文件: 代码示例:
ADC 中断优先级
ADC_INT_PRI_0 ADC_INT_PRI_1 ADC_INT_PRI_2 ADC_INT_PRI_3 ADC_INT_PRI_4 ADC_INT_PRI_5 ADC_INT_PRI_6 ADC_INT_PRI_7
该函数清除中断标志位 (ADIF),然后设置中断优先级并允许 / 禁止中 断。
ConfigIntADC12.c
ConfigIntADC12(ADC_INT_PRI_6 & ADC_INT_ENABLE);
该函数启动 A/D 转换。
adc12.h
void ConvertADC12(void);
该函数通过清除 ADCON1 <SAMP> 位来停止采样并启动转换。 这只有在通过清除 ADCON1 <SSRC> 位选择 A/D 转换触发源为手动 时才发生。
ConvertADC12.c
ConvertADC12();
OpenADC12
描述: 头文件: 函数原型:
参数:
DS51456B_CN 96 2005 Microchip Technology Inc.
该函数对 ADC 进行配置。
adc12.h
void OpenADC12(unsigned int config1, unsigned int config2, unsigned int config3, unsigned int configport, unsigned int configscan)
config1 包含 ADCON1 寄存器中要配置的参数,定义如下:
模块启用 / 关闭
ADC_MODULE_ON ADC_MODULE_OFF
空闲模式工作
ADC_IDLE_CONTINUE ADC_IDLE_STOP
Loading...