新闻中心

EEPW首页>嵌入式系统>设计应用> 如何使用AVR-GCC API

如何使用AVR-GCC API

作者: 时间:2016-11-25 来源:网络 收藏

4.cbi
用法:void cbi(uint8_t port, uint8_t bit);
说 明:清零port的bit位。bit的值为0~7。如果port为实际I/O寄存器,则此函数生成一条cbi指令;否则,函数生成相应的优化代码。
5.inp
用 法:uint8_t inp(uint8_t port);
说明:从端口port读入8比特的数值。如果port为常数,则函数生成一条in指 令;若为变量,则函数用直接寻址指令。
6.__inw
用法:uint16_t __inw(uint8_t port);
说明: 从I/O寄存器读入16位的数值。此函数用于读取16位寄存器(ADC,ICR1,OCR1,TCNT1)的值,因为读取这些寄存器需要合适的步骤。由于 此函数只产生两条汇编指令,因此要在中断禁止时使用,否则有可能由于中断插入到指令之间造成读取错误。
7.__inw_atomic
用 法:uint16_t __inw_atomic(uint8_t port);
说明:以原子语句方式读取16位I/O寄存器的数值。此函数首先 禁止中断,读取数据之后再恢复中断状态,因此可以安全地应用在各种系统状态。
8.loop_until_bit_is_clear
用 法:oidoid loop_until_bit_is_clear (uint8_t port, uint8_t bit);
说明:此函数简 单地调用sbic指令来测试端口port的bit位是否清零。port必须为有效端口。
9.loop_until_bit_is_set
用 法:oidoid loop_until_bit_is_set (uint8_t port, uint8_t bit);
说明:此函数简单地 调用sbis指令来测试端口port的bit位是否置位。port必须为有效端口。
10.outp
用法:void outp(uint8_t val, uint8_t port);
说明:将val写入端口port。如果port为常数,则函数生成一条out 指令;若为变量,则函数用直接寻址指令。
11.__outw
用法:void __outw(uint16_t val, uint8_t port);
说明:将16位的val写入端口port。此函数适合于操作16位寄存器,如ADC,ICR1,OCR1,TCNT1。由于此函数 只产生两条汇编指令,因此要在中断禁止时使用,否则有可能由于中断插入到指令之间造成读取错误。
12.__outw_atomic
用 法:void __outw_atomic(uint16_t val, uint8_t port);
说明:将16位的val写入端口 port。此函数适合于操作16位寄存器,如ADC,ICR1,OCR1,TCNT1。此函数首先禁止中断,读取数据之后再恢复中断状态,因此可以安全地 应用在各种系统状态。
13.sbi
用法:void sbi(uint8_t port, uint8_t bit);
说明:置位 port的bit位。bit的值为0~7。如果port为实际I/O寄存器,则此函数生成一条 sbi指令;否则,函数生成相应的优化代码。
五. 看门狗API
以下函数操作看门狗。宏定义参见wdt.h。
用户可以通过起动代码初始化看门狗。WDTCR的缺省值为0。如果你希望将其设 置为其他值,则需要在链接命令里加入相应的命令。使用的符号为__init_wdtcr__。如下为将WDTCR设置为0x1f的例子:
avr-ld -defsym __init_wdtcr__=0x1f
1.wdt_disable
用法:void wdt_disable(void);
说明:关闭看门狗。
2.wdt_enable
用法:void wdt_disable(unit8_t timeout);
说明:使能看门狗。看门狗溢出时间为timeout。
timeout 周期
016K CLK
132K CLK
264K CLK
3128K CLK
4256K CLK
5512K CLK
61024K CLK
72048K CLK

3.wdt_reset
用 法:void wdt_reset(void);
说明:产生喂狗指令wdr。

三.应用程序启动过程(Start Up)
标 准库文件包含一个启动模块(Start Up Module),用于为真正执行用户程序做环境设置。
启动模块完成的任务如下:
1.提 供缺省向量表
2.提供缺省中断程序入口
3.初始化全局变量
4.初始化看门狗
5.初 始化寄存器MCUCR
6.初始化数据段
7.将数据段.bss的内容清零
8.跳转到 main()。(不用调用方式,因为main()不用返回)
启动模块包含缺省中断向量表,其内容为预先定义好的函数名称。这些函数名称可以由程序 员重载。中断向量表的第一个内容为复位向量,执行结果是将程序跳转到_init_。在启动模块里,_init_表示的地址与_real_init_指向的 地址相同。如果要加入客户代码,则需要在程序里定义一个_init_函数。在此函数的末尾跳转到_real_init_。具体实现如下:
void _real_init_(void);
void _init_(void) __attribute__((naked));
void _init_(void)
{
// 用户代码

// 最后的代码必须为:
asm ("rjmp _real_init_");
}

在_real_init_部 分,系统将设置看门狗和MCUCR寄存器。启动模块并没有真正取用相应寄存器的设置数值(以符号 _init_wdctr_,_init_mcucr_,_init_emcucr_表示),而是通过地址来取得其值。因而用户可以通过链接器的 --defsym选项来设置这些符号的地址。如果用户没有定义,则启动模块将使用缺省值。
接下来系统将从程序存储器里把具有初值的全局变量加载到 数据存储器SRAM。然后是将数据段.bbs清零。此数据段包含所有没有的初值的非AUTO变量。
最后,系统跳转到main()函数,用户代码开 始执行。系统对此特殊函数加入一些特殊的处理。进入此函数后,堆栈指向SRAM的末尾。

上一页 1 2 下一页

关键词:AVR-GCCAP

评论


相关推荐

技术专区

关闭