winavr库函数介绍

上传人:n**** 文档编号:88890638 上传时间:2019-05-12 格式:PDF 页数:113 大小:521.02KB
返回 下载 相关 举报
winavr库函数介绍_第1页
第1页 / 共113页
winavr库函数介绍_第2页
第2页 / 共113页
winavr库函数介绍_第3页
第3页 / 共113页
winavr库函数介绍_第4页
第4页 / 共113页
winavr库函数介绍_第5页
第5页 / 共113页
点击查看更多>>
资源描述

《winavr库函数介绍》由会员分享,可在线阅读,更多相关《winavr库函数介绍(113页珍藏版)》请在金锄头文库上搜索。

1、 avr-libc 参考手册 1.4.4 Generated by Doxygen 1.4.6 Thu Apr 20 23:34:14 2006 翻译:杨子江 2007-2-1 6 avr-libc 模块文件 9 6 6 a av vr r- -l li ib bc c 模模块块文文件件 6.1 : 诊断 6.1.1 详细描述 #include 这个头文件定义了调试的帮助。 由于使用本库的许多应用程序没有标准错误输出流可供使用, 默认情况下不允许产生一 个可打印的错误信息。应用程序在包含头文件之前定义宏 _ASSERT_USE_STDERR 错误信息才会被生成。默认情况下,只有调用 abort

2、()才会挂起应用程序。 ? 定义定义 #define assert(expression) 参数: expression 对表达式进行测试。 宏 assert()测试给定的参数 expression,如果结果为假,调用 assert()的进程将被终止。一 条诊断信息写入 stderr 并且调用函数 abort(),可以有效终止程序。 如果 expression 为真,宏 assert()不进行任何操作。 如果编译时定义了宏 NDEBUG(例如使用编译器选项-DNDEBUG),则宏 assert()将会 被忽略。 6.2 :Bootloader 功能支持 6.2.1 详细描述 #include

3、#include 这个模块定义的宏提供 C 语言的接口支持某些 AVR 单片机的 Bootloader 功能。这些宏 设计为可在所有不同大小的 Flash 存储器下工作。 注意: 6 avr-libc 模块文件 10 不是所有的 AVR 单片机都提供 bootloader 支持。详情请查看 AVR 单片机的数据手册。 Todo 来自 Marek 的 Email:小型器件(除了 ATmega64/128),_SPM_REG 是在 I/O 空间中,使用”in” 和”out”指令可以生成较短的代码-由于 bootloader 空间有限,这可能是一个重要的优化方法。 ? API 用法示例用法示例 下面

4、的代码显示了 boot API 的典型用法。 #include #include #include void boot_program_page (uint32_t page, uint8_t *buf) uint16_t i; uint8_t sreg; /关中断 sreg = SREG; cli(); eeprom_busy_wait (); boot_page_erase (page); boot_spm_busy_wait (); /等待 Flash 擦除结束 for (i=0; i:EEPROM 操作 6.3.1 详细描述 #include 这个头文件声明了操作 AVR 单片机内部数

5、据 EEPROM 的库函数的接口。库使用一个 简单查询方式的接口。应用程序需要使用中断方式操作 EEPROM 需要自己编程,使用中断 6 avr-libc 模块文件 16 方式可以确保不会浪费时间在查询循环中。 注意: 所有对 EEPROM 的读/写操作必须保证 EEPROM 已经准备好。 如果在 EEPROM 写操作周期内对 其进行读/写操作可能造成非常大的延时。应在对 EEPROM 进行操作前先查询 EEPROM,比如 用函数 eeprom_is_ready()查询 EEPROM 的工作状态。在 EEPROM 准备好的情况下再进行操作, 从而保证程序的实时性。 这个头文件声明直接调用汇编子

6、程序的内联函数。 这是为了防止编译器产生对由函数调用保护和 恢复的寄存器进行压栈/出栈(push/pops)的操作。这种特殊的函数调用方式也可用于 EEPROM 程序,例如通过传递参数值到_tmp_reg_,则 EEPROM 地址在 X,存储器地址在 Z 寄存器中。 方法是使用针对代码大小的优化。 目前支持两种 EEPROM 寄存器位置设定:0x1F,0x20,0x21 或者 0x1C,0x1D,0x1E(见 _EEPROM_REG_LOCATIONS_)。由于这些函数会修改 IO 寄存器,因此这些函数是不可重 入的。如果这些中断和正常程序都用到这些函数,应用程序必须保证妥善地进行保护(例如在

7、调 用这些函数之前禁止中断)。 ? avr-libc 声明声明 #define EEMEM _attribute_(section(“.eeprom”) #define eeprom_is_ready() #define eeprom_busy_wait() do while (!eeprom_is_ready() uint8_t eeprom_read_byte (const uint8_t *addr) uint16_t eeprom_read_word (const uint16_t *addr) void eeprom_read_block (void *pointer_ram, co

8、nst void *pointer_eeprom,size_t n) void eeprom_write_byte (uint8_t *addr, uint8_t value) void eeprom_write_word (uint16_t *addr, uint16_t value) void eeprom_write_block (const void *pointer_ram, void *pointer_eeprom,size_t n) ? 兼容兼容 IAR C 的定义的定义 #define _EEPUT(addr, val) eeprom_write_byte (uint8_t *

9、)(addr),(uint8_-t)(val) #define _EEGET(var, addr) (var) = eeprom_read_byte (uint8_t *)(addr) ? 定义定义 #define _EEPROM_REG_LOCATIONS_ 1C1D1E 6.3.2 Define 文件 6.3.2.1 #define _EEPROM_REG_LOCATIONS_ 1C1D1E 为了适应不同的控制器中 EEPROM 寄存器存在于不同的存储器空间, EEPROM 函数估 6 avr-libc 模块文件 17 计_EEPROM_REG_LOCATIONS_的值:假定该宏由器件的

10、IO 头文件定义为包含 6 个大 写字母的十六进制数字编码,包括了 EECR、EEDR 和 EEAR 的地址。前两个字母为 EECR 地址,接着两个字母为 EEDR 地址,最后两个字母为 EEAR 地址。默认的 1C1D1E 对于多 数控制器的寄存器位置是有效的。该定义符号的值用于将自己附加到汇编函数的基本名称 中。 6.3.2.2 #define _EEGET(var, addr) (var) = eeprom_read_byte (uint8_t *)(addr) 从 EEPROM 读取一个字节。该定义是为了兼容 IAR C。 6.3.2.3 #define _EEPUT(addr, va

11、l) eeprom_write_byte (uint8_t *)(addr), (uint8_t)(val) 向 EEPROM 写入一个字节。该定义是为了兼容 IAR C。 6.3.2.4 #define EEMEM _attribute_(section(“.eeprom”) 用该属性声明的变量会被放置在.eeprom 段。 6.3.2.5 #define eeprom_busy_wait()do while (!eeprom_is_ready() 如果 EEPROM 忙,等待。 返回值: 无。 6.3.2.6 #define eeprom_is_ready() 返回值: 如果 EEPROM

12、 准备好读/写操作,则函数返回 1;否则返回 0。 6.3.3 Function 文件 6.3.3.1 void eeprom_read_block (void *pointer_ram, const void *pointer_eeprom, size_t n) 从EEPROM的地址pointer_eeprom处开始读取n字节数据保存到RAM地址pointer_ram 开始的一片区域中。 常量 n 小于等于 256 字节时使用库函数。 数据块的大小编译时未知或者 n 大于 256 时,将扩展一个内联的循环。 6.3.3.2 uint8_t eeprom_read_byte (const ui

13、nt8_t *addr) 从 EEPROM 的地址 addr 读取一个字节。 6 avr-libc 模块文件 18 6.3.3.3 uint16_t eeprom_read_word (const uint16_t *addr) 从 EEPROM 的地址 addr 读取一个字(小端模式)。 6.3.3.4 void eeprom_write_block (const void *pointer_ram, void *pointer_eeprom, size_t n) 将 RAM 地址 pointer_ram 中的 n 字节数据写入 EEPROM 地址 pointer_eeprom 开始的一 片

14、区域中。 6.3.3.5 void eeprom_write_byte(uint8_t *addr, uint8_t value) 将一个字节数据 value 写入 EEPROM 的地址 addr 处。 6.3.3.6 void eeprom_write_word(uint16_t *addr, uint16_t value) 将一个字数据 value 写入 EEPROM 的地址 addr 处。 6.4 :AVR 器件相关的 IO 定义 #include 该头文件通过编译器命令行选项-mmcu=包含针对器件的适当 IO 定义。 这是通过包含适 当的头文件来实现的,头文件不能直接包含在用户程序中

15、。 一些 AVR 单片机公共的寄存器名在头文件中定义, 但是多数的细节在各自的包含 文件中定义。 注意该头文件包含: #include 细节请看:特殊功能寄存器。 该头文件包含了所有Atmel公司的数据手册中提到的IO寄存器和提到的数据位的定义。 注意,Atmel 公司的命名习惯不是完全一致的,因此同样的功能在不同的器件中有时 i 会有 不同的名称。 该头文件还包含了中断处理程序的定义。 最后,定义了下列宏: ? RAMEND 该常量定义了片内 RAM 的结束地址。 ? XRAMEND 该常量定义了 RAM 可能的结束地址。对于不能外扩 RAM 的器件,该常量等于 RAMEND。 ? E2EN

16、D 该常量定义了片内 EEPROM 的结束地址。 6 avr-libc 模块文件 19 ? FLASHEND 该常量定义了 Flash 的结束字节地址。 ? SPM_PAGESIZE 对于支持 bootloader 的设备,该常量定义了 SPM 指令可以使用的 Flash 页的大小(按照 字节计算)。 6.5 :程序空间中的字符串 6.5.1 详细描述 #include #include 该模块的函数提供的接口,使用户程序可以访问存储于器件的程序存储器空间(Flash 存储器)中的数据。要使用这些函数,目标器件必须支持 LPM 或 ELPM 指令。 注意: 这些函数试图提供与 IAR C 的头文件兼容的定义,以简化程序在不同的编译器中的移植。但是 这些定义并不保证 100的兼容性(GCC 还没有完全支持多重地址空间)。 如果想操作完全位于 RAM 中的字符串, 请使用: 标准字符串中定义的标准字符串函数。 如果可能,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 其它相关文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号