历史上的今天
返回首页

历史上的今天

今天是:2024年12月04日(星期三)

正在发生

2019年12月04日 | AVR GCC对端口的操作指南

2019-12-04 来源:eefocus

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

推荐阅读

史海拾趣

Collins Electronics Corp公司的发展小趣事

随着科技的飞速发展,Collins Electronics Corp意识到技术创新是企业持续发展的关键。他们投入大量资源进行研发,推出了一系列具有创新技术的电子产品。其中,他们开发的一款新型高频无线电收发器,因其传输速度快、信号稳定而广受好评。这项技术不仅为公司带来了可观的利润,还推动了整个电子行业的技术进步。

FWBELL公司的发展小趣事
在保证安全的前提下,尽量设定较高的温度阈值以提高充电效率。
芯旺微电子(ChipON)公司的发展小趣事

在汽车电子领域,AEC-Q100品质认证是衡量MCU产品质量的重要标准。芯旺微电子通过不懈的努力和技术创新,成功研发出满足AEC-Q100品质认证的MCU产品,并广泛应用于汽车前装市场。这一突破不仅证明了芯旺微电子的技术实力,也为其赢得了国内外众多知名汽车厂商的信赖和合作。

CNC Tech公司的发展小趣事

CNC Tech公司深知,在竞争激烈的电子行业中,品质是赢得客户信任和市场口碑的关键。因此,公司始终坚持品质至上的原则,从原材料采购到生产制造的每一个环节都严格把控品质。CNC Tech还建立了完善的品质管理体系,通过严格的质量检测和持续的技术改进,确保每一台出厂的设备都能达到客户的期望和要求。正是凭借这种对品质的执着追求,CNC Tech赢得了广大客户的信赖和好评。

EBK Kruger GmbH & Co KG公司的发展小趣事

在电子行业的初期,EBK Kruger GmbH & Co KG由创始人Klaus Kruger在德国的一个小镇创立。Klaus是一位电子工程师,对新型电子元器件的研发充满热情。他带领团队成功研发出一种具有更高稳定性和更低能耗的新型电阻器,这一技术突破让公司在行业中崭露头角。通过不断的技术创新和产品优化,EBK Kruger逐渐赢得了市场的认可。

Electronic公司的发展小趣事

小米,作为一家年轻的科技公司,在电子行业的发展中展现了惊人的成长速度。小米凭借出色的产品设计和创新的营销策略,迅速在手机市场获得了巨大成功。随着业务的不断拓展,小米还涉足了智能家居、物联网和互联网金融等领域,形成了完整的生态布局。小米通过提供高性价比的产品和优质的服务,赢得了大量年轻用户的喜爱和支持。

问答坊 | AI 解惑

电子元器件产品的五大特点

1、产品门类多,品种繁杂。仅根据原电子部编制的电子产品分类和编码统计,电子元器件除集成电路以外的产品就有206个大类2519个小类,其中电真空器件13大类260个小类;半导体分立器件(包括激光、光电子器件等)18大类379小类;电子元件17个专业,16 ...…

查看全部问答>

不光可以晒创意,还可以晒电子方面的任何东西哦

如题, 比如电子焊接中碰到的稀奇古怪的事,或者好的窍门,贴出来供广大电子爱好者一个走捷径的机会,先谢过大家的无私奉献, …

查看全部问答>

程序放在ram里运行,放在nand里面就不运行了,请问怎么回事

各位,我遇到个问题比较奇怪,请问大家遇到过没有,我把程序放在nand里面,运行不了,提示不是windows ce应用程序,放在ram里面就可以,往nand里面存文件取文件都没有问题,请问是怎么回事 还有一点补充的就是好像以前nand直接访问的话是没有问题 ...…

查看全部问答>

EVC和VC读写文件中的汉字

各位,我要将VC下生成的数据文件读取出来,其中的数据有汉字,也有其他英文字符。在VC下写时用的是TCHAR,我在EVC下用TCHAR来读,自动读取出的汉字为乱码????????…

查看全部问答>

有用广州倍思得BST-URD9201做过开发的高人请进

我现在做的毕业设计用的就是这款读卡器,需要自己开发一个新的程序包,但是该读卡器自带的说明书过于简单,对该款仪器的命令介绍不全,希望有用该读卡器做过相关项目的高人指点一下。…

查看全部问答>

为什么Eboot阶段的功耗大于wince运行阶段

首先介绍一下我的系统:PXA270 + wince5.0 系统启动过程,上电 --> eboot将wince5.0镜像从flash 搬运到RAM中, -->跳转到RAM运行 现象:用4.2V给系统供电,正极串入电流表,在eboot阶段的电流为300mA左右,跳转到wince5.0后,功耗降到220mA,在bo ...…

查看全部问答>

关于周立功7290和I2C使用的问题

实验平台是MagicARM2410,我们在做实验时遇到个问题.... 如何在7290的数码管上显示自定义的数据,如:我想显示P-------,该如何做,向哪个子地址发数据? 问题二: 我先做了EINT的一个中断,还要用到串口中断,因为要用I2C和串口都要可操作,所 ...…

查看全部问答>

求一C源程序(基于运动信息视频对象分割技术)

就是要求把动态的物体从静态的环境里取出。 例如:一个人跳水的视频,把跳水的动作从它所在的环境中分离出来。 要求是C/C++写的,好象要放到MAXPLUSS2里去运行。 我是做软件开发的,一点不懂这方面的东西,但现在急需这个程序,请大家帮个忙了。…

查看全部问答>

allegro的走线设置

请问怎样设置才能消除缺口,第一次使用allegro,知道的热心人请指点。。。。只有50分,全给了。。。。…

查看全部问答>

淘---利尔达的EZ430-RF5137-433

本人急需几块 利尔达的EZ430-RF5137-433  开发套件。     大家如有闲置,可以转给俺,qq:4l72484O9…

查看全部问答>