您的位置 首页 测评

怎么运用AVR-GCC API

API嵌入式编程的代码可以简单地分为两部分,一是与硬件无关的算法部分,对其编程与普通C编程没有区别;二是与硬件相关的寄存器端口操作部

API
嵌入式编程的代码能够简略地分为两部分,一是与硬件无关的算法部分,对其编程与一般C编程没有差异;二是与硬件相关的寄存器/端口操作部 分。不同的MCU完结办法各有不同。在AVR-GCC里则经过一系列的API来处理。当然,用户也能够界说自己的API。在此简略地介绍现在AVR- GCC里界说的API,以及AVR-GCC的作业进程。
一.存储器API
AVR具有三种存储器:FLASH,SRAM和EEPROM。 AVR-GCC将程序代码放在FLASH,数据放在SRAM。
I.程序存储器
假如要将数据(如常量,字符串,等等)放在FLASH里,用 户需求指明数据类型__attribute__((progmem))。为了方便运用,AVR-GCC界说了一些更直观的符号,如下表所示。
类 型界说
prog_voidvoid __attribute__((progmem))
prog_charchar __attribute__((progmem))
prog_intint __attribute__((progmem))
prog_longlong __attribute__((progmem))
prog_long_longlong long __attribute__((progmem))
PGM_Pprog_char const*
PGM_VOID_Pprog_void const*
供给的库函数有:
1.__elpm_inline
用法:uint8_t __elpm_inline(uint32_t addr);
阐明:履行ELPM指令从FLASH里取数。参数为32位地址,回来一个8位数据。
2.__lpm_inline
用 法:uint8_t __elpm_inline(uint16_t addr);
阐明:履行LPM指令从FLASH里取数。参数为16位地址, 回来一个8位数据。
3.memcpy_P
用法:void* memcpy_P(void* dst, PGM_VOID_P src, size_t n);
阐明:memcpy的特别版别。完结从FLASH取n个字节的使命。
4.PRG_RDB
用 法:uint8_t PGR_RDB(uint16_t addr);
阐明:此函数简略地调用__lpm_inline
5.PSTR
用 法:PSTR(s);
阐明:参数为字符串。功用是将其放在FLASH里并回来地址。
6.strcmp_P
用法:int strcmp(char const*, PGM_P);
阐明:功用与strcmp()相似。第二个参数指向程序存储器内的字符串。
7.strcpy_P
用 法:char* strcpy_P(char*, PGM_P);
阐明:功用与strcpy()相似。第二个参数指向程序存储器内的字符串。
8.strlen_P
用 法:size_t strlen_P(PGM_P);
阐明:功用与strlen()相似。第二个参数指向程序存储器内的字符串。
9.strncmp_P
用 法:size_t strncmp_P(char const*, PGM_P, size_t);
阐明:功用与strncmp()相似。第二个 参数指向程序存储器内的字符串。
10.strncpy_P
用法:size_t strncpy_P(char*, PGM_P, size_t);
阐明:功用与strncpy()相似。第二个参数指向程序存储器内的字符串。
II.EEPROM
AVR内部有 EEPROM,但地址空间与SRAM的不相同。在拜访时有必要经过I/O寄存器来进行。EEPROM API封装了这些功用,为用户供给了高档接口。运用时要包括eeprom.h。在程序里界说EEPROM数据的比如如下:
static uint8_t variable_x __attribute__((section(“.eeprom”))) = 0;
不同的AVR器材具 有不同数目的EEPROM。链接器将针对不同的器材分配存储器空间。
1.eeprom_is_ready
用法:int eeprom_is_ready(void);
阐明:此函数用于指示是否能够拜访EEPROM。假如EEPROM正在履行写操作,则在4ms内无 法拜访。此函数查询相应的状况位来指示现在是否能够拜访EEPROM。
2.eeprom_rb
用法:uint8_t eeprom_rb(uint16_t addr);
阐明:从EEPROM里读出一个字节的内容。参数addr用于指示要读出的地址。 _EEGET(addr)调用此函数。
3.eeprom_read_block
用法:void eeprom_read_block(void* buf, uint16_t addr, size_t n);
阐明:读出一块EEROM的内 容。参数addr为开始地址,n标明要读取的字节数。数据被读到SRAM的buf里。
4.eeprom_rw
用 法:unint16_t eeprom_rw(uint16_t addr);
阐明:从EEPROM里读出一个16位的数据。低字节为低8位,高 字节为高8位。参数addr为地址。
5.eeprom_wb
用法:void eeprom_wb(uint16_t addr, uint8_t val);
阐明:将8位数据val写入地址为addr的EEPROM存储器里。_EEPUT(addr,val)调 用此函数。
二.中止API
因为C言语规划方针为硬件无关,因而各种编译器在处理中止时运用的办法都是编译器规划者自己的办法。
在 AVR-GCC环境里,向量表现已预先界说,并指向具有预界说称号的中止例程。经过运用适宜的称号,用户例程就能够由相应的中止所调用。假如用户没有界说 自己的中止例程,则器材库的缺省例程被参加。
除了中止向量表的问题,编译器还有必要处理相关寄存器维护的问题。中止API处理了细节问题。用户只需 将中止例程界说为INTERRUPT()或SIGAL()即可。而关于用户没有界说的中止,缺省例程的处理是reti指令。
函数界说可拜见 interrupt.h,中止信号符号表拜见sig-avr.h。
1.cli
用法:void cli(void);
说 明:经过置位大局中止屏蔽位来制止中止。其编译成果仅为一条汇编指令。
2.enable_external_int
用 法:void enable_external_int(uint8_t ints);
阐明:此函数拜访GIMSK寄存器(关于MEGA器材则是 EIMSK寄存器)。功用与宏outp()相同。
3.INTERRUPT
用法:INTERRUPT(signame)
说 明:界说中止源signame对应的中止例程。在履行时,大局屏蔽位将清零,其他中止被使能。ADC完毕中止例程的比如如下所示:
INTERRUPT(SIG_ADC)
{
}
4.sei
用 法:void sei(void);
阐明:经过清零大局中止屏蔽位来使能中止。其编译成果仅为一条汇编指令。
5.SIGNAL
用 法:SIGNAL(signame)
阐明:界说中止源signame对应的中止例程。在履行时,大局屏蔽位坚持置位,其他中止被制止。ADC完毕 中止例程的比如如下所示:
SIGNAL(SIG_ADC)
{
}
6.timer_enable_int
用 法:void timer_enable_int(uint8_t ints);
阐明:此函数操作TIMSK寄存器。也能够经过outp()来设 置。
四.I/O API
I.I/O端口API
1.BV
用法:BV(pos);
阐明:将位界说转换成屏 蔽码(MASK)。与头文件io.h里的位界说一同运用。例如,置位WDTOE和WDE可表示为”BV(WDTOE) | BV(WDE)”
2.bit_is_clear
用 法:uint8_t bit_is_clear(uint8_t port, uint8_t bit);
描绘:假如port的bit位清零则返 回1。此函数调用sbic指令,故port应为有用地址。
3.bit_is_set
用法:uint8_t bit_is_set(uint8_t port, uint8_t bit);
描绘:假如port的bit方位位则回来1。此函数调用sbis 指令,故port应为有用地址。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ceping/258865.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部