IAR for AVR学习笔记

合集下载

AVR学习笔记

AVR学习笔记

AVR学习笔记前言:学习一块单片机,我们要几项准备工作:1.开发软件(熟悉开发软件操作流程,基本上开发软件都差不多的,学会了一款,再学其它的就会很顺手了(新建工程、新建设计文件、把源文件加到工程里面、最后设置一些参数)2.编程语言(这个就不用说了,先学语法规则,能够熟练掌握到自己写的代码没有语法错误,然后再逐步把自己的想法驾驭到编程语言上)3.硬件(硬件包括的范围很广,不仅包括你所要学的单片机还有单片机的外围电路所用到的器件),最好要学一款仿真软件。

我们始终要记住学单片机绝对不可以纸上谈兵,一定要实践,就是把自己所写的代码下载到板上,看看实际效果。

开发板可以买,也可以自己做!我喜欢自己做。

实验一:点亮发光二极管1.avr单片机的i/o端口1)学习单片机的主要任务就是了解、掌握单片机i/o端口的功能,以及如何正确设计这些端口与外围电路的连接,从而能够组成一个嵌入式系统,并编程、管理和运用他们完成各种各样的任务。

2)atmega16有4个8位的双向i/o端口pa、pb、pc、pd,他们对外对应32个i/o引脚,每一位都可以独立地用于逻辑信号的输入和输出。

在5v工作电压下,输出高点平时,每个引脚可输出达20ma的驱动电流;而输出低电平时,每个引脚可吸收最大为40ma的电流,可以直接驱动发光二极管(一般的发光二极管的驱动电流为10ma)和小型继电器等小功率器件。

avr大部分的i/o端口都具备双重功能(有的还有第三功能)。

其中第一功能是作为数字通用i/o接口使用,而复用的功能可分别与片内的各种不同功能的外围接口电路组合成一些可以完成特殊功能的i/o口,如定时器、计数器、串行接口、模拟比较器、捕捉器、usart、spi等。

3)avr单片机的每组i/o口都搭载存有三个8为寄存器,分别就是:方向掌控寄存器ddrx、数据寄存器portx、输出插槽寄存器pinx(x=a/b/c/d).i/o口的工作方式和整体表现特征由这三个i/o寄存器掌控。

AVR学习笔记

AVR学习笔记

ATmega16中断表第一节课Avr单片机的每个引脚有三个寄存器来控制:DDRnx(输入输出控制寄存器1输出,0输入)PORTnx(引脚输出电平控制)PINnx(输入寄存器)第二节课AVR单片机的AD转换涉及寄存器:ADMUX sbit[7;6]参考电压选择,sbit[5] AD转换数据对齐方式选择,sbit[4:0]通道与增益选择;ADCSRA sbit[7]AD使能,sbit[6]AD开始转换,sbit[5]自动触发使能,sbit[4]AD 中断使能,sbit[3:0]分频设置;SFIOR(触发源的选择)sbit[7:5] (ADTS)选择触发源,ADCL,ADCH数据寄存器;初始化步骤:1:设置通道的IO口为输入(高阻);2:设置与AD有关的寄存器;3:开总中断,SREG=BIT(7);4:写中断函数(中断标号是15)第三节课AVR有三个定时计数器,T/C0,T/C1,T/C2;T/C0,T/C2是两个8BIT的计数器;T/C1定时计数器,普通模式时机寄存器:TCCR1B:2:0时钟选择TCNT1L,TCNTH:定时数据TIMSK :TOIE 中断使能位 使用方法1, 选择时钟源,TCCR1B ;2, 设计初值,TCNT1L ,TCNT1H ;3, 设置中断使能位;TIMSK{2},SREG{7} 4, 选中断号,写中断函数 5, (中断号9)CTC 模式如果输出波形,则设IO 位输出 设置波形模式和时钟源TCCR1B 设置输出模式TCCR1A根据需要设置上限OCR1ATCCR1A 设置输出口频率计算:()A OCR N ffclko112+∙∙=控制寄存器A TCCR1ACOM1A1:0: 通道A 的比较输出模式 COM1B1:0: 通道B 的比较输出模式COM1A1:0与COM1B1:0分别控制OC1A 与OC1B 状态。

如果COM1A1:0(COM1B1:0)的一位或两位 被写入"1”,OC1A(OC1B) 输出功能将取代I/O 端口功能。

原创--IAR for AVR入门学习笔记

原创--IAR for AVR入门学习笔记

原创--IAR for A VR入门学习笔记A VR单片机的编译软件五花八门,用宋丹丹的话就是:那是相当的多汇编语言的开发平台就不说了(俺不大会,呵呵,说不出什么道道来)。

简单列举几个高级语言的开发平台:WINA VR(GNU GCC A VR);ICC A VRCodeVison A VRIAR for A VRBASIC A VRFastA VRBASCOM其中用得最多的是完全免费的WINA VR。

我一直都是用的这个。

最专业,最好的,对AVR支持最全面的是IAR。

但同时IAR也是最贵的一款开发软件(听说升级也要收费,真黑啊)。

呵呵,不过不怕,我们可以破解之。

下面就详细介绍如何破解IAR。

这里安装破解的是5.11B版本的。

全名IAREmbeddedWorkbenchforAtmelAVR,v.5.11B1、先到网上下载5.11B文件,大概133M。

解压后,有如下文件:a1.jpg (29.87 KB)2009-12-20 00:282、到网上下载破解文件解压后生成文件Keygen包,将它复制到C盘根目录下,如下图a2.jpg (63.75 KB)2009-12-20 00:283、打开文件包keygen,双击文件IARID.exe,出现本电脑ID号,如图,记下来a3.jpg (42.68 KB)2009-12-20 00:284、从电脑的“程序---运行”输入“CMD”回车,按照下图操作,得到sn.txt文件;注意输入计算机ID号的时候,所有字符全部大写,包括"0X"中的"X"也要大写,a4.jpg (161.06 KB)2009-12-20 00:285、然后运行安装文件中的autorun.exe,开始安装IAR,当出现要求输入注册号的时候,请用记事本打开刚刚生成的sn.txt 文件,找到"EW A VR" version "2.25_WIN"对应的号码段,先输入序列号,NEXT后,再复制key:后面的一串字符,注意只复制#之前的那一部分,包括#也要复制。

IAR for AVR 学习笔记

IAR for AVR 学习笔记

IAR for AVR 学习笔记IAR FOR AVR 学习笔记在AVR编程一直是C,从ICC->GCC->IAR IAR是一个唯一自己选择的.ICC由于入门容易所以选择了开始,GCC因为不要钱,所以后来就用了它.随着对GCC的不断认识,缺点不断显露,开始对IAR产生了兴趣.IAR在51,AVR,ARM的C上都是非常优秀的,它针对不同的单片机都有不同的C版本.唯一一点遗憾的是IAR的价格是个人和小公司难以承受的.当然网上有很多破解,现在的最新版4.20A也有了破解.IAR FOR AVR相关信息:破解方法:ID号注意一定要大写,不然注册将会失败 ,另外并不是每个号都是能用的了,要多试几次.如果注册成功后,编译就会通过.不然就报\没有可的证书\错误. 注意点:如何输出HEX文件?在配置文件后面加入以下代码,便可输出HEX文件,A90文件与HEX文件一样,SLISP都能识别.// Output File-Ointel-extended,(XDATA)=.eep //产生eeprom文件 -Ointel-extended,(CODE)=.A90 //产生烧写文件 -Ointel-extended,(CODE)=.hex //产生烧写文件中断向量的使用IAR中定义中断函数的格式是 ///////////////////////////////// #pragma vector=中断向量__interrupt void 中断服务程序(void) {//中断处理程序 }/////////////////////////////////////中断的初始化要另外加入代码,可在主程序内加入。

如下是各个中断函数的定义。

//中断定义#include#pragma vector=INT0_vect__interrupt void INT0_Server(void) { }#pragma vector=INT1_vect__interrupt void INT1_Server(void) { }#pragma vector=TIMER2_COMP_vect__interrupt void TIMER2_COMP_Server(void) { } #pragma vector=TIMER2_OVF_vect__interrupt void TIMER2_OVF_Server(void) { } #pragma vector=TIMER1_CAPT_vect__interrupt void TIMER1_CAPT_Server(void) { } #pragma vector=TIMER1_COMPA_vect__interrupt void TIMER1_COMPA_Server(void) { } #pragma vector=TIMER1_COMPB_vect__interrupt void TIMER1_COMPB_Server(void) { } #pragma vector=TIMER1_OVF_vect__interrupt void TIMER1_OVF_Server(void) { } #pragma vector=TIMER0_OVF_vect__interrupt void TIMER0_OVF_Server(void) { } #pragma vector=SPI_STC_vect__interrupt void SPI_STC_Server(void) { }#pragma vector=USART_RXC_vect__interrupt void USART_RXC_Server(void) { } #pragma vector=USART_UDRE_vect__interrupt void USART_UDRE_Server(void) { } #pragma vector=USART_TXC_vect__interrupt void USART_TXC_Server(void) { } #pragma vector=ADC_vect__interrupt void ADC_Server(void) { }#pragma vector=EE_RDY_vect__interrupt void EE_RDY_Server(void) { }#pragma vector=ANA_COMP_vect__interrupt void ANA_COMP_Server(void) { }#pragma vector=TWI_vect__interrupt void TWI_Server(void) { }#pragma vector=INT2_vect__interrupt void INT2_Server(void) { }#pragma vector=TIMER0_COMP_vect__interrupt void TIMER0_COMP_Server(void) { }#pragma vector=SPM_RDY_vect__interrupt void SPM_RDY_Server(void) { }如何把常数字符串定义在flash 空间?法一:unsigned char __flash temptab[] = {1,2,3,4,5}; 法二:__flashunsigned char temptab[] = {1,2,3,4,5}; 法三:#pragma type_attribute=__flash unsigned char temptab[]={1,2,3,4,5};法四:const unsigned char temptab[]={1,2,3,4,5};注:第三种方式用#pragma说明后,下面的定义的变量将都在FLASH空间了,用于定义一批FLASH变量,但实际上一般只能作为常量使用了.感谢您的阅读,祝您生活愉快。

AVR单片机一些学习笔记

AVR单片机一些学习笔记

AVR 单片机一些学习笔记
下面是自己在学习AVR 单片机时的学习经验,分享出来给大家,一起
学习。

1、AVR 单片机采用RISC 架构,8051 单片机采用CISC 架构。

前者速度为后者的2~4 倍,为流水线操作指令。

2、AVR 单片机有32 个通用寄存器(地址在RAM 区从$0000 开始到$001F),其中有6 个(最后6 个)合并为3 个16 位的X,Y,Z 寄存器,用来存放地址指针,Z 寄存器还可以寻址程序存储器。

3、哈佛结构,131 条机器指令。

4、延迟开机功能。

5、内部自带RC 振荡器,可提供1/2/4/8MHZ 的工作时钟。

6、FLASH+EEPROM+SRAM+SPI+USART+TWI+PWM+RTC+10 位ADC+模拟比较器+JTAG。

7、堆栈指针向下增长,51 单片机向上增长。

8、程序存储器按字来访问,擦除和写入以页为单位。

AVR学习笔记

AVR学习笔记

一、AVR单片机位操作
(1)置位。

要将R的第3位置1,其他位不变,可以这样做:R |= (1<<3),其中“1<<3”
的结果是“0b00001000”,R |= (1<<3)也就是R=R|0b00001000,任何数和0相或不变,任何数和1相或为1,这样达到对R的第3位置1,但不影响其他位的目的。

(2)清位。

要将R的第2位清0,其他位不变,可以这样做:R &= -(1<<2),其中“-(1<<2)”
的结果是“0b11111011”,R&=-(1<<2)也就是R=R&0b11111011,任何数和1相与不变,任何数和0相与为0,这样达到对R的第2位清0,但不影响其他位的目的。

(3)获得某一位的状态。

(R>>4) & 1,是获得R第4位的状态,“R>>4”是将R右移4位,将R的第4位移至第0位,即最后1位,再和1相与,也就是和0b00000001相与,保留R最后1位的值,以此得到第4位的状态值。

二、AVR单片机中断向量表
三、AVR单片机引脚图。

AVR自学笔记

AVR自学笔记

RXB8(bit1):接收数据位 8 TXB8(bit0):发送数据位 8 *UCSRC: URSEL(bit7):读 UCSRC 时为 1,写 UCSRC 时为 1(?)(编译器自动处理) UMSEL(bit6):0,异步。1,同步 UPM1~UPM0(bit5、4):奇偶校验模式
USBS(bit3):停止位数选择;0 时,1bit 停止位,1 时,2bit 停止位 UCSZ1~UCSZ0(bit2、1):字符长度设置
一、基础知识 1.开发工具: 编辑与编译软件:WinAVR 仿真软件:AVR Studio 下载软件:AVR_fighter、MuCodeISP 等 在需要在中断函数中被修改的全局变量需要用 volatile 关键字声明 2.第一个简单的 AVR 程序 AVR 引脚排列:
ATMega8 引脚排列
ATMega16 引脚排列
*PWM 输出频率计算公式(快速 PWM 模式)
*PWM 输出频率计算公式(相位修正 PWM 模式)
4. 异步串行口 USART(同步或异步): ①相关寄存器:UDR(数据寄存器)、UCSRA(控制与状态寄存器 A)、UCSRB(控制与状态寄存器 B)、UCSRC (控制与状态寄存器 C)、UBRRL(波特率寄存器 L)、UBRRH(波特率寄存器 H) ②三个中断源:发送结束中断、发送数据寄存器空中断、接收完成中断(常用) ③寄存器介绍 *UDR: 8 位数据寄存器,接收和发送为同一地址的不同寄存器 *UCSRA:
②注意 OCR0(输出比较寄存器)用于输出比较,产生事件匹配中断,这里没有列出 *TCCR0:
FOC0(bit7):强制输出比较,仅在 WGM00 指明非 PWM 模式时才有效 WGM00、WGM01(bit6、3):波形产生模式

avr学习笔记十四、模块化程序设计2.doc

avr学习笔记十四、模块化程序设计2.doc

A VR学习笔记十四、模块化程序设计(二)14.1 程序模块化设计(二)14.1.1、实例功能在前面一讲里,我们已经初步了解了模块化程序设计的简单知识,今天我们再深入探讨一下模块化程序设计。

我们先回顾一下前面一讲的主要内容:模块化程序设计是指将实现同一功能的程序整合起来,封装到一个程序模块中,这样在使用该功能的时候,可以直接调用该模块中的相关函数进行操作。

我们在单片机编程中经常用到的按键检测、液晶显示、数码管显示、串口通信、DS18B20温度检测、DS1302实时时钟等经常用到的程序都可以实现模块化。

模块化编程的最大优点是:思路清晰、移植方便、程序简化。

通常的做法是将某一模块中所有用到的端口定义,函数声明,函数定义等一起写到一个“.h”或者“.c”文件中,然后在主程序里面使用“#include”预编译指令将这些内容包含到主程序中,这样做调用虽然简单,但是对于模块化程序设计来说还是显得有些不太直观,因为我们调用模块中的函数的时候,需要在这一个模块文件中很费劲的找出需要的函数。

同样对于移植到别的单片机系统中的时候,需要遍历该模块文件,然后一一更改。

如果不小心,很容易造成错误。

更为标准的做法是我们将某一个功能模块的端口定义,函数声明这些内容放在一个“.h”文件中,而把具体的函数实现(执行具体操作的函数)放在一个“.c”文件中。

这样我们在编写主程序文件的时候,可以直接使用“#include”预编译指令将“.h”文件包含进主程序文件中,而在编译的时候将“.c”文件和主程序文件一起编译。

这样做的优点是,我们可以直接在“.h”文件中查找到我们需要的函数名称,从而在主程序里面直接调用,而不用去关心“.c”文件中的具体内容。

如果我们要将该程序移植到不同型号的单片机上,我们同样只需在“.h”文件中修改相应的端口定义即可。

在这一讲中,我们继续学习一下模块化程序设计。

本实例有两个功能模块:●继续了解模块化程序设计的思路和方法。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

:10002000189518951895089500008895FECF0FE94A :100030000DBF00E00EBFC0E8D0E003D0F4DFF4DF76 :06004000F3CF01E008957A :0400000300000000F9 :00000001FF 4.5.flash 操作宏函数:在comp_a90.h intrinsics.h头文件里有详细说 明。flash 空间具正常情况下有只读性能,对于读flash 数据编译器会自 动编译对应的LPM,ELPM指令,但对于flash 空间的自编程写命令SPM 就没有对应的C指令了,这里不讲解详细的自编程方法,只是讲解一下 对flash 的读写函数。 直接在程序中读取flash 空间地址数据:要包含intrinsics.h头文件 __load_program_memory(const unsigned char __flash *);//64K空间 //从指定flash 空间地址读数据。该函数在intrinsics.h头文件里有详细说 明。 在comp_a90.h文件有它的简化书写_LPM(ADDR)。注意汇编指令LPM Rd ,Z中的Z是一个指针。所以用(const unsigned char __flash *)来强制 转换为指向flash空间地址指针。故该条宏函数的正确写法应该如下: __load_program_memory((const unsigned char __flash *)ADDR); 例: #i nclude<iom8.h> #i nclude <intrinsics.h> void main(void) {PORTB=__load_program_memory((const unsigned char __flash *)0x12); } 该条函数书写不方便,在comp_a90.h文件有简化: #define _LPM(ADDR) __load_program_memory (ADDR)稍微方便一 点。改为 #define _LPM(ADDR) __load_program_memory ((const unsigned char __flash *)ADDR)就更方便了,直接使用数据就可以了。 例: #i nclude<iom8.h> #i nclude<comp_a90.h> #i nclude<intrinsics.h> void main(void) { PORTB=__LPM(0x12);// 从指定flash 空间地址单元0x12中读数据 } __extended_load_program_memory(const unsigned char __farflash *); //128K空间_ELPM(ADDR); //128K空间 参照上面的理解修改可以书写更简单。 4.6.自编程函数: _SPM_GET_LOCKBITS();//读取缩定位 _SPM_GET_FUSEBITS();//读取熔丝位 _SPM_ERASE(Addr);//16位页擦除
unsigned char bit3:1; unsigned char bit4:1; unsigned char bit5:1; unsigned char bit6:1; unsigned char bit7:1; }t; 然后就可以用以下位变量了。 t.bit0=1; t.bit0=~t.bit0; 但是采用以上结构体做出来的位变量只可以访问t的位,不能够直接访 问变量t,和标准的IAR位操作也不一样。采用联合体来定义效果更佳。 #i nclude<iom8.h> union { unsigned char t; struct {unsigned char t_bit0:1, t_bit1:1, t_bit2:1, t_bit3:1, t_bit4:1, t_bit5:1, t_bit6:1, t_bit7:1; }; }; void main(void) { t_bit0=1;//访问变量t的位 t_bit0=~t_bit0; PORTB=t;//直接访问变量t } 位变量也可以直接定义在工作寄存器里。 3.4 bool 数据类型在C++语言里是默认支持的。 如果你在C代码的头文件里包含stdbool.h, bool数据类型也可以使用 在C语言里。也可以使用布尔值 false和 true。不过是占用8位1个字 节。 #i nclude<iom8.h> #i nclude<stdbool.h> bool y=0;//定义位变量 void main(void) { y=!y;//取反位变量 PORTB_Bit3=y;//传递位变量 }
IAR for AVR 学习笔记(3)--位操作
3.1.在c语言里对位的操作如一般如下: PORTB|=(1<<2);//置PORTB的第2位=1 PORTB&=~(1<<2);//置PORTB的第2位=0 PORTB^|=(1<<2);//取反PORTB的第2位 While(PORTB&(1<<2));//判断1 While(!(PORTB&(1<<2)));//判断为0 3.2.IAR编译器对位的支持更强大,除了上面的方法外还有以下更简 单的操作方法: PORTB_ Bit2=1; //置PORTB的第2位=1 PORTB_ Bit2=0; //置PORTB的第2位=0 PORTB_ Bit2=~ PORTB_ Bit2;//取反PORTB的第2位 While(PORTB_ Bit2);或者while(PORTB_Bit2==1);//判断1 while(PORTB_ Bit2==0);//判断0 PORTC_Bit4=PORTB_Bit2;//把PORTB的第2位传送到PORTC的第4位 3.3.位变量定义: 由于iar使用了扩展语言,它对位域的支持变为最小为char类型,我们 可以很方便地用来定义位变量。 采用结构体来定义位变量: struct { unsigned char bit0:1; unsigned char bit1:1; unsigned char bit2:1;
IAR for AVR学习笔记 IAR for AVR 学习笔记(1)--数据类型
数据类型(编译器支持 ISO/ANSI C 基本数据类型和一些附加数据类 型) 1.1. 整型数据
bool 数据类型在C++语言里是默认支持的。如果你在C代码的头文件里 包含stdbool.h, bool数据类型也可以使用在C语言里。也可以使用布尔 值 false和 true。 1.2.浮点数据类型:
IAR for AVR 学习笔记(4)--Flash操作
FSH 区域数据存储。 用关键字 __flash 控制来存放, __ flash 关键字写在数据类型前后效果 一样 __flash unsigned char a;//定义一个变量存放在flash空间 unsigned char __flash a;//效果同上 __flash unsigned char p[];//定义一个数组存放在flash空间 对于flash空间的变量的读操作同SRAM数据空间的操作方法一样,编译 器会自动用 LPM,ELPM 指令来操作。 例: #i nclude<iom8.h> __flash unsigned char p[]; __flash unsigned char a; void main(void) {PORTB=p[1];// 读flash 数组变量的操作 PORTB=a;// 读flash 变量的操作 } 由于在正常的程序中,flash 空间是只读的,所以没有赋值的变量是没 有意义的。定义常数在flash 空间,只要给变量赋与初值就可以了。由 于常数在flash空间的地址是随机分配的,读取变量才可以读取到常数 值。 10 IAR-AVR –C 编译器简要指南 __flash unsigned char a=9;//定义一个常数存放在EEPROM空间。 __flash unsigned char p[]={1,2,3,4,5,6,7,8}; //定义一个组常数存放在flash 空间。 例: #i nclude<iom8.h> __flash unsigned char p[]={1,2,3,4,5,6,7,8}; __flash unsigned char a=9; void main(void) { PORTB=a;//读取flash 空间值9 PORTC=p[0]; //读取flash 空间值 } 4.1.2flash 空间绝对地址定位: __flash unsigned char a @ 0x8;//定义变量存放在flash 空间0X08单元 __flash unsigned char p[] @ 0x22//定义数组存放在flash 空间,开始地 址为0X22单元 __flash unsigned char a @ 0x08=9;//定义常数存放在flash 空间0X08 单元 __flash unsigned char p[] @ 0x22={1,2,3,4,5,6,7,8}; //定义一个组常数存放在EEPROM空间开始地址为0X22单元 由于常数在flash 空间的地址是已经分配的,读取flash 空间值可以用变 量和地址。 4.2.与 __flash 有关的指针操作。 __flash 关键字控制指针的存放和
IAR for AVR 学习笔记(2)--扩展关键字
可以用来解决数据,函数的存放等。有了它我们就可以定义变量 存放在EEPROM,FLASH空间。定义中断函数,指针等等。IAR关键 字很多,这里只列举常用的。 2.1.扩展关键字:用于控制数据和指针。 __eeprom 用于EEPROM 存储空间, 控制数据存放,控制指针类型和存 放 __tinyflash, __flash, __farflash, __hugeflash 用于flash 存储空间, 控制 数据存放,控制指针类型和存放: __ext_io, __io 用于I/O存储空间, 控制数据存放,控制指针类型和存放 __regvar 放置一个变量在工作寄存器中 2.2.函数扩展关键字:。 __nearfunc __farfunc 用于控制数据存放,这组关键字必须在函数声明和 定义的时候指定: __interrupt. 关键字控制函数的类型。这组关键字必须在函数声明和定 义的时候指定 __root. 关键字仅仅控制有定义的函数: 2.3.其它特别的关键字: @ 用于变量的绝对地址定位。也可以用#pragma location 命令 #pragma vector 提供中断函数的入口地址。 __root 保证没有使用的函数或者变量也能够包含在目标代码中 __no_init 禁止系统启动的时候初始化变量. asm, __asm 插入汇编代码
相关文档
最新文档