AVR GCC对端口的操作指南

2019-12-04来源: eefocus关键字:AVR  GCC  端口  操作指南

1. AVR GCC for AVR

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应为有效地址。


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_enable(unit8_t timeout);
说明:使能看门狗。看门狗溢出时间为timeout。
timeout 周期
0 16K CLK
1 32K CLK
2 64K CLK
3 128K CLK
4 256K CLK
5 512K CLK
6 1024K CLK
7 2048K CLK


3. wdt_reset
用法:void wdt_reset(void);
说明:产生喂狗指令wdr。
 
附录:AVR-GCC配置
汇编选项
选项 描述
-mmcu=name 指定目标器件
name可以为:at90s1200,at90s2313,at90s2323,at90s2333,at90s2343,at904433,at90s8515,at90s8535,atmega103,atmega161
寄存器使用
如果用户需要进行汇编与C的混合编程,必须了解寄存器的使用。


1.寄存器使用
r0  可用做暂时寄存器。如果用户汇编代码使用了r0,且要调用C代码,则在调用之前必须保存r0。C中断例程会自动保存和恢复r0。


r1  C编译器假定此寄存器内容为“0”。如果用户使用了此寄存器,则在汇编代码返回之前须将其清零。C中断例程会自动保存和恢复r1。


r2-r17,r28,r29  C编译器使用这些寄存器。如果用户汇编代码需要使用这些寄存器,则必须保存并恢复这些寄存器。


R18-r27,r30,r31 如果用户汇编代码不调用C代码则无需保存和恢复这些寄存器。如果用户要调用C代码,则在调用之前须保存。


2.函数调用规则
参数表:函数的参数由左至右分别分配给r25到r8。每个参数占据偶数个寄存器。若参数太多以至r25到r8无法容纳,则多出来的参数将放入堆栈。


返回值:8位返回值存放在r24。16位返回值存放在r25:r24。32位返回值存放在r25:r24:r23:r22。64位返回值存放在r25:r24:r23:r22:r21:r20:r19:r18。

2.Keil for MCS51

sbit LED=P1^0

关键字:AVR  GCC  端口  操作指南 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic481952.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:AVR_GCC程序设计基础
下一篇:AVR/Arduino定时/计数器、中断入门

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

AVR开发 Arduino方法(四) 串行通信子系统
  Arduino UNO R3主处理器ATMega328P的串行通信子系统可以用于与计算机、外设或其他微控制器进行通信,它支持3种串行通信方式:通用同步/异步收发器,串行外设接口和两线串行接口。1. 通用同步/异步收发器  在串行通信中,波特率用来衡量传输速率的快慢,同步和异步的对象是波特率的时钟信号;同步通信的设备之间需要一条额外的时钟线,也因此同步方式可以提供更高的波特率;这里将以异步为例。  下面的示例可以使通过串口发送给Arduino的数据回显到串口监视器上: 1 // SerialEcho.ino 2 char data; 3  4 void
发表于 2019-12-05
AVR开发 Arduino方法(四) 串行通信子系统
AVR开发 Arduino方法(三) 定时/计数器子系统
Arduino UNO R3的主处理器ATMega328P拥有3个定时/计数器,它们分别是Timer0,Timer1和Timer2;它们都通过对来自内部或外部的脉冲信号进行计数的方式完成基本的定时/计数功能以及一些其他的功能。Timer0和Timer2是8位定时/计时器,Timer1是16位定时/计数器;下面以Timer2为例讨论定时/计数器子系统的典型应用,这些内容同样适用于Timer0和Timer1。1. 精准延时在前面的例子中,已经使用了一些与精准延时相关的Arduino库函数:   delay(ms):延迟一段时间  ms:延迟的时长,单位是毫秒 请注意,上面的Arduino
发表于 2019-12-05
AVR开发 Arduino方法(三) 定时/计数器子系统
AVR开发 Arduino方法(二) 中断子系统
在了解中断子系统之前,首先要了解中断的概念。你正在看书,这时电话响了,你会怎么做呢?相信大多数人会这样:先标记看到的位置,接完电话回来后继续阅读。这就是一个现实生活中中断的例子,我们把“电话响了”成为中断源。Arduino UNO R3的主处理器ATMega328P拥有26个中断源,如下表所示:向量号程序地址中断源中断定义中断服务程序名称10x0000RESET外部电平复位,上电复位,掉电检测复位,看门狗复位20x0002INT0外部中断请求0INT0_vect30x0004INT1外部中断请求1INT1_vect40x0006PCINT0引脚电平变化中断请求0PCINT0_vect50x0008PCINT1引脚
发表于 2019-12-05
AVR开发 Arduino方法(一) 端口子系统
  Arduino UNO R3的主处理器ATMega328P上有3个8位的输入/输出端口,分别是PB,PC和PD。Arduino IDE提供的Blink示例可以帮助我们了解端口的数字输出功能:  1 // Blink.ino 2 int led = 13; 3  4 void setup() { 5   pinMode(led, OUTPUT); 6 } 7  8 void loop() { 9   digitalWrite(led, HIGH);10 
发表于 2019-12-05
AVR开发 Arduino方法(一) 端口子系统
AVR开发 Arduino方法(附一) 工具链与调试技术
开“AVR Source Code”和“AVR Variables”对话框,从中可以查看程序源代码以及变量值的情况:从“AVR Source Code”对话框中找到主函数,找到setup()函数和loop()函数的调用语句,双击打上断点,运行到断点处,就可以开始调试了:(2) 使用Visual Studio进行硬件调试安装带有C++组件2012或更新版本的Visual Studio后,在http://www.visualmicro.com/page/Arduino-Visual-Studio-Downloads.aspx中下载Visual 
发表于 2019-12-05
AVR开发 Arduino方法(附一) 工具链与调试技术
AVR+FPGA实现六路闭环电流控制程序
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity XTKZQ isport(    rst,clk        :    in        std_logic;    --时钟和复位信号,复位信号由AVR初始化手动给出    --avr 读写相关信号线    ale,rd
发表于 2019-12-05
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved