天天看點

别人的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個時鐘周期。