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、 程序存储器按字来访问,擦除和写入以页为单位。
9、 复位时,所有的 I/O 口处于没有上拉电阻的输入状态(高阻)。
10、 没有中断优先级控制寄存器,由中断向量表的地址决定优先级(地址越低,优先级越高)。
11、 PORTB |= (1<<2)D2 置 1,PORTB&= ~(1<<6)D6 清零。
12、 FLASH 分两段:引导程序段(BootProgram Section)+应用程序段(Application Program Section)。BPS 中可以使用 SPM 指令实现 IAP 功能。
13、 中断向量表位于 FLASH 程序存储器的最前面。
14、 I/O 空间为连续的 64 个 I/O 寄存器空间,在数据存储器空间的映射地址为$0020~$005F。访问 I/O 寄存器的两种方式:IN,OUT 指令+对 SRAM 访问指令。
15、 单独的 AVcc 用于给 PORTA 的 ADC 做 AREF。
16、 13 位的程序计数器 PC,正好满足 16KB 的寻址。
17、 AVR 对片内 SRAM 的访问需要 2 个时钟周期。
19、 状态寄存器 SREG:
I:全局中断使能位。置 1,CPU 可以响应中断;清 0,CPU 禁止响应中断。清 0时,单独的中断触发控制的值保持不变。并且中断响应后,I 由硬件清 0(手动置 1 实现中断嵌套),由 RETI 置 1 再响应其他中断。
T:位复制存储。BLD,BST。可以将通用寄存器组中的任何一位复制到 T 中,反过来也可以。
H:半进位标志位。用于 BCD 的运算。
S:符号标志位。S=N⊕V。不管溢出与否(溢出后 N 的表示就不正确了!),但 S总是能正确的表示计算结果的符号。
V:2 的补码溢出标志位。溢出时,N 取反才是真正的结果符号。
N:负数标志位。直接取自运算结果的最高位。
Z:零值标志位。运算结果为 0,置 1。
C:进/借位标志。
20、 MCUCSR 可以查看复位原因。
21、 掉电检测(BOD)复位,2.7V 阈值,具有迟滞效应(间隙特性??) 22、 在 FLASH 的$0000H 存放的是一条 JMP 或者 RJMP 指令,用来跳转到正式代码入口。$0002H~0028H(针对中断向量为一个字的,如果中断向量为两个字$0002H~0050H)存放的是中断向量表,20 个中断口<算上第一个复位中断为 21个>,主程序开始在$002AH。
23、 硬件开发工具:软件模拟仿真器,实时在板仿真器(ICE),实时在片仿真器(JTAG)。
24、 每组 I/O 口配置三个寄存器用来表征他们的状态:方向控制寄存器DDRx(Data Direction Register),数据寄存器 PORTn,输入引脚寄存器 PINx。
25、 DDRx=1,I/O 口处于推挽输出工作方式,PORTn 为 1 输出 20mA 电流,为 0吸纳 20mA 电流。DDRx = 0,I/O 口处于输入工作方式,将 PINx 中的电平读入到 DB 上(PORTn 用来设置是否使用内部上拉电阻,1 为使用,0 为不使用)在SFIOR 中有一位 PUD,PUD=1 全部 I/O 上拉电阻无效,PUD =0,上拉取决于PORTn 的设置。
26、 使用 I/O 口时,一定要先配置 I/O 口。首先配置 DDRx,确定 I/O 口是输入还是输出。根据实际情况,输入时需要配置是上拉还是下拉(上拉就是默认输入是高电平,下拉就是默认输入是低电平)。
27、 I/O 口输入方式时,应该读取的是 PINx 的值。
28、 输出口操作:
PORTA |= (1 < PORTA &= ~(1<< PORTAx) // 位置低 PORTA ^= (1 < 输入口操作:
PINA & (1<< PORTAx) // 位读取 29、 有三个外部中断(INT0,INT1,INT2),其中 INT2 只支持边缘触发 30、 满足中断条件,AVR 硬件自动将相应的中断标志位置 1,并且由硬件自动清除(仅对于部分中断有此功能,当然也可以手动软件清除,清除的方法是写1),硬件也同时自动清除 I 标志位(缺省不能进行中断嵌套,SEI 将 I 置 1,使能中断嵌套功能)。
31、 退出中断后,AVR 至少要再执行一条指令后才能去响应其他被挂起的中断。
32、 中断响应至少需要 4 个 CK 才能开始运行中断向量表中的跳转指令(清 I,清中断标志位,压栈 PC,中断向量送入 PC),至于要真正开始运行用户的代码,至少需要 6~7 个 CK。中断返回 RETI 也需要 4 个 CK(弹出 PC,置 SREG 中的 I 为1)。
33、 在使能中断允许位之前,最好先将对应中断源的中断标志位清除,为了防止在使能时,会立马产生一次“多余”的中断。
34、 INT0,INT1 支持四种形式的中断触发:上升沿,下降沿,任意电平变化,低电平(不带中断标志位,低电平并不影响 INTF0 和 INTF1 的值(保持为 0))。INT2 只支持异步的上升沿和下降沿触发(常用作唤醒 MCU 功能)。
35、 中断初始化步骤:配置中断触发类型(MCUCR,MCUCSR),使能对应的中断(GICR),清除对应的中断标志位(GIFR),使能全局中断(asm(“SEI”))。AVR STUDIO6 中的中断写法:SIGNAL(xx){}(x 为中断向量号)或者 ISR(xx){}。
36、 T/C0 和 T/C2 可产生 PWM,频率发生器,外部事件计数器(仅 T/C0),10 位时钟预分频器,溢出和比较匹配中断源,允许用 32.768kHz 晶体作为独立的计数时钟源(仅 T/C2)。
37、 时钟源和 51 单片机差不多:(CS[2:0]共八种选择),停止计数,上升沿或下降沿,10 位预分频器(1/1,1/8,1/64,1/256,1/1024)。
38、 TCNT0(8 位)寄存器用来存放计数数值,如果在计数器运行期间写入数值,那么在下一个定时时钟周期中会阻塞比较匹配(丢失一次 TCNT0 和 OCR0 的匹配操作)。
39、 OCR0 中的数据会一直和 TCNT0 中的数值进行比较,如果匹配,将产生一个比较匹配的中断申请或者改变 OC0 的输出逻辑电平。
40、 TIMSK 中的 OCIE0(OutputCompare Interrupt Enable),TOIE(Timer Overflow Interrupt Enable)分别为比较匹配中断允许标志位和溢出中断允许位,当 I 被置位时,满足条件即可触发对应的中断。
41、 TIFR 中的 OCF0(OutputCompare Flag)和 TOV0(Timer Overflow)分别为比较匹配标志位和定时器溢出标志位。
42、 TCCR 中的 WGM[1:0]决定 T/C0 的四种工作方式:普通模式,比较匹配时定时器清 0,两种 PWM 模式。COM[1:0]比较匹配输出方式的作用取决于 T/C0 的工作方式。普通模式(WGM[1:0]=0):计数到 0xFF 会产生溢出中断,TOV0 置 1。比较匹配清 0 计数器 CTC 模式(WGM[1:0]=2):f=f(IO)/(2N(1+OCR0)),TCNT0 和OCR0 匹配,匹配后 TCNT0 清 0 重新计数,同时置 OCF0 为 1,便于产生中断。在中断中改变 OCR0 的值,在 OC0 中可以输出可变的高低电平信号。快速 PWM 模式(WGM[1:0]=3):f=f(IO)/(256N),TCNT0 从 0 计数到 0xFF,然后重新开始计数,如果匹配 OCR0 则根据 COM[1:0]中的设置值分别置位或者清 0OC0,以此来输出PWM 波形。相位可调 PWM 模式(WGM[1:0]=1):双向计数器,所以最高 PWM 频率比快速 PWM 模式慢了一半。
43、 T2 定时器的分频系数与 T0 不同,注意区别。
44、 T1 定时器在读取数据时,先读低八位,再读高八位。在写入数据时,先写高八位,再写低八位。就像对高位压栈一样。
45、 由于 T1 可以修改计数器的上限值(TOP),所以可以产生频率可变的 PWM 波形,而 T0/T2 定时器无法做到这一点。
46、 T1 的工作模式由 WGM1[3:0]决定,由此可以看出 T1 有 16 种工作模式。普通模式(WGM1[3:0]=0)。CTC 模式(GWM1[3:0]=4 或 12)。快速 PWM 模式(GWM1[3:0]=5,6,7,14,15)有两路同时输出,OC1A,OC1B。
47、 T1 输入捕捉功能:触发信号由 ICP1 输入或者又模拟比较器 AC0 输入。触发时,TCNT1 的值被写入到 ICR1 中置位 ICF1。此外,ICNC(Input Capture NoiseCanceler)为噪声抑制功能,实现原理就是延迟 4 个 CK 检测电平变化,如果连续 4 个 CK 不变,则认为是真正的触发。ICES(Input Capture Edge Select)为触发边缘的选择,0 为下降沿,1 为上升沿。
48、 模拟比较器(正极 AIN0 和负极 AIN1),SFIOR(Special Funciton IO Register)中的 ACME(Analog Comparator Multiplexer Enable)模拟比较多路使能,置 1 并且 ADC 失能,比较器负极接到 ADC 的多路开关。置 0,比较器负极接到 AIN1。ACSR(AnalogComparator Control and Status Register)模拟比较器控制和状态寄存器。ACD(AnalogControl Disable)置 1 时,切断模拟比较器的开关。在改变设置时,应先失能 ACIE,禁止产生模拟器比较中断。ACO(Analog Comparator Output)模拟比较器输出。ACIS[1:0](AnalogComparator Interrupt Select)模拟比较器中断模式选择。
49、 AVCC 为 ADC 模块的独立电源。参考电源可选择片内 2.56V,AVCC 或者外部参考电源。
50、 ADMUX(ADC 多路复用选择寄存器),ADLAR(ADC LeftAdjust Result)结果左对齐。ADCSRA(ADC 控制和状态寄存器 A),ADEN,ADC 使能位。ADSC(ADC Start Conversion)开始转换位。ADATE(ADC Auto Trigger Enable)自动触发开始转换,信号源由 SFIOR 的 ADTS 位决定。ADPS[2:0]预分频选择位。
51、 如果 AVREF 接到外部电源,那么就不能使用内部参考电源。
52、 ADC 模块在使能 ADATE(自动触发转换)后,利用 T0 的溢出中断来触发开始转换,一定要开启 T0 的中断允许位(TOIE0),否则无法触发转换。
53、 一次正常的 ADC 转换过程需要 13 个采样时钟,假定 ADC 采样时钟频率为200kHZ,那么最高的采样频。率为 200kHZ/13=15.384kHZ,所以由香农定理,被测信号的最高频率为 7.7kHZ。
54、 通用同步/异步串行接收/发送器(Universal Synchronous and Asynchronous Serial Recevier andTransimitter)支持四种工作模式:普通异步模式、双倍速异步模式、主机同步模式和从机同步模式。UCSRC 中的 UMSEL(U Mode Select)位用于选择同步或异步模式。UCSRA 中的 U2X 用于控制是否使用倍速模式。
55、 波特率计算公式:BAUD=fosc/(16(UBRR+1))。
56、 UCSRA 中的 UDRE(U Data Register Empty)置 1 时(数据寄存器为空),UDR才能够被写入,一旦被写入,硬件自动将其中的内容送到 TXD 上串行移出。RXD和 TXD 均可以产生相应的中断,并在进入中断后标志自动清 0。
57、 由于 UBRRH (U Baud Rate Register)和 UCSRC 的物理地址相同,只是在最高位 URSEL 的不同,而写操作和读操作的对象不同。当 URSEL 为 0 时,对象为 UBRRH;当 URSEL 为 1 时,对象为 UCSRC。(读 UCSRC 时,需要连续读两次才能得到结果,第一次读的是 UBRRH 的值)。
58、 USART 的初始化包括:设置波特率,使能接收和发送器,设置帧格式。
数据发送:while(!(UCSRA& (1 << UDRE))); UDR = data;UDRE 在 UDR 被写入值后被硬件自动清 0,如果在 UDR 空中断没有对 UDR 赋值,那么 UDRE 没有清 0,退出中断后会再次触发中断。但是 TXC 中断可以硬件自动清 0TXC 标志 数据接收:while(!(UCSRA & (1 << RXC)));data = UDR;RXC 在 UDR 数据被读出后被硬件自动清 0,所以在 RXC 中断时必须读取 UDR,以清 0RXC。或者手动清 0RXC TXD 和 RXD 功能由 TXEN 和 RXEN 的设置来开启和关闭
59、 如果 UCSRA 中的 FE,PE,DOR 在 RXC 中断中需要读出进行错误检测,那么一定要先读 UCSRA 再读 UDR 60、 串行外设接口(Serial Peripheral Interface,SPI.飞思卡尔公司提出),两线串行接口(Two-wireSerial Interface,TWI)。SPI 一般有四根信号线:MOSI,MISO,SCLK,/SS.可以想象一下主机和从机从 MOSI 到 MISO 收尾相连形成环(本质就是串行移位呗~),当数据全部交换完毕后,主机拉高/SS,停止 SPI 传输。这就是为什么 SPI 比 TWI(I2C)快的原因:因为数据是全双工,并且数据走不同的通道。
61、 SPI 有四种工作模式,取决于同步时钟的极性(Clock Polariy)和同步时钟的相位(Clock Phase)2 个参数。
62、 SPI 的主机方式最高速率为(CK/2),从机方式最高速率为(CKI/4) 63、 数据寄存器 SPDR。在读 SPDR 时,读取的是缓冲寄存器内容;写 SPDR 时,写到移位寄存器中。一旦将数据写入 SPDR,硬件自动传输一次 SPI 通信,如果中断允许,则进入 SPI 中断。
64、 SPI 速率一般为 1MHZ,最高可达 10MHZ 65、 TWI 工作在被控模式时,CPU 频率 fcpuclock 必须大于 TWI 时钟线 SCL 频率的 16 倍。SCL 的频率:
(在主机模式下,TWBR 应大于 10.另外特别需要注意的一点:
指的不是 4 的 TWPS 次方,应该是按照分频表格,将表格中的 1,4,16,64 替换 整体) 66、 TWINT 中断标志位,当其被置位时,时钟线 SCL 被拉低,并且执行中断向量时,标志不会清 0,只能靠手动软件清 0。
67、 如果 TWINT 被置位,表示正在传送数据,此时如果写入 TWDR,那么TWWC(写冲突)会被置位。也就是说当 TWINT 被置位时,TWDR 应该保持稳定,这和 I2C 的协议是一致的。
68、 TWAR(地址寄存器)的高 7 位用于存储自己的地址,最后一位 TWGCE(TWI General Call Recognition Enable)为地址匹配成功使能位。如果地址匹配成功,将会产生一次 TWI 中断 69、 在 I2C 的 TWI 寄存器设置中,不能使用|赋值,必须整体赋值 70、 CKOPT 当系统频率较高时或者要求抗干扰能力强,设置为 1。如果系统频率低,设置为 0,这样可以减少电流的损耗。
71、 片内 EEPROM,执行读操作时,CPU 停止运行 4 个时钟周期。而在执行写操作时,CPU 停止运行 2 个时钟周期。
推荐访问:AVR单片机一些学习笔记 单片机 学习笔记 完整
热门文章:
- 最新文明礼貌月活动策划,文明礼貌月活动方案(优秀1合集)(全文完整)2024-08-22
- 2023年医院护士面试自我介绍(优秀17篇)2024-08-22
- 2023年最新六年级自我介绍(汇总18篇)2024-08-22
- 学生会个人简历如何写(优秀9篇)2024-08-22
- 2023四年级学生自我介绍,四年级学生自我介绍(大全8篇)(全文完整)2024-08-22
- 房屋租赁合同书样本,房屋租赁合同书(优质11篇)【精选推荐】2024-08-22
- 设备租赁合同(通用12篇)2024-08-22
- 最新转让协议书才有法律效力(大全10篇)(全文完整)2024-08-22
- 2023海边捡垃圾社会实践报告,垃圾处理社会实践报告(优秀8篇)(范文推荐)2024-08-22
- 最新外科护士自我鉴定(实用18篇)2024-08-22