首页 winavr库函数介绍

winavr库函数介绍

举报
开通vip

winavr库函数介绍avr-libc参考手册1.4.4GeneratedbyDoxygen1.4.6ThuApr2023:34:142006翻译:杨子江2007-2-16avr-libc模块文件–9–66aavvrr--lliibbcc模模块块文文件件6.1<assert.h>:诊断6.1.1详细描述#include<assert.h>这个头文件定义了调试的帮助。由于使用本库的许多应用程序没有标准错误输出流可供使用,默认情况下不允许产生一个可打印的错误信息。应用程序在包含头文件<a...

winavr库函数介绍
avr-libc参考手册1.4.4GeneratedbyDoxygen1.4.6ThuApr2023:34:142006翻译:杨子江2007-2-16avr-libc模块文件–9–66aavvrr--lliibbcc模模块块文文件件6.1<assert.h>:诊断6.1.1详细描述#include<assert.h>这个头文件定义了调试的帮助。由于使用本库的许多应用程序没有 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 错误输出流可供使用,默认情况下不允许产生一个可打印的错误信息。应用程序在包含头文件<assert.h>之前定义宏__ASSERT_USE_STDERR错误信息才会被生成。默认情况下,只有调用abort()才会挂起应用程序。z定义#defineassert(expression)参数:expression对 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 达式进 行测 数字推理题500道详解公务员考试成语大全公务员考试常识4000题公务员行测学霸笔记图行测常识900题及答案 试。宏assert()测试给定的参数expression,如果结果为假,调用assert()的进程将被终止。一条诊断信息写入stderr并且调用函数abort(),可以有效终止程序。如果expression为真,宏assert()不进行任何操作。如果编译时定义了宏NDEBUG(例如使用编译器选项-DNDEBUG),则宏assert()将会被忽略。6.2<avr/boot.h>:Bootloader功能支持6.2.1详细描述#include<avr/io.h>#include<avr/boot.h>这个模块定义的宏提供C语言的接口支持某些AVR单片机的Bootloader功能。这些宏 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 为可在所有不同大小的Flash存储器下工作。注意:6avr-libc模块文件–10–不是所有的AVR单片机都提供bootloader支持。详情请查看AVR单片机的数据手册。Todo来自Marek的Email:小型器件(除了ATmega64/128),__SPM_REG是在I/O空间中,使用”in”和”out”指令可以生成较短的代码-由于bootloader空间有限,这可能是一个重要的优化 方法 快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载 。zAPI用法示例下面的代码显示了bootAPI的典型用法。#include<inttypes.h>#include<avr/interrupt.h>#include<avr/pgmspace.h>voidboot_program_page(uint32_tpage,uint8_t*buf){uint16_ti;uint8_tsreg;//关中断sreg=SREG;cli();eeprom_busy_wait();boot_page_erase(page);boot_spm_busy_wait();//等待Flash擦除结束for(i=0;i<SPM_PAGESIZE;i+=2){//将数据转换成小端模式uint16_tw=*buf++;w+=(*buf++)<<8;boot_page_fill(page+i,w);}boot_page_write(page);//在Flash页存储缓冲数据boot_spm_busy_wait();//等待Flash写入结//再使能RWW-section//如果要在引导装入后跳转到应用程序需要这样操作boot_rww_enable();//重开中断(如果中断原来是打开的)SREG=sreg;}6avr-libc模块文件–11–z定义#defineBOOTLOADER_SECTION__attribute__((section(“.bootloader”)))#defineboot_spm_interrupt_enable()(__SPM_REG|=(uint8_t)_BV(SPMIE))#defineboot_spm_interrupt_disable()(__SPM_REG&=(uint8_t)∼_BV(SPMIE))#defineboot_is_spm_interrupt()(__SPM_REG&(uint8_t)_BV(SPMIE))#defineboot_rww_busy()(__SPM_REG&(uint8_t)_BV(__COMMON_ASB))#defineboot_spm_busy()(__SPM_REG&(uint8_t)_BV(SPMEN))#defineboot_spm_busy_wait()do{}while(boot_spm_busy())#defineGET_LOW_FUSE_BITS(0x0000)#defineGET_LOCK_BITS(0x0001)#defineGET_EXTENDED_FUSE_BITS(0x0002)#defineGET_HIGH_FUSE_BITS(0x0003)#defineboot_lock_fuse_bits_get(address)#defineboot_page_fill(address,data)__boot_page_fill_normal(address,data)#defineboot_page_erase(address)__boot_page_erase_normal(address)#defineboot_page_write(address)__boot_page_write_normal(address)#defineboot_rww_enable()__boot_rww_enable()#defineboot_lock_bits_set(lock_bits)__boot_lock_bits_set(lock_bits)#defineboot_page_fill_safe(address,data)#defineboot_page_erase_safe(address)#defineboot_page_write_safe(address)#defineboot_rww_enable_safe()#defineboot_lock_bits_set_safe(lock_bits)6.2.2Define文件6.2.2.1#defineboot_is_spm_interrupt()(__SPM_REG&(uint8_t)_-BV(SPMIE))检查是否使能SPM中断。6.2.2.2#defineboot_lock_bits_set(lock_bits)__boot_lock_bits_set(lock_bits)设置bootloader锁定位。参数:lock_bits置1一位BootLoader锁定位的掩码。注意:在这里,“置1一位”将会写入0值。同时要注意该命令只能用于编程BLBxx位。例如,要禁止SPM指令对Flash的BootLoader存储器段进行写操作,你可以如下所示6avr-libc模块文件–12–使用该宏:boot_lock_bits_set(_BV(BLB12));注意:和其他锁定位一样,BootLoader锁定位一旦设置就不能再清除,除非芯片擦除包括擦除bootloader本身。6.2.2.3#defineboot_lock_bits_set_safe(lock_bits)源代码:do{\boot_spm_busy_wait();\eeprom_busy_wait();\boot_lock_bits_set(lock_bits);\}while(0)等待eeprom和spm操作完成后再设置锁定位,其余与boot_lock_bits_set()相同。6.2.2.4#defineboot_lock_fuse_bits_get(address)源代码:(__extension__({\uint8_t__result;\__asm____volatile__\(\“ldir30,%3\n\t”\“ldir31,0\n\t”\“sts%1,%2\n\t”\“lpm%0,Z\n\t”\:“=r”(__result)\:“i”(_SFR_MEM_ADDR(__SPM_REG)),\“r”((uint8_t)__BOOT_LOCK_BITS_SET),\“M”(address)\:“r0”,“r30”,“r31”\);\__result;\}))读取给定地址的锁定位或熔丝位。参数:Address可以是GET_LOW_FUSE_BITS,GET_LOCK_BITS,6avr-libc模块文件–13–GET_EXTENDED_FUSE_BITS或GET_HIGH_FUSE_BITS之一。注意:锁定位和熔丝位返回的是物理值,返回0表示相应的熔丝位或锁定位已被编程。6.2.2.5#defineboot_page_erase(address)__boot_page_erase_normal(address)擦除包含address地址的Flash页。注意:address是指Flash的字节地址,不是字地址。6.2.2.6#defineboot_page_erase_safe(address)源代码:do{\boot_spm_busy_wait();\eeprom_busy_wait();\boot_page_erase(address);\}while(0)等待eeprom和spm操作完成后再擦除页,其余与boot_page_erase()相同。6.2.2.7#defineboot_page_fill(address,data)__boot_page_fill_normal(address,data)将待写入address地址的数据字data写入页临时缓冲区。注意:地址address是字节地址,数据是字(16位)。AVR单片机一次向缓冲区写入一个字,但是按照字节方式进行寻址!因此,一定要将地址增量设为2,并且按照字的格式一次送入两个字节的数据!数据的低8位写到低位地址,数据的高8位写入高位地址。6.2.2.8#defineboot_page_fill_safe(address,data)源代码:do{\boot_spm_busy_wait();\eeprom_busy_wait();\boot_page_fill(address,data);\}while(0)6avr-libc模块文件–14–等待eeprom和spm操作完成后再填充页,其余与boot_page_fill()相同。6.2.2.9#defineboot_page_write(address)__boot_page_write_normal(address)将bootloader页临时缓冲区的内容写入包含address地址的Flash页。注意:address是指Flash的字节地址,不是字地址。6.2.2.10#defineboot_page_write_safe(address)源代码:do{\boot_spm_busy_wait();\eeprom_busy_wait();\boot_page_write(address);\}while(0)等待eeprom和spm操作完成后再页写入,其余与boot_page_write()相同。6.2.2.11#defineboot_rww_busy()(__SPM_REG&(uint8_t)_BV(__-COMMON_ASB))检查RWW区域是否繁忙。6.2.2.12#defineboot_rww_enable()__boot_rww_enable()使能Read-While-Write存储器区。6.2.2.13#defineboot_rww_enable_safe()源代码:do{\boot_spm_busy_wait();\eeprom_busy_wait();\boot_rww_enable();\}while(0)等待eeprom和spm操作完成后再使能RWW存储器区,其余与boot_rww_enable()相同。6.2.2.14#defineboot_spm_busy()(__SPM_REG&(uint8_t)_BV(SPMEN))检查SPM指令是否繁忙。6avr-libc模块文件–15–6.2.2.15#defineboot_spm_busy_wait()do{}while(boot_spm_busy())当SPM指令繁忙时,等待。6.2.2.16#defineboot_spm_interrupt_disable()(__SPM_REG&=(uint8_t)∼_BV(SPMIE))禁止SPM中断。6.2.2.17#defineboot_spm_interrupt_enable()(__SPM_REG|=(uint8_t)_-BV(SPMIE))使能SPM中断。6.2.2.18#defineBOOTLOADER_SECTION__attribute__((section(“.bootloader”)))用于声明函数和变量。用BOOTLOADER_SECTION声明的程序和变量会被放置在.bootloader段中。该段的内容在连接时可被重定向到任何地址(如bootloader所在的NRWW区)。6.2.2.19#defineGET_EXTENDED_FUSE_BITS(0x0002)读扩展熔丝位的地址,用于boot_lock_fuse_bits_get函数。6.2.2.20#defineGET_HIGH_FUSE_BITS(0x0003)读高位熔丝位的地址,用于boot_lock_fuse_bits_get函数。6.2.2.21#defineGET_LOCK_BITS(0x0001)读锁定位的地址,用于boot_lock_fuse_bits_get函数。6.2.2.22#defineGET_LOW_FUSE_BITS(0x0000)读低位熔丝位的地址,用于boot_lock_fuse_bits_get函数。6.3<avr/eeprom.h>:EEPROM操作6.3.1详细描述#include<avr/eeprom.h>这个头文件声明了操作AVR单片机内部数据EEPROM的库函数的接口。库使用一个简单查询方式的接口。应用程序需要使用中断方式操作EEPROM需要自己编程,使用中断6avr-libc模块文件–16–方式可以确保不会浪费时间在查询循环中。注意:所有对EEPROM的读/写操作必须保证EEPROM已经准备好。如果在EEPROM写操作周期内对其进行读/写操作可能造成非常大的延时。应在对EEPROM进行操作前先查询EEPROM,比如用函数eeprom_is_ready()查询EEPROM的工作状态。在EEPROM准备好的情况下再进行操作,从而保证程序的实时性。这个头文件声明直接调用汇编子程序的内联函数。这是为了防止编译器产生对由函数调用保护和恢复的寄存器进行压栈/出栈(push/pops)的操作。这种特殊的函数调用方式也可用于EEPROM程序,例如通过传递参数值到__tmp_reg__,则EEPROM地址在X,存储器地址在Z寄存器中。方法是使用针对代码大小的优化。目前支持两种EEPROM寄存器位置设定:0x1F,0x20,0x21或者0x1C,0x1D,0x1E(见__EEPROM_REG_LOCATIONS__)。由于这些函数会修改IO寄存器,因此这些函数是不可重入的。如果这些中断和正常程序都用到这些函数,应用程序必须保证妥善地进行保护(例如在调用这些函数之前禁止中断)。zavr-libc声明#defineEEMEM__attribute__((section(“.eeprom”)))#defineeeprom_is_ready()#defineeeprom_busy_wait()do{}while(!eeprom_is_ready())uint8_teeprom_read_byte(constuint8_t*addr)uint16_teeprom_read_word(constuint16_t*addr)voideeprom_read_block(void*pointer_ram,constvoid*pointer_eeprom,size_tn)voideeprom_write_byte(uint8_t*addr,uint8_tvalue)voideeprom_write_word(uint16_t*addr,uint16_tvalue)voideeprom_write_block(constvoid*pointer_ram,void*pointer_eeprom,size_tn)z兼容IARC的定义#define_EEPUT(addr,val)eeprom_write_byte((uint8_t*)(addr),(uint8_-t)(val))#define_EEGET(var,addr)(var)=eeprom_read_byte((uint8_t*)(addr))z定义#define__EEPROM_REG_LOCATIONS__1C1D1E6.3.2Define文件6.3.2.1#define__EEPROM_REG_LOCATIONS__1C1D1E为了适应不同的控制器中EEPROM寄存器存在于不同的存储器空间,EEPROM函数估6avr-libc模块文件–17–计__EEPROM_REG_LOCATIONS__的值:假定该宏由器件的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读取一个字节。该定义是为了兼容IARC。6.3.2.3#define_EEPUT(addr,val)eeprom_write_byte((uint8_t*)(addr),(uint8_t)(val))向EEPROM写入一个字节。该定义是为了兼容IARC。6.3.2.4#defineEEMEM__attribute__((section(“.eeprom”)))用该属性声明的变量会被放置在.eeprom段。6.3.2.5#defineeeprom_busy_wait()do{}while(!eeprom_is_ready())如果EEPROM忙,等待。返回值:无。6.3.2.6#defineeeprom_is_ready()返回值:如果EEPROM准备好读/写操作,则函数返回1;否则返回0。6.3.3Function文件6.3.3.1voideeprom_read_block(void*pointer_ram,constvoid*pointer_eeprom,size_tn)从EEPROM的地址pointer_eeprom处开始读取n字节数据保存到RAM地址pointer_ram开始的一片区域中。常量n小于等于256字节时使用库函数。数据块的大小编译时未知或者n大于256时,将扩展一个内联的循环。6.3.3.2uint8_teeprom_read_byte(constuint8_t*addr)从EEPROM的地址addr读取一个字节。6avr-libc模块文件–18–6.3.3.3uint16_teeprom_read_word(constuint16_t*addr)从EEPROM的地址addr读取一个字(小端模式)。6.3.3.4voideeprom_write_block(constvoid*pointer_ram,void*pointer_eeprom,size_tn)将RAM地址pointer_ram中的n字节数据写入EEPROM地址pointer_eeprom开始的一片区域中。6.3.3.5voideeprom_write_byte(uint8_t*addr,uint8_tvalue)将一个字节数据value写入EEPROM的地址addr处。6.3.3.6voideeprom_write_word(uint16_t*addr,uint16_tvalue)将一个字数据value写入EEPROM的地址addr处。6.4<avr/io.h>:AVR器件相关的IO定义#include<avr/io.h>该头文件通过编译器命令行选项-mmcu=包含针对器件的适当IO定义。这是通过包含适当的<avr/ioXXXX.h>头文件来实现的,<avr/ioXXXX.h>头文件不能直接包含在用户程序中。一些AVR单片机公共的寄存器名在<avr/io.h>头文件中定义,但是多数的细节在各自的包含文件中定义。注意该头文件包含:#include<avr/sfr_defs.h>细节请看<avr/sfr_defs.h>:特殊功能寄存器。该头文件包含了所有Atmel公司的数据手册中提到的IO寄存器和提到的数据位的定义。注意,Atmel公司的命名习惯不是完全一致的,因此同样的功能在不同的器件中有时i会有不同的名称。该头文件还包含了中断处理程序的定义。最后,定义了下列宏:zRAMEND该常量定义了片内RAM的结束地址。zXRAMEND该常量定义了RAM可能的结束地址。对于不能外扩RAM的器件,该常量等于RAMEND。zE2END该常量定义了片内EEPROM的结束地址。6avr-libc模块文件–19–zFLASHEND该常量定义了Flash的结束字节地址。zSPM_PAGESIZE对于支持bootloader的设备,该常量定义了SPM指令可以使用的Flash页的大小(按照字节计算)。6.5<avr/pgmspace.h>:程序空间中的字符串6.5.1详细描述#include<avr/io.h>#include<avr/pgmspace.h>该模块的函数提供的接口,使用户程序可以访问存储于器件的程序存储器空间(Flash存储器)中的数据。要使用这些函数,目标器件必须支持LPM或ELPM指令。注意:这些函数试图提供与IARC的头文件兼容的定义,以简化程序在不同的编译器中的移植。但是这些定义并不保证100%的兼容性(GCC还没有完全支持多重地址空间)。如果想操作完全位于RAM中的字符串,请使用<string.h>:标准字符串中定义的标准字符串函数。如果可能,尽量将常量表格放置于低64K程序存储器空间中,并使用pgm_read_byte_near()或pgm_read_word_near()函数代替pgm_read_byte_far()或pgm_read_word_far()函数。这样可以获得比较高的效率,可以将执行代码放在高64K程序存储器空间中。所有后缀为_P的函数都不使用ELPM指令,因此它们都要求使用低64KB的Flash空间。使用该头文件定义的宏声明的程序存储器空间常量会被正确地放置在中断向量区之后,执行代码之前。但是,使用过多的该类型的常量或者器件的bootloaders区大于64KB时,所有这些函数将不能使用。z定义#definePROGMEM__ATTR_PROGMEM__#definePSTR(s)((constPROGMEMchar*)(s))#definepgm_read_byte_near(address_short)__LPM((uint16_t)(address_short))#definepgm_read_word_near(address_short)__LPM_word((uint16_-t)(address_short))#definepgm_read_dword_near(address_short)__LPM_dword((uint16_-t)(address_short))#definepgm_read_byte_far(address_long)__ELPM((uint32_t)(address_long))#definepgm_read_word_far(address_long)__ELPM_word((uint32_-t)(address_long))#definepgm_read_dword_far(address_long)__ELPM_dword((uint32_-t)(address_long))#definepgm_read_byte(address_short)pgm_read_byte_near(address_short)#definepgm_read_word(address_short)pgm_read_word_near(address_short)6avr-libc模块文件–20–#definepgm_read_dword(address_short)pgm_read_dword_near(address_short)#definePGM_Pconstprog_char*#definePGM_VOID_Pconstprog_void*zTypedefstypedefvoidPROGMEMprog_voidtypedefcharPROGMEMprog_chartypedefunsignedcharPROGMEMprog_uchartypedefint8_tPROGMEMprog_int8_ttypedefuint8_tPROGMEMprog_uint8_ttypedefint16_tPROGMEMprog_int16_ttypedefuint16_tPROGMEMprog_uint16_ttypedefint32_tPROGMEMprog_int32_ttypedefuint32_tPROGMEMprog_uint32_ttypedefint64_tPROGMEMprog_int64_ttypedefuint64_tPROGMEMprog_uint64_tz函数void*memcpy_P(void*,PGM_VOID_P,size_t)intstrcasecmp_P(constchar*,PGM_P)__ATTR_PURE__char*strcat_P(char*,PGM_P)intstrcmp_P(constchar*,PGM_P)__ATTR_PURE__char*strcpy_P(char*,PGM_P)size_tstrlcat_P(char*,PGM_P,size_t)size_tstrlcpy_P(char*,PGM_P,size_t)size_tstrlen_P(PGM_P)__ATTR_CONST__intstrncasecmp_P(constchar*,PGM_P,size_t)__ATTR_PURE__char*strncat_P(char*,PGM_P,size_t)intstrncmp_P(constchar*,PGM_P,size_t)__ATTR_PURE__char*strncpy_P(char*,PGM_P,size_t)size_tstrnlen_P(PGM_P,size_t)__ATTR_CONST__char*strstr_P(constchar*,PGM_P)__ATTR_PURE__6.5.2Define文件6.5.2.1#definePGM_Pconstprog_char*用于声明一个指针变量,该指针指向程序存储器空间中的一串字符串。6.5.2.2#definepgm_read_byte(address_short)pgm_read_byte_near(address_short)从16位地址address_short处读出一个字节的数据。6avr-libc模块文件–21–注意:该地址为一个字节地址,该地址指向程序存储器空间。6.5.2.3#definepgm_read_byte_far(address_long)__ELPM((uint32_-t)(address_long))从32位地址address_long处读出一个字节的数据。注意:该地址为一个字节地址,该地址指向程序存储器空间。6.5.2.4#definepgm_read_byte_near(address_short)__LPM((uint16_-t)(address_short))从16位地址address_short处读出一个字节的数据。注意:该地址为一个字节地址,该地址指向程序存储器空间。6.5.2.5#definepgm_read_dword(address_short)pgm_read_dword_-near(address_short)从16位地址address_short处读出两个字的数据。注意:该地址为一个字节地址,该地址指向程序存储器空间。6.5.2.6#definepgm_read_dword_far(address_long)__ELPM_dword((uint32_-t)(address_long))从32位地址address_long处读出两个字的数据。注意:该地址为一个字节地址,该地址指向程序存储器空间。6.5.2.7#definepgm_read_dword_near(address_short)__LPM_dword((uint16_t)(address_short))从16位地址address_short处读出两个字的数据。注意:该地址为一个字节地址,该地址指向程序存储器空间。6avr-libc模块文件–22–6.5.2.8#definepgm_read_word(address_short)pgm_read_word_-near(address_short)从16位地址address_short处读出一个字的数据。注意:该地址为一个字节地址,该地址指向程序存储器空间。6.5.2.9#definepgm_read_word_far(address_long)__ELPM_word((uint32_-t)(address_long))从32位地址address_long处读出一个字的数据。注意:该地址为一个字节地址,该地址指向程序存储器空间。6.5.2.10#definepgm_read_word_near(address_short)__LPM_word((uint16_-t)(address_short))从16位地址address_short处读出一个字的数据。注意:该地址为一个字节地址,该地址指向程序存储器空间。6.5.2.11#definePGM_VOID_Pconstprog_void*用于声明一个一般的指针,该指针指向程序存储器空间中的一个对象。6.5.2.12#definePROGMEM__ATTR_PROGMEM__该属性用于声明一个定位于flashROM的对象。6.5.2.13#definePSTR(s)((constPROGMEMchar*)(s))用于声明一个静态指针,该指针指向程序存储器空间中的一串字符串。6.5.3Typedef文件6.5.3.1prog_char位于FlashROM中的一个”char”型对象。6avr-libc模块文件–23–6.5.3.2prog_int16_t位于FlashROM中的一个”int16_t”型对象。6.5.3.3prog_int32_t位于FlashROM中的一个”int32_t”型对象。6.5.3.4prog_int64_t位于FlashROM中的一个”int64_t”型对象。6.5.3.5prog_int8_t位于FlashROM中的一个”int8_t”型对象。6.5.3.6prog_uchar位于FlashROM中的一个”unsignedchar”型对象。6.5.3.7prog_uint16_t位于FlashROM中的一个”uint16_t”型对象。6.5.3.8prog_uint32_t位于FlashROM中的一个”uint32_t”型对象。6.5.3.9prog_uint64_t位于FlashROM中的一个”uint64_t”型对象。6.5.3.10prog_uint8_t位于FlashROM中的一个”uint8_t”型对象。6.5.3.11prog_void位于FlashROM中的一个”void”型对象。该类型本身并没什么意义,但可用于声明一个位于FlashROM中的”void*”型对象。6.5.4Function文件6.5.4.1void*memcpy_P(void*dest,PGM_VOID_Psrc,size_tn)memcpy_P()函数类似于memcpy(),只是src字符串位于程序存储器空间中。6avr-libc模块文件–24–返回值:memcpy_P()函数返回dest的指针。6.5.4.2intstrcasecmp_P(constchar*s1,PGM_Ps2)比较两个字符串,忽略空格。strcasecmp_P()函数比较两个字符串s1和s2,忽略字符串中的空格。参数:s1一个指向字符串的指针,字符串位于器件的SRAM中。s2一个指向字符串的指针,字符串位于器件的Flash中。返回值:strcasecmp_P()函数返回根据s1小于、等于或者大于s2,返回一个小于、等于或者大于0的整数。6.5.4.3char*strcat_P(char*dest,PGM_Psrc)strcat_P()函数类似于strcat(),只是src字符串位于程序存储器空间中。返回值:strcat_P()函数返回dest的指针。6.5.4.4intstrcmp_P(constchar*s1,PGM_Ps2)strcmp_P()函数类似于strcmp(),只是s2是一个指针,指向的字符串位于程序存储器空间中。返回值:strcmp_P()函数返回根据s1小于、等于或者大于s2,返回一个小于、等于或者大于0的整数。6.5.4.5char*strcpy_P(char*dest,PGM_Psrc)strcpy_P()函数类似于strcpy(),只是src是一个指针,指向的字符串位于程序存储器空间中。返回值:strcpy_P()函数返回dest的指针。6avr-libc模块文件–25–6.5.4.6size_tstrlcat_P(char*dst,PGM_P,size_tsiz)连接两个字符串。strlcat_P()函数类似于strlcat(),只是src字符串位于程序存储器空间中。添加src到大小为siz的字符串dst中(与strncat()不同,siz是dst的总大小,不是剩余空间的大小)。通常情况下,siz-1个字符将被拷贝。总是以NULL终结(除非siz<=strlen(dst))。返回值:strlcat_P()函数返回strlen(src)+MIN(siz,strlen(initialdst))。如果retval>=siz,将会发生切断。6.5.4.7size_tstrlcpy_P(char*dst,PGM_P,size_tsiz)从程序存储器拷贝一个字符串到RAM。拷贝src到大小为siz的字符串dst中。通常情况下,siz-1个字符将被拷贝。总是以NULL终结(除非siz==0)。返回值:strlcpy_P()函数返回strlen(src).如果retval>=siz,将会发生切断。6.5.4.8size_tstrlen_P(PGM_Psrc)strlen_P()函数类似于strlen(),只是src是一个指针,指向的字符串位于程序存储器空间中。返回值:strlen()函数返回src的字符数。6.5.4.9intstrncasecmp_P(constchar*s1,PGM_Ps2,size_tn)比较两个字符串,忽略空格。strncasecmp_P()函数类似于strcasecmp_P(),只是只比较s1的前n个字符。参数:s1一个指向字符串的指针,字符串位于器件的SRAM中。s2一个指向字符串的指针,字符串位于器件的Flash中。n比较的最大字符数。返回值:strncasecmp_P()函数返回根据s1(或者s1的前n个字节)小于、等于或者大于s2,返回一个小于、等于或者大于0的整数。6avr-libc模块文件–26–6.5.4.10char*strncat_P(char*dest,PGM_Psrc,size_tlen)连接两个字符串。strncat_P()strncat(),只是src字符串位于程序存储器空间中。添加src到大小为siz的字符串dst中(与strncat()不同,siz是dst的总大小,不是剩余空间的大小)。通常情况下,siz-1个字符将被拷贝。总是以NULL终结(除非siz<=strlen(dst))。返回值:strncat_P()函数返回dest的指针。6.5.4.11intstrncmp_P(constchar*s1,PGM_Ps2,size_tn)strncmp_P()函数类似于strcmp_P(),只是只比较s1和s2的前n个字符。返回值:strncmp_P()函数返回根据s1(或者s1的前n个字节)小于、等于或者大于s2,返回一个小于、等于或者大于0的整数。6.5.4.12char*strncpy_P(char*dest,PGM_Psrc,size_tn)strncpy_P()函数类似于strcpy_P(),只是只从src中拷贝不多于n字节的数据。如果src的前n字节不包含null字节,则结果不会以null结束。当src的长度小于n时,dest的剩余部分会用null填充。返回值:strncpy_P()函数返回dest的指针。6.5.4.13size_tstrnlen_P(PGM_Psrc,size_tlen)测定固定大小字符串的长度。Thestrnlen_P()函数类似于strnlen(),只是src是一个指针,指向的字符串位于程序存储器空间中。返回值:如果src的长度小于len,strnlen_P函数返回strlen_P(src);如果src的前len个字符不包含‘\0’,strnlen_P函数返回len。6.5.4.14char*strstr_P(constchar*s1,PGM_Ps2)查找子字符串。6avr-libc模块文件–27–strstr_P()函数在字符串s1中查找第一个出现的子字符串s2。不比较结束符‘\0’。strstr_P()函数类似于strstr(),只是s2是一个指针,指向的字符串位于程序存储器空间中。返回值:strstr_P()函数返回一个指向子字符串开始的指针,如果子字符串未找到则返回NULL。如果s2指向的字符串长度为0,函数返回s1。6.6<avr/sfr_defs.h>附加说明所有的<avr/ioXXXX.h>头文件都包含了<avr/sfr_defs.h>头文件。通过定义_SFR_ASM_COMPAT,可以用宏定义使特殊功能寄存器看起来和C变量或者和简单常数一样。下面用<avr/iom128.h>中定义的宏来说明:#definePORTA_SFR_IO8(0x1b)#defineTCNT1_SFR_IO16(0x2c)#definePORTF_SFR_MEM8(0x61)#defineTCNT3_SFR_MEM16(0x88)如果_SFR_ASM_COMPAT未定义,C程序可以在C表达式中直接使用类似PORTA这样的名字,GCC会执行正确的操作(在可能的情况下使用短的I/O指令)。在这种情况下,__SFR_OFFSET定义不起作用。定义_SFR_ASM_COMPAT为1,则这些名字将和简单的常数(I/O寄存器的地址)一样。如果包含了预处理的汇编源文件(*.S),必须定义_SFR_ASM_COMPAT为1。因此如果__ASSEMBLER__被定义,_SFR_ASM_COMPAT将自动定义为1。默认情况下,所有的地址被定义成存储器地址(使用lds/sts指令)。如果要在in/out指令中使用这些地址,必须将这些地址减去0x20。为了更好地向后兼容,应该在你的旧的汇编源文件之前插入下面所示的定义:#define__SFR_OFFSET0这将自动将I/O空间地址减去0x20,但是这是直接减,因此建议你这样修改你的源代码:使用宏定义包裹这些地址,就像下面的例子。如果这么做,那么不需要定义宏__SFR_OFFSET。实例——不同的器件中SPMCR在不同的地址,这些用于bootloader的代码可以在不同的器件中移植。<avr/iom163.h>:#defineSPMCR_SFR_IO8(0x37)<avr/iom128.h>:#defineSPMCR_SFR_MEM8(0x68)#if_SFR_IO_REG_P(SPMCR)out_SFR_IO_ADDR(SPMCR),r24#elsests_SFR_MEM_ADDR(SPMCR),r24#endif如果你知道寄存器是在I/O空间中(例如SREG),你可以不检测_SFR_-IO_REG直接6avr-libc模块文件–28–使用in/out/cbi/sbi/sbic/sbis指令。如果不是,汇编程序将报警(I/Oaddressoutofrange0...0x3f),因此这样是相当安全的。如果你没有定义__SFR_OFFSET(它将为默认值0x20),所有的特殊寄存器地址被定义成存储器地址(因此SREG为0x5f),你可以总是使用lds/sts指令(如果程序大小和速度不是非常重要,或者你不喜欢#if)。但是,如果__SFR_OFFSET!=0x20,这些将不起作用。因此为了安全起见,定义一个不同的宏(只在__SFR_OFFSET==0x20时定义):sts_SFR_ADDR(SPMCR),r24在C程序中,_SFR_ASM_COMPAT和__SFR_OFFSET的联合是被支持的——_SFR_ADDR(SPMCR)宏可用于得到SPMCR寄存器的地址(0x57或0x68,取决于器件)。6.7<avr/sleep.h>:电源管理与睡眠模式6.7.1详细描述#include<avr/sleep.h>使用SLEEP指令可以使有效地降低功耗。AVR单片机可以进入多种不同的休眠模式。详情请参考你使用的AVR单片机的数据手册。该头文件提供了一系列宏用于使器件进入休眠模式。最简单的方式是使用set_sleep_mode()随意地设置希望进入的休眠模式(一般默认为空闲模式:CPU休眠,所有的外围时钟仍然工作),然后调用sleep_mode()。除非目的是锁定CPU(直到硬件复位),中断在这里应该是使能的。该宏将在CPU进入休眠前自动地使能休眠模式,并且之后将再次禁止休眠模式。因为这些宏的联合在一些情况下会造成竞争条件,所以提供独立的操作休眠使能位(SE)宏sleep_enable()、sleep_disable(),以及实际提供SLEEP指令的宏sleep_cpu()。还允许test-and-sleep状态,保证唤醒器件的中断不会被错过。z示例#include<avr/interrupt.h>#include<avr/sleep.h>...cli();if(some_condition){sleep_enable();sei();sleep_cpu();sleep_disable();}sei();6avr-libc模块文件–29–这样的操作次序可以保证对some_condition的判断操作不会被中断打断。如果条件满足,休眠模式会被设置,然后在SEI指令后SLEEP指令立刻被预定执行。因为该指令紧接着SEI指令,保证指令在一个中断触发之前被执行,所以可以保证器件真正进入休眠。z休眠模式注意:一些休眠模式不是所有的器件都支持。请查看目标器件的数据手册确定可用的休眠模式。#defineSLEEP_MODE_IDLE0#defineSLEEP_MODE_ADC_BV(SM0)#defineSLEEP_MODE_PWR_DOWN_BV(SM1)#defineSLEEP_MODE_PWR_SAVE(_BV(SM0)_BV(SM1))#defineSLEEP_MODE_STANDBY(_BV(SM1)||_BV(SM2))#defineSLEEP_MODE_EXT_STANDBY(_BV(SM0)|_BV(SM1)|_BV(SM2))z休眠函数voidset_sleep_mode(uint8_tmode)voidsleep_mode(void)voidsleep_enable(void)voidsleep_disable(void)voidsleep_cpu(void)6.7.2Define文件6.7.2.1#defineSLEEP_MODE_ADC_BV(SM0)ADC降噪模式。6.7.2.2#defineSLEEP_MODE_EXT_STANDBY(_BV(SM0)|_BV(SM1)|_BV(SM2))扩展等待模式。6.7.2.3#defineSLEEP_MODE_IDLE0空闲模式。6.7.2.4#defineSLEEP_MODE_PWR_DOWN_BV(SM1)掉电模式。6avr-libc模块文件–30–6.7.2.5#defineSLEEP_MODE_PWR_SAVE(_BV(SM0)|_BV(SM1))省电模式。6.7.2.6#defineSLEEP_MODE_STANDBY(_BV(SM1)|_BV(SM2))等待模式。6.7.3Function文件6.7.3.1voidset_sleep_mode(uint8_tmode)选择一个休眠模式。6.7.3.2voidsleep_cpu(void)使器件进入休眠状态。SE位必须之前已被设置,并且推荐在休眠结束后清除SE位。6.7.3.3voidsleep_disable(void)清除SE(休眠使能)位。6.7.3.4voidsleep_enable(void)设置SE(休眠使能)位。6.7.3.5voidsleep_mode(void)使器件进入休眠状态。根据你通过set_sleep_mode()函数选
本文档为【winavr库函数介绍】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: ¥18.0 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
肥猫叫noah
暂无简介~
格式:pdf
大小:521KB
软件:PDF阅读器
页数:0
分类:高中语文
上传时间:2019-11-28
浏览量:17