原创 GCCAVR库函数介绍

2010-9-17 16:28 2023 2 3 分类: 智能手机
前一阵子一直在用ICCAVR,感觉还可以,最起码简单,代码的压缩率也蛮高的,但是最近看了几篇文章,就决定不再用ICCAVR了,因为我用的ICCAVR是破解版的,有人说破解的和正版的没什么区别,但我要说那是对编程者的不尊重,可能我以前没有感觉到,可是当我真正工作以后才发现,我们应该尊重每一个从的劳动成果,所以我决定改用WINAVR,首先它是一个free版的,再一个它和avr stdio联合起来用蛮方便的,再次它的代码压缩率也是蛮可以的,鉴于此,懒猫我就换工具了,也希望你能尝试一下winavr,当然如果你用别的用习惯了,不想改也就算了……

        好了,还是回到正题,说一下GCCAVR的库函数吧(GCCAVR其实就是winavr^_^):


库函数按不同的类别声明在不同的头文件中,以字母为序分别介绍头文件:
ctype.h:字符类型函数
eeprom.h:EEPROM 访问函数
errno.h:错误处理函数
ina90.h:与IAR C兼容的头文件
interrupt.h:中断处理函数
inttypes.h:定义不同的数据类型
io.h:包含寄存器定义和其它头文件
math.h:数学函数
pgmspace.h:与IAR C兼容的头文件
progmem.h:与pgmspace.h 头文件相同
setjmp.h:长跳转函数
sig-avr.h:与signal,h相同,旧版头文件,建议不使用
signal.h:信号处理函数
stdlib.h:标准库函数
stdio.h:标准输入输出函数
string.h:字符串操作函数
timer.h:定时器控制函数
twi.h:针对ATmega163的I2C函数
wdt.h:看门狗定时器控制函数

***************************************************
GCCAVR字符类型处理函数库
在使用前应包含头文件#include "ctype.h"
int isalnum(int c):如果c为字母或数字则返回1,否则返回0。
int isalpha(int c):如果c为字母则返回1,否则返回0。
int isascii(int c):如果c为ASCII码则返回1,否则返回0。
int isblank(int c):如果c为空格字符则返回1,否则返回0,可以是space键或tab键输入的空格字符。
int iscntrl(int c):如果c为控制字符则返回1,否则返回0。
int isdigit(int c):如果c为数字则返回1,否则返回0。
int isgraph(int c):如果c为可打印字符(不包括空格)则返回1,否则返回0。
int islower(int c):如果c为小写字母则返回1,否则返回0。
int isprint(int c):如果c为可打印字符(包括空格)则返回1,否则返回0。
int ispunct(int c):如果c为标点符号则返回1,否则返回0。
int isspace(int c):如果c为空格、'
'、'\f'、'\r'、'\t'、'v'之一则返回1,否则返回0。
int isupper(int c):如果c为大写字母则返回1,否则返回0。
int isxdigit(int c):如果c为16进制数则返回1,否则返回0。
int toascii(int c):将c转换为7位ASCII字符,成功返回1,否则返回0。
int tolower(int c):将c转换为小写字母,成功返回1,否则返回0。
int toupper(int c):将c转换为大写字母,成功返回1,否则返回0。

***************************************************
GCCAVR内置EEPROM访问函数库
新版本要求将文件包含改为:#include "\avr\eeprom.h"
void eeprom_read_block(void *buf, unsigned int addr, size_t n):从EEPROM的addr地址开始,读取n个字节到buf。
int eeprom_is_ready():宏定义,EEPROM准备好(EECR =0)返回非0,否则返回0。
unsigned char eeprom_read_byte (unsigned int addr):从EEPROM读取addr地址处的字节数据,在以前的版本中为unsigned char eeprom_rb(unsigned int addr),新版也兼容旧版本的函数。
unsigned int eeprom_read_word(unsigned int addr):从EEPROM读取一个整数,低字节地址addr,高字节地址(addr+1) ,在以前的版本中为unsigned int eeprom_rw(unsigned int addr),新版本也兼容旧版本的函数。
void eeprom_write_byte (unsigned int addr, unsigned char val):向EEPROM的addr地址处写入字节数据val,在以前的版本中为void eeprom_wb(unsigned int addr, unsigned char val),新版本也兼容旧版本的函数。
_EEPUT(addr, val) eeprom_wb(addr, val):与IAR C的兼容函数
_EEGET(var, addr) (var) = eeprom_rb(addr):与IAR C的兼容函数

***************************************************

GCCAVR定义不同类型的数据
在使用前应包含头文件#include "inttypes.h",在本头文件中重新进行数据类型定义,将GNU的数据类型改为符合ANSI C的规范。
typedef signed char int8_t:8位有符号数
typedef unsigned char uint8_t:8位无符号数
typedef int int16_t:16位有符号数
typedef unsigned int uint16_t:16位无符号数
typedef long int32_t:32位有符号数
typedef unsigned long uint32_t:32位无符号数
typedef long long int64_t:64位有符号数
typedef unsigned long long uint64_t:64位无符号数
Typedef int16_t intptr_t:指针
Typedef uint16_t uintptr_t:指针
注意:在使用“-mint8”选项时,编译器将把int类型定义为8位

***************************************************

GCCAVR数学函数库
在使用前应包含头文件#include "math.h",而且math.h数学函数库中定义的函数需要libm.a库文件支持,因此在在连接时增加-lm参数,或者在在makefile的LDFLAGS=后面追加-lm参数。
M_PI:常数,为3.141592653589793238462643
M_SQRT2:常数,为1.4142135623730950488016887
double cos( double x ):返回以弧度形式表示x的余弦值
double fabs( double x ):返回x的绝对值。
double fmod( double x, double y ):返回x/y的余数
double modf( double x, double *iptr ):把浮点数分解成整数部分和小数部分,整数部分存放到pint指向的变量,小数部分应当大于或等于0而小于1,并且作为函数返回值返回。
double sin( double x ):返回以弧度形式表示x的正弦值。
double sqrt( double x ):返回x的平方根
double tan( double x ):返回以弧度形式表示x的正切值。
double floor( double x ):返回不大于x的最大整数。
double ceil( doublce x ):返回不小于x的最小整数。
double frexp( double x, int *exp ):把浮点数x分解成数字部分y(尾数)和以2为底的指数n两个部分,即x=y*2n,y的范围为0.5≤y<1,y值被函数返回,而n值存放在pexp指向的变量中
double ldexp( double x, int exp ):返回x*2exp。
double exp( double x ):返回以e为底x的幂,即ex
double cosh( double x ):以弧度形式返回x的双曲余弦值
double sinh( double x ):以弧度形式返回x的双曲正弦值
double tanh( double x ):以弧度形式返回x的双曲正切值
double acos( double x ):以弧度形式返回x的余弦值
double asin( double x ):以弧度形式返回x的正弦值
double atan( double x ):以弧度形式返回x的余弦值
double atan2( double x, double y ):返回y/x的反正切,其范围在-π~+π之间
double log( double x ):返回x的自然对数。
double log10( double x ):返回以10为底的对数
double pow( double x, double y ):返回xy值
int isnan(double x):如果x为非负数(NAN,值为0xffffffff),返回1,否则返回0
int isnaf(double x):如果x的值为正溢出(+INF,值大于0x7f800000)和负溢出(-INF,值小于0xff800000)则返回0,否则返回1
double strtod( const char *s, char **endptr ):将ASCII字符串转换为double数
double square( double x ):返回x的平方根
double inverse( double x ):返回1/x

***************************************************

GCCAVR字符串操作函数库
在使用前应包含头文件#include "string.h"
void * memccpy (void *dest,const void *src,int val,size_t len):从scr复制不超过len个字节到dest,在复制的过程中如果存在val,则停止复制并返回,如果不存在val,则复制len个字符。
void * memchr(const void *src,int val,size_t len):在字符串src中搜索len个字节长度以寻找与val相同的字符,如果成功返回匹配字符的地址指针,否则返回NULL
int memcmp(const void *s1,const void *s2,size_t len):对字符串s1和s2的前len个字符进行比较,如果相同返回0,如果s1中字符串大于s2中字符串,则返回大于0的值,如果s1中字符串小于s2中字符串,则返回小于0的值。
void * memcpy(void *dest,const void *src,size_t len):拷贝src所指的对象中拷贝len个字符至dest所指的对象中,函数返回dest的值。。
void * memmove(void *dest,const void *src,size_t len):拷贝src中len个字符至dest,其它与memcpy基本相同,但拷贝区可以重迭,在拷贝过程中使用了个长度为len的临时数组。
void * memset(void *dest,int val,size_t len):在dest中从开始位置填充len个字节的val,它返回dest
int strcasecmp(const char *s1,const char *s2):比较两个字符串,如果相同返回0,如果s1中字符串大于s2中字符串,则返回大于0的值,如果s1中字符串小于s2中字符串,则返回小于0的值。
char * strcat(char *dest,const char *src):将src所指向的字符串(包括终止字符串的空字符)复制到dest所指向的数组的末尾,并且src所向指向的字符串的初始字符将覆盖dest末尾的空字符,函数返回dest的值。
char *strchr(const char *src,int val):在字符串src中搜索最后出现的val,并返回它的位置,终止字符串的空字会也作为串的一部分,函数返回指src中第一个val的位置,如果没有出现与val相同的字符,则返回一个空指针。
int strcmp(const char *s1,const char *s2):比较两个字符串,如果相同返回0,如果s1中字符串大于s2中字符串,则返回大于0的值,如果s1中字符串小于s2中字符串,则返回小于0的值。
char * strcpy(char *dest,const char *src):将src所指向的字符串(包括终止字符串的空字符)复制到dest所指向的数组的末尾,函数返回dest的值。
size_t strlcat(char *dest,const char *src,size_t size):基本和strcat函数相同,但只复制前size个字符,如果size大于src所指向字符串的长度,则将src复制到dest后就返回。
size_t strlcpy(char *dest,const char *src,size_t size):基本和strcpy函数相同,但只复制前size个字符,如果size大于src所指向字符串的长度,则将src复制到dest后就返回。
size_t strlen(const char *src):返回字符串src的长度,不包括结束NULL字符
char * strlwr(char *string):将src字符串中的大写字母转换成相应的小写字母,其它字符保持不变
int strncasecmp(const char *s1,const char *s2,size_t len):基本和strcasecmp函数相同
char * strncat(char *dest,const char *src,size_t len):函数strncat将src所指向的字符串(包括终止字符和空字符)复制到dest所指向的数组的末尾,最多追回len个字符,空字符及空字符后的字符不予复制。src的初始字符覆盖dest末尾的空字符。结果字符串的末尾通常追加一个空字符,函数返回dest的值。
int strncmp(const char *s1,const char *s2,size_t len):函数比较s1和s2所指向的字符串,如果相同返回0,如果s1中字符串大于s2中字符串,则返回大于0的值,如果s1中字符串小于s2中字符串,则返回小于0的值。
char *strncpy(char *dest,const char *src,size_t len):基本和strlcpy函数相同
size_t strnlen(const char *src,size_t len):基本和strlen函数相同,如果src小于len,则返回src的长度(不包含结束NULL字符),否则返回len
char * strrchr(const char *src,int val):基本和strchr函数相同,但返回的是最后一次与val匹配字符的位置
char * strrev(char *string):将字符串string翻转,即第一个字符变成最后一个,最后一个变成第一个。
char * strstr(const char *s1,const char *s2):在字符串s1中搜索字符串s2,并返回找到的第一个相匹配的针,否则返回NULL
char * strupr(char *string):将src字符串中的小写字母转换成相应的大写字母,其它字符保持不变

***************************************************

定时器控制函数timer.h
新版本要求将文件包含改为:#include "\avr\timer.h"
timer.h文件定义定时/计数器使用的一个枚举类型:
enum
{
STOP = 0,
CK = 1,
CK8 = 2,
CK64 = 3,
CK256 = 4,
CK1024 = 5,
T0_FALLING_EDGE = 6,
T0_RISING_EDGE = 7
};
枚举类型定义定时/计数器的控制寄存器的时钟源(分频系数)
void timer0_source( unsigned int src):将src赋值给寄存器TCCR0
void timer0_stop();:通过对寄存器TCNT0清零来停止定时器0
void timer0_start();:通过对寄存器TCNT0写入1来启动定时器0


 


         如果想详细了解这些函数,就要去看看include文件夹下的头文件了,头文件没什么难的,看多了就懂了,而且很多头文件的c写法很标准,可以参考一下^_^


   

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

sunke9_998892717 2011-4-12 09:09

有没有自己制作使用库文件的资料?
相关推荐阅读
用户1314788 2012-02-03 15:20
评论:@jjldc(九九)的电子博客 博客中提到的“转一篇比较详细介绍FatFs文件系统移植的文章”
11...
用户1314788 2011-05-04 10:11
STM32 IAP
引导加载程序是存储在内部引导ROM存储器(系统内存),其主要任务是通过下载应用程序到内部FLASH通过USART1的通信接口. 从系统内存启动bootloader然后通过USART1接口外设下载应...
用户1314788 2011-04-11 09:31
基于AVR单片机队列的UART通信模块
对于堆栈来说,插入、删除操作是固定在一端进行的,这一端称为“栈顶”,另一端称为“栈底”。 堆栈指针(Stack  Pointer)用于指示栈顶位置(地址),在有些单片机中,堆栈指针可以通过程序去设置。...
用户1314788 2011-04-08 11:03
assert_param STM32的固件库 使用须知
在STM32的固件库和提供的例程中,到处都可以见到assert_param()的使用。如果打开任何一个例程中的stm32f10x_conf.h文件,就可以看到实际上assert_param是一个宏定义...
用户1314788 2011-03-30 16:50
单片机的非OS的事件驱动思考1
很多单片机项目恐怕都是没有操作系统的前后台结构,就是main函数里用while无限循环各种任务,中断处理紧急任务。这种结构最简单,上手很容易,可是当项目比较大时,这种结构就不那么适合了,编写代码前你...
用户1314788 2011-03-24 14:41
C
要从逻辑上删除一段C代码,更好的办法是用#if指令。 #if  0   statements#endif int *a;*a = 12;  //我们声明了这个指针变量,但从未对它进行过初始化,所以我们...
EE直播间
更多
我要评论
1
2
关闭 站长推荐上一条 /3 下一条