Stm32 吐血100問
時間:2021-12-07 14:47:29
手機看文章
掃描二維碼
隨時隨地手機看文章
[導(dǎo)讀]1、AHB系統(tǒng)總線分為APB1(36MHz)和APB2(72MHz),其中2>1,意思是APB2接高速設(shè)備;2、Stm32f10x.h相當(dāng)于reg52.h(里面有基本的位操作定義),另一個為stm32f10x_conf.h專門控制外圍器件的配置,也就是開關(guān)頭文件的作用;3、HSE...
2、Stm32f10x.h相當(dāng)于reg52.h(里面有基本的位操作定義),另一個為stm32f10x_conf.h專門控制外圍器件的配置,也就是開關(guān)頭文件的作用;3、 HSE Osc(High Speed External Oscillator)高速外部晶振,一般為8MHz,HSI RC(High Speed InternalRC)高速內(nèi)部RC,8MHz;4、 LSE Osc(Low Speed External Oscillator)低速外部晶振,一般為32.768KHz,LSI RC(Low Speed InternalRC)低速內(nèi)部晶振,大概為40KHz左右,提供看門狗時鐘和自動喚醒單元時鐘源;5、 SYSCLK時鐘源有三個來源:HSI RC、HSE OSC、PLL;
6、 MCO[2:0]可以提供4源不同的時鐘同步信號;7、 GPIO口貌似有兩個反向串聯(lián)的二極管用作鉗位二極管;8、 總線矩陣采用輪換算法對系統(tǒng)總線和DMA進行仲裁9、 ICode總線,DCode總線、系統(tǒng)總線、DMA總線、總線矩陣、AHB/APB橋10、在使用一個外設(shè)之前,必須設(shè)置寄存器RCC_AHBENR來打開該外設(shè)的時鐘11、數(shù)據(jù)字節(jié)以小端存儲形式保存在存儲器中12、 內(nèi)存映射區(qū)分為8個大塊,每個塊為512MB13、 FLASH的一頁為1K(小容量和中容量),大容量是2K。14、 系統(tǒng)存儲區(qū)(SystemMemory)為ST公司出廠配置鎖死,用戶無法編輯,用于對FLASH區(qū)域進行重新編程。所以我們燒寫程序務(wù)必選擇BOOT1 = 0,這樣通過內(nèi)嵌的自舉程序?qū)LASH進行燒寫,比如中斷向量表和代碼15、 STM32核心電壓為1.8V16、 STM32復(fù)位有三種:系統(tǒng)復(fù)位、上電復(fù)位、備份區(qū)域復(fù)位。其中系統(tǒng)復(fù)位除了RCC_CSR中的復(fù)位標(biāo)志和BKP中的數(shù)值不復(fù)位之外,其他的所有寄存器全部復(fù)位。觸發(fā)方式例如外部復(fù)位、看門狗復(fù)位、軟件復(fù)位等;電源復(fù)位由于外部電源的上電/掉電復(fù)位或者待機模式返回。復(fù)位除了BKP中的寄存器值不動,其他全部復(fù)位;備份區(qū)域復(fù)位的觸發(fā)源為軟件復(fù)位或者VDD和VBAT全部掉電時。17、 單片機復(fù)位后所有I/O口均為浮空輸入狀態(tài)18、 68個可屏蔽中斷通道,16個可編程優(yōu)先級,16個內(nèi)核中斷,一共68 16=84個中斷。103系列只有60個中斷,107系列才有68個中斷19、 系統(tǒng)啟動從0x00000004開始,0x000 0000保留20、 (NestedVectored Interrupt Controller)NVIC嵌套向量中斷控制器,分為兩種:搶先式優(yōu)先級(可嵌套)和中斷優(yōu)先級(副優(yōu)先級,不能嵌套)。兩種優(yōu)先級由4位二進制位決定。分配下來有十六種情況:
21、0號搶先優(yōu)先級的中斷,可以打斷任何中斷搶先優(yōu)先級為非0號的中斷;1號搶先優(yōu)先級的中斷,可以打斷任何中斷搶先優(yōu)先級為2、3、4號的中斷;……;構(gòu)成中斷嵌套。如果兩個中斷的搶先優(yōu)先級相同,誰先出現(xiàn),就先響應(yīng)誰,不構(gòu)成嵌套。如果一起出現(xiàn)(或掛在那里等待),就看它們2個誰的子優(yōu)先級高了,如果子優(yōu)先級也相同,就看它們的中斷向量位置了。原來中斷向量的位置是最后的決定因素?。。?!22、 上電初始化后AIRC初始化為0,為16個搶先式優(yōu)先級,但是由于所有的外部通道中斷優(yōu)先級控制字PRI_n為0,所以搶先式優(yōu)先級相同,此時就不能嵌套了23、 NVI中有ISER[2](Interrupt Set-Enable Registers),ICER[2](Interrupt Clear-Enable Registers),ISPR[2](Interrupt Set-Pending Registers),ICPR[2](Interrupt Clear-Pending Registers),IABR[2](Active Bit Registers),IPR[15](InterruptPriority Registers)定義。其中ISER和ICER分別為中斷使能和中斷失能寄存器,都是寫1來使能/失能中斷的。為什么寫1?為什么不采用一個寄存器而用兩個寄存器來表示中斷使能/失能狀態(tài)?由于硬件,寫0比較復(fù)雜,并且可能造成其他位的狀態(tài)改變,所以用1來表示打開或者關(guān)斷是比較合理的24、 中斷標(biāo)志位需要手動清除;25、 配置外圍器件的一般步驟:1、打開端口時鐘。2、定義初始化結(jié)構(gòu)體并初始化。3、調(diào)用26、串口的奇偶校驗:如果是奇偶校驗,那么USART_InitStructure.USART_WordLength= USART_WordLength_9b;這個數(shù)據(jù)的長度必須設(shè)定為9位!27、ADC的規(guī)則組可以自定義轉(zhuǎn)換通道順序和轉(zhuǎn)換的通道個數(shù)。在實際應(yīng)用中,有時候希望有一些特別的通道具有很高的優(yōu)先權(quán),需要在規(guī)則組進行轉(zhuǎn)換的時候強制打斷,進行另一個通道的轉(zhuǎn)換,這樣一組通道,叫做注入組。28、定時器的輸出比較模式:Timing(凍結(jié),什么都不做,普通定時),Active(OCxREF輸出高電平有效),Inactive(OCxREF輸出低電平),Toggle(比較成功后翻轉(zhuǎn)電平)。29、STM32的定時器從0開始計數(shù),滿足一些條件,給出標(biāo)志位(比如匹配成功、時間更新、溢出等)然后從0開始計數(shù)。這一點和51不同。30、OCx=OCxREF 極性31、自動裝載寄存器和影子寄存器:前者相當(dāng)于51當(dāng)中的溢出設(shè)定數(shù)值。而影子寄存器顧名思義是影子,就是寄存器的另一分copy。實際起作用的是影子寄存器,而程序員操縱的則是自動裝載寄存器。如果APPE位使能,表明自動裝載寄存器的值在下一次更新事件發(fā)生后才寫入新值。否則,寫入自動裝載寄存器的值會被立即更新到影子寄存器。32、RCC_PCLK1Config(RCC_HCLK_Div4);PCLK1的4分頻給定時器基準(zhǔn)時鐘33、定時器配置:RCC、NVIC、GPIO(OC輸出或者PWM)、TIMx34、通用定時器可以輸出4路不同的PWM,高級定時器可以輸出4路不同的PWM外,還可以輸出3路互補的PWM信號(驅(qū)動三相電機),一共有7路。這樣算出來STM32可以產(chǎn)生30路PWM=72 4435、36、高級定時器時鐘源掛在了APB2上,而通用定時器掛在APB1上。AHB(72mhz)→APB1分頻器(默認(rèn)2)→APB1時鐘信號(36mhz)→倍頻器(2倍)→通用定時器時鐘信號(72mhz)。如果APB1沒有分頻,那么通用定時器的時鐘信號頻率就直接等于APB1的時鐘頻率,沒有上述的倍頻器2過程。TIM_SetAutoreload()用來改變PWM的頻率,TIM_SetCompare1()用來改變占空比37、有刷電機一般啟動力矩大一些,無刷電機啟動力矩小,運行起來力矩大。有刷電機采用電刷機械電流換向,而無刷電機則通過霍爾傳感器測出轉(zhuǎn)子的電流來判斷電機的運動位置和方向,返回給控制回路。38、死區(qū)是必須要有的,因為這涉及到電路的短路問題。晶閘管在換向的時候需要死區(qū)時間來徹底關(guān)斷線路39、剎車功能用來在控制回路出現(xiàn)問題時,硬件自動給予外部電機進行緊急剎車制動,反應(yīng)在PWM上持續(xù)給出一個固定的占空比?(三相驅(qū)動也是?)40、PWM輸出最好采用PWM模式,其他的比較輸出模式相位會慢慢改變,不精準(zhǔn);41、對FLASH的讀寫需要先解鎖后加鎖。FLASH寫0容易,寫1難。42、下載程序有兩種方式,一種為ICP(在線編程),適用于JTAG或SWD協(xié)議下的燒寫程序。另一種成為IAP(在應(yīng)用編程),適用于很多接口(USB,串口,CAN)下載到存儲器中,IAP允許在程序運行時重新燒寫FLASH43、FLASH分為主存儲器(這里放置用戶的程序代碼)和信息塊(啟動代碼),除此之外,還有一部分叫做系統(tǒng)存儲器,這一塊用戶不可操作,為ST公司出產(chǎn)后固化,為系統(tǒng)的上電自舉程序44、FLASH在寫的時候,一定不能讀,如果有讀操作,那么將會鎖住總線45、對FLASH操作時,必須打開HIS;46、STM32有兩種看門狗(IWDG獨立看門狗《獨立時鐘》,WWDG窗口看門狗《由APB1分頻而來》)47、SPI的的最高頻率為36MHz(fpclk/2)48、 TIM1和TIM8高級定時器在輸出PWM時,需要配置一下主輸出功能(CtrlPWMOutputs)才能輸出PWM。其他的通用定時器不需要這樣配置。但是TIM6和TIM7沒有PWM輸出功能。49、Code為程序代碼部分
RO-data 表示程序定義的常量(如:const temp等);
RW-data 表示已初始化的全局變量
ZI-data 表示未初始化的全局變量,以及初始化為0的變量
Code, RO-data,RW-data…flash
RW-data, ZIdata…RAM
初始化時RW-data從flash拷貝到RAM50、STM32F103ZET6有144個引腳(Z為144),其中,可用IO口為112個(7X16=112,ABCDEFG口);51、ARM公司只生產(chǎn)內(nèi)核標(biāo)準(zhǔn),不生產(chǎn)芯片。ST、TI這樣的公司從ARM公司那里購買內(nèi)核,然后外加自己的總線結(jié)構(gòu)、外設(shè)、存儲器、時鐘和復(fù)位、I/O后就組成了自己的芯片。
52、CMSIS標(biāo)準(zhǔn)用于在向上的用戶層和下面的硬件層交換信息。這個架構(gòu)當(dāng)然可以自己定義,但是這樣的話就會沒有標(biāo)準(zhǔn)。所以強制使用CMSISI標(biāo)準(zhǔn)來設(shè)計芯片。通俗點的講就是系統(tǒng)初始化的函數(shù)名稱CMSIS定義為SystemInit(),GPIO_ResetBits()等53、端口復(fù)用和端口重映射是兩個概念:前者在使能其對應(yīng)的端口和對應(yīng)的功能時鐘即可。后者需要打開AFIO時鐘,然后進行端口的重映射GPIO_PinRemapConfig()54、下載程序只能使用串口1,在硬件設(shè)計時一定要注意!55、J-TAG調(diào)試頻率一般設(shè)定為2MHz,而SWD調(diào)試頻率可以設(shè)定為10MHz56、SysTick的中斷實現(xiàn)可以有兩種方式:循環(huán)等待和中斷法。推薦用循環(huán)等待,中斷法可能會出問題而且占用資源。57、部分I/O引腳是5V兼容的。單個I/O的最大驅(qū)動電流和灌入電流均為25mA。整個芯片的電流為150mA58、KEIL支持位段操作,可以利用C語言中的位段知識定義位段結(jié)構(gòu)體,然后對單獨的寄存器進行單獨的位操作。59、關(guān)于內(nèi)部上下拉電阻的設(shè)置:如果外部的按鍵另一頭接地,那么需要設(shè)置成上拉電阻。(理由是當(dāng)沒有按下按鍵時,由于上拉,輸入為高電平;按下時,由于外部接地,輸入為低電平。)同理,如果外部的按鍵另一頭接高電平,那么需要設(shè)置成下拉電阻。60、串口中斷TXE和TC的區(qū)別:其實很明顯,一個是發(fā)送寄存器空標(biāo)志,一個是發(fā)送完成標(biāo)志。因為串口在發(fā)送的時候首先需要把發(fā)送寄存器中的數(shù)據(jù)移位到移位寄存器(影子寄存器)后再串行發(fā)送出去。所以當(dāng)發(fā)送寄存器DR空時說明現(xiàn)在可能正在往外面發(fā)送數(shù)據(jù),數(shù)據(jù)可能還沒有發(fā)送完。但是發(fā)送完成不一樣,他是在移位寄存器將本次數(shù)據(jù)全部移位完成后設(shè)置的標(biāo)志位(也就是發(fā)送完了停止位)。這么看來:TXE允許程序有更充裕的時間填寫TDR寄存器,保證發(fā)送的數(shù)據(jù)流不間斷。TC可以讓程序知道發(fā)送結(jié)束的確切時間,有利于程序控制外部數(shù)據(jù)流的時序。61、窗口看門狗顧名思義有一個窗口,這個窗口的橫坐標(biāo)為時間,意思是在指定的時間范圍內(nèi)刷新寄存器,否則單片機復(fù)位。窗口的上限由人來設(shè)定W[6:0],下線定死為0x40Twwdg=(4096×2^WDGTB×(T[5:0] 1)) /Fpclk1;Twwdg為超時時間ms,F(xiàn)pclk1為APB1時鐘KHz,62、TIMx通用定時器有4個獨立通道,分別可以用來作為:輸入捕獲、比較輸出、PWM生成、單脈沖模式輸出。63、定時器的時鐘來源有4個:內(nèi)部時鐘(CK_INT),外部時鐘模式1(TIx),外部時鐘模式2(ETR),內(nèi)部觸發(fā)模式(ITRx,這個用來定時器的同步)64、定時器中斷溢出更新時間:Tout=((arr 1)*(psc 1))/Tclk,ARR為自動裝載寄存器(1~65535)、PSC為分頻系數(shù),TCLK為輸入時鐘頻率(Mhz)65、PWM1和PWM2模式的區(qū)別僅在于相位的180度。前者高電平時,后者低電平。OCxREF極性就可以實現(xiàn)這個功能。66、定時器輸入捕捉有一個濾波器,顧名思義濾波器起到的就是濾波的作用,在捕捉外部信號時,信號可能不穩(wěn)定,此時需要濾波:當(dāng)檢測到有外部輸入時,需要再連續(xù)采樣N次如果確定為高電平/低電平,則觸發(fā)響應(yīng)中斷(如果開啟了的話)。67、電容觸摸屏原理:通過充放電的曲線不同來檢測是否被按下。實際的實驗過程中,TPAD可以用一塊覆銅區(qū)域來替代,通過電容的充放電常數(shù)來確定是否按下。
68、OLED,即有機發(fā)光二極管(OrganicLight-Emitting Diode),又稱為有機電激光顯示(Organic Electroluminesence Display,OELD)。下圖為OLED的GRAM與屏幕的對應(yīng)表;
PAGE2單獨列出來:
69、USART可以操縱SPI設(shè)備。不過最大頻率只有4.5MHz;70、使用I/O口時應(yīng)該注意的問題;
71、ADC的Vref 和Vdda與VSS,Vref-一定要加高質(zhì)量的濾波電容,且盡量靠近芯片的管腳;
72、ADC分為規(guī)則組和注入組,前者有16個通道,后者有4個通道。并且16個通道公用一個數(shù)值寄存器,注入組的4個通道分別有一個數(shù)值寄存器。
73、采樣頻率越高,輸入阻抗要求越??;74、Stm32進入中斷的最短周期為6個周期;75、降低功耗的基本原則:
降低系統(tǒng)時鐘;
關(guān)閉APB和AHB總線上未使用外設(shè)的時鐘;76、配置相應(yīng)的寄存器為TIMx選擇所需的時鐘源;
77、FSMC,即靈活的靜態(tài)存儲控制器。能夠與同步或異步存儲器和16位PC存儲器卡接口,STM32的FSMC接口支持包括SRAM、NANDFLASH、NORFLASH和PSRAM等存儲器;78、平時所說的U盤里的FLASH存儲器有兩種類型:NANDflash和NOR flash。
79、TFT在操作時,可以當(dāng)作外部SRAM來操作,這樣的話,如果單片機有FSMC接口,就可以使用NORFLASH的SRAM接口去控制,速度非???。80、Stm32的的FSMC有4個256MB的存儲塊,一共尋址1GB的外部存儲器空間;
81、在STM32內(nèi)部,F(xiàn)SMC的一端通過內(nèi)部高速總線AHB連接到內(nèi)核Cortex-M3,另一端則是面向擴展存儲器的外部總線。內(nèi)核對外部存儲器的訪問信號發(fā)送到AHB總線后,經(jīng)過FSMC轉(zhuǎn)換為符合外部存儲器通信規(guī)約的信號,送到外部存儲器的相應(yīng)引腳,實現(xiàn)內(nèi)核與外部存儲器之間的數(shù)據(jù)交互。82、FSMC中的DATASET和ADDSET的設(shè)置需要參看外部存儲器的時序圖來確定。一般而言,DATASET指的是數(shù)據(jù)建立時間,也就是讀/寫信號開始到讀/寫信號停止(上升沿存儲數(shù)據(jù))的持續(xù)時間。(一般來說寫比讀快!)。而ADDSET指的是地址建立時間,指的是片選之后到讀/寫操作之前的時間,這是針對SRAM來說的,如果操縱的是TFT,不存在地址線,所以此時的ADDSET就是讀/寫信號結(jié)束到RS電平的轉(zhuǎn)換時間。
83、各種異步模式的聯(lián)系;
84、NOR Flash/PSRAM控制器時序小結(jié);
85、FSMC的三個配置寄存器:FSMC_BCRx(片選控制配置)、FSMC_BTRx(片選時序)、FSMC_BWTRx(片選寫時序)。86、 RTC時鐘配置必須要用到BKP寄存器,BKP寄存器在單片機復(fù)位、電源復(fù)位、待機喚醒模式下是不會更改值的,他的供電由VDD供電,VDD被切斷后自動切換至外部的VBAT供電。87、 要修改BKP寄存器的值,必須取消其寫保護的標(biāo)志。BKP寄存器在上電時自動寫保護;88、STM32有3種省點模式;
三種省電模式中,耗電量從上到下依次降低,待機模式的電流僅為2uA。89、 從待機模式中喚醒單片機等效于讓單片機復(fù)位,但是電源寄存器的值會有一個標(biāo)志位指示單片機是被喚醒的,不是被復(fù)位的。90、 ADC的時鐘不要超過14MHz,否則轉(zhuǎn)換精度會下降。最大轉(zhuǎn)換速率為1MHz,即轉(zhuǎn)換周期為1us(14MHz,采樣周期為1.5個ADC時鐘)91、 Tcovn=采樣時間 12.5個周期。采樣時間盡量選長一點,這樣精度高一些,但是轉(zhuǎn)換速率下降,這也是有利必有弊。92、ARM處理器架構(gòu)進化史;
93、 拿ARM7TDMI來說,T代表Thumb指令集,D是說支持JTAG調(diào)試(Debugging),M意指快速乘法器,I則對應(yīng)一個嵌入式ICE模塊。94、 MMU作為嵌入式處理器與應(yīng)用處理器的分水嶺標(biāo)志à具有內(nèi)存管理單元的嵌入式處理器可以定位為應(yīng)用處理器。這么說M系列和A系列的處理器的區(qū)別在于A系列的處理器具有MMU單元可以進行內(nèi)存模塊的管理。95、ARM處理器有兩種狀態(tài):ARM狀態(tài)和Thumb狀態(tài)。
96、 這張圖說明了:Thumb2指令集做了一件很偉大的事情:將16位和32位的指令集融為一體,兼容性非常強?。ㄟ@么說CM3不支持某些32位ARM指令集??)97、寄存器
98、MSP是系統(tǒng)復(fù)位后使用的堆棧指針,PSP由用戶的代碼使用。兩個堆棧指針為4字節(jié)對齊!!99、在ARM編程領(lǐng)域中,凡是打斷程序運行的事件,統(tǒng)稱為異常(exception)。100、 因為存在LR(鏈接寄存器),所以可支持1級的子程序調(diào)用而不用壓棧到內(nèi)存,大大提高了運行速度?!み@就是說,我們在編程的時候,一級調(diào)用是不會耗費太多時間的,除非是二級調(diào)用!101、 處理器有兩種操作模式:handler模式和線程模式。
處理器也有兩種特權(quán)分級:特權(quán)級和用戶級。這張圖說明了一切:復(fù)位進入特權(quán)級線程模式,如果有異常,進入特權(quán)級的handler模式處理異常或中斷例程,然后返回至特權(quán)級線程模式。通過修改CONTROL寄存器可以進入用戶級線程模式。102、 兩個高級定時器TIM1和TIM8是掛接在APB1總線上103、 STM32的外部中斷是以組來區(qū)分的,也就是說PA0,PB0,PC0單片機是無法區(qū)分其中哪個觸發(fā)的中斷à均為EXIT0線中斷服務(wù)例程。所以,外部中斷支持16路的中斷分辨率。從另一個方面來講,我們可以設(shè)置GPIO_EXTILineConfig(GPIO_PortSourceGPIOx, GPIO_PinSourcex);來開通中斷線實現(xiàn)組內(nèi)的不同中斷。104、 DAC有兩個寄存器,一個是DHR(Data HoldingRegister)數(shù)據(jù)保持寄存器,一個DOR(Data Output Register)數(shù)據(jù)輸出寄存器。真正起作用的是DOR寄存器,該寄存器把值給數(shù)模轉(zhuǎn)換發(fā)生單元輸出以VREF 為參考電壓的電壓值。如果是硬件觸發(fā)轉(zhuǎn)換,系統(tǒng)將在1個ABP時鐘周期后把值給DOR,如果是軟件觸發(fā)轉(zhuǎn)換,時間為3個APB時鐘周期。然后,均等待Tsetting時間(Typical為3us,Max為4us)后真正輸出電壓值。105、 DAC分8位模式和12位模式,其中后者可以選擇左右對齊106、 DMA仲裁器分為軟件和硬件兩種。軟件部分分為4個等級,分別是很高優(yōu)先級、高優(yōu)先級、中等、低。硬件部分由通道的大小來決定優(yōu)先級,越低優(yōu)先級越高。107、 DMA有一個實時的傳輸數(shù)據(jù)量寄存器叫做DMA_CNDTR,最大值為65535,存放的是當(dāng)前傳輸所要傳輸?shù)臄?shù)據(jù)量。當(dāng)數(shù)據(jù)量變?yōu)?時,表明傳輸完成。108、 CAN總線(ControllerArea Network)。CAN控制器根據(jù)兩根線上的電位差來判斷總線電平,總線電平又分為顯性電平和隱性電平,二者必居其一。
109、 CAN總線具有6個特點:1:多主控制(掛接在總線上的所有設(shè)備均可以成為主設(shè)備,并且設(shè)備ID是用來決定設(shè)備的優(yōu)先級,沒有設(shè)備地址概念),2:系統(tǒng)若軟性(沒有設(shè)備地址概念),3、通訊速度較快,通訊距離較遠(yuǎn)(1Mbps下40M,5kbps下10KM),4、具有錯誤檢測、錯誤通知(通知其他設(shè)備)和錯誤恢復(fù)功能(強制結(jié)束發(fā)送,重復(fù)發(fā)送接收錯誤的信息。),5、故障封閉,當(dāng)總線上的設(shè)備發(fā)生連續(xù)故障錯誤時,CAN控制器會把改控制器踢出總線。6、連接節(jié)點多。理論上可以無限制加載,但是受到時間延遲和電氣負(fù)載的限制,實際數(shù)目是有限制的。降低傳輸速度可以適當(dāng)增加可掛接負(fù)載個數(shù)。110、 CAN協(xié)議有兩個標(biāo)準(zhǔn),ISO11898(針對125kbps~1Mbps的高速速率)和ISO11519-2(125kbps以下的低速速率)
111、CAN總線電平特性;
112、 CAN協(xié)議的有5種類型的幀:數(shù)據(jù)幀、遙控幀、錯誤幀、過載幀、幀間隔。其中前兩種幀有標(biāo)準(zhǔn)格式(11位ID)和擴展格式(29位ID)。
113、CAN 數(shù)據(jù)幀構(gòu)成:
(1) 幀起始。表示數(shù)據(jù)開的段幀起始。
(2) 仲裁段。表示該幀優(yōu)先級的仲裁段。
(3) 控制段。表示數(shù)據(jù)的字節(jié)及保留位段。
(4) 數(shù)據(jù)段。數(shù)據(jù)的內(nèi)容,一幀可發(fā)送0~8個字節(jié)的數(shù)據(jù)。
(5) CRC段。檢查幀的傳輸錯誤段。
(6) ACK段。表示確認(rèn)正常接收的段。
(7) 幀結(jié)束。表示數(shù)據(jù)的段幀結(jié)束。
114、 Stm32f103系列只有一個CAN控制器,有3個發(fā)送郵箱和3級深度的2個FIFO,14個過濾組器。115、 STM32的每個過濾組可以配置為1個32位過濾器和2個16位過濾器。除此之外,還可以配置為屏蔽位模式(ID 屏蔽)和標(biāo)識符列表(ID和屏蔽寄存器均用來做ID寄存器)模式。116、 CAN接收到有效報文被放置在3級郵箱深度的FIFO中,F(xiàn)IFO完全由硬件來管理。117、 CAN總線的波特率
118、 觸摸屏一般分為電阻式觸摸屏和電容式觸摸屏。前者檢測觸摸的位置原理是利用觸摸屏控制器中的A/D轉(zhuǎn)換器經(jīng)過兩次A/D讀值后得出X和Y的坐標(biāo)值。注意:這個X和Y的值是相對于觸摸屏的,而非LCD屏。所以在這里需要注意兩個概念:觸摸屏和LCD屏。這是兩個不同的概念,也是兩個不同的物理結(jié)構(gòu),其中電阻觸摸屏是由上下兩個導(dǎo)電層中間夾著一層非常薄的透明隔層;而LCD就是指顯示屏。119、 電阻觸摸屏有X和Y、X和Y的比例因子、坐標(biāo)軸方向、偏移量。LCD也有自己的這些參數(shù)。兩者完全不相干,所以在定位的時候需要進行坐標(biāo)轉(zhuǎn)換。公式:
通過對屏幕的四個點進行校準(zhǔn),得到四元一次方程,求解即可。120、 NEC協(xié)議的數(shù)據(jù)幀格式:同步碼頭、地址碼、地址反碼、控制碼、控制反碼。同步碼由一個9ms的低電平和一個4.5ms的高電平組成,地址碼、地址反碼、控制碼、控制反碼均是8位數(shù)據(jù)格式。按照低位在前,高位在后的順序發(fā)送。121、 NEC協(xié)議在發(fā)送的時候,會有560us的38KHz的載波信號,而在接收的時候這部分載波信號被認(rèn)定為低電平,而剩余的(2.25ms-650us)的邏輯“1”和(1.12ms-650us)的邏輯“0”時間則被認(rèn)定為高電平。122、 在單位時間內(nèi)的位移被定義為速度,速度有線速度和角速度之分,分別對應(yīng)兩種傳感器測量這兩種不同的速度:線速度傳感器(加速度計)、角速度傳感器(陀螺儀)。前者多應(yīng)用在靜態(tài)或者低慢速運動中的姿態(tài)求解,后者多應(yīng)用在動態(tài)運動中姿態(tài)求解。123、 根據(jù)標(biāo)準(zhǔn)約定,零加速度(或零 G 準(zhǔn)位)通常定義為相當(dāng)于最大輸出值(12 位輸出為 4096,10 位輸出為 1024 等)一半的輸出。對于提供 12 位輸出的加速度計,零 G 準(zhǔn)位將等于 2048。輸出大于 2048 表示正加速度。輸出小于 2048 表示負(fù)加速度。加速度的數(shù)量通常用單位 g (1g = 9.8m/s2 = 重力加速度)表示。通過確定測量的輸出與零 G 準(zhǔn)位之間的差值,然后除以加速度計的靈敏度(用計數(shù)/g 或 LSB/g表示)來計算加速度。對于提供 12 位數(shù)字輸出的 2g 加速度計,靈敏度為 819 計數(shù)/g 或 819 LSB/g。加速度等于:a = (Aout - 2048)/(819 計數(shù)/g),單位為 g。124、 加速度計測得的加速度的方向和設(shè)備設(shè)定的坐標(biāo)系是相反的,因為原理表明在測量力的時候采用的是非慣性系參考系,而我們高中時代研究的坐標(biāo)系是慣性系參考系,前者在物體進行運動產(chǎn)生加速度時,假想一個與速度方向相反的力作用在物體上,這個力就是慣性力;后者我們說不存在慣性力,只說存在慣性,因為在慣性坐標(biāo)系中,我們研究的是物體,而非坐標(biāo)系(即假定坐標(biāo)系相對地球靜止),當(dāng)我們把坐標(biāo)系也考慮在內(nèi)時,當(dāng)坐標(biāo)系運動,就產(chǎn)生了慣性力f,這種力作用會假想作用在物體上,只是與運動方向相反。125、 由上可知,加速度計的本質(zhì)是測量力而非加速度。126、 NRF24L01工作在2.4GHz的頻段,由于頻段頻率較高,所以傳輸速率較快,為2Mbps127、 STM32的閃存模塊由:主存儲器、信息塊和閃存存儲器接口寄存器3個部分構(gòu)成。主存儲器用來存放代碼和const常量;信息塊由兩個部分組成:啟動程序代碼、用戶選擇字節(jié)。其中啟動程序代碼為ST公司自帶的啟動程序,用于串口下載。最后的閃存存儲器接口寄存器用于控制整個對閃存區(qū)域的操作。128、 CPU的運行速度比FLASH的操作速度快的多,一般FLASH的最快訪問速度≤24Mhz。如果CPU的速度超過這個頻率,那么在讀取FLASH的時候必須加入等待時間(FLASH_ACR設(shè)置)129、 FLASH編程時,寫入必須為半字(16位)。并且在寫入的時候必須保證所寫區(qū)域的數(shù)據(jù)必須為0xFFFF。130、 STM32的FSMC有HADDR[27:0],其中[27:26]用來選擇BANK區(qū)域的4個不同塊。剩下的[25:0]則用來連接外部存儲區(qū)域的地址線FSMC_A[25:0]。如果數(shù)據(jù)寬度是8bit,此時的HADDR[25:0]和FSMC_A[25:0]是完全對應(yīng)的。如果數(shù)據(jù)寬度是16bit,此時的HADDR[25:1]和FSMC_A[24:0]是對應(yīng)起來的。需要注意:無論數(shù)據(jù)寬度是多少,外部的FSMC_A[0]和A[0]總是對應(yīng)的。131、 關(guān)于LB和UB的信號控制是由硬件自動控制的,當(dāng)AHB的數(shù)據(jù)寬度小于外部存儲器的數(shù)據(jù)寬度時,此時LB和UB的控制信號自動產(chǎn)生(比如字節(jié)讀取/寫入16bit的外部存儲器)132、 attribute (函數(shù)屬性、變量屬性、類型屬性等)。如果在使用SRAM時,可以采用u32 sram_array[xx] attribute ((at(0x68000000))代表將外部SRAM的空間全部給了sram_array這個變量,他具有在at0x68000000這個地址的屬性。往里面寫值就直接在SRAM里面寫值。133、內(nèi)存管理;
內(nèi)存管理有一種方式叫做分塊式內(nèi)存管理。
注意表中的分配方向,從頂?shù)降?。每一項對?yīng)一個內(nèi)存塊。里面的數(shù)值代表了內(nèi)存池的狀態(tài):如果為0,表示該內(nèi)存沒有被分配;如果非0,那么數(shù)值的大小就表示了該塊內(nèi)存被連續(xù)占用的內(nèi)存數(shù)。比如說數(shù)值為20,意思是包括該項在內(nèi)的內(nèi)存塊被連續(xù)占用了20塊分給了指針。134、SD卡的分類:
一般的SD卡支持兩種傳輸模式:SD卡模式(SDIO)、SPI模式。顯然前面一種是專用模式,所以速度比較快。135、 常用的漢字內(nèi)碼系統(tǒng)有GB2313、GB13000、GBK、BIG5(繁體)。其中GB2313只有幾千個漢字,而GBK則有2萬多漢字。136、 要顯示漢字,采用的方式如果用點陣的形式是不可取的,因為這無法查找漢字。采用的方式就是內(nèi)碼系統(tǒng)。GBK標(biāo)準(zhǔn)中,一個漢字對應(yīng)2個字節(jié):前者稱為區(qū)(0x810xFE)后者為(0x400x7E)和(0x80~0xFE)。前者有126個區(qū),后者有190,那么可以顯示的漢字?jǐn)?shù)量有126190=23940個。根據(jù)這兩個值用來查找字庫,字庫中存放的還是每個漢字的點陣數(shù)據(jù)。這個字庫非常大,如果是1616的字體,那么一個字體就需要32個字節(jié),如此說來需要23940*32=748K的空間,可見非常大,所以需要外部的Flash來存儲這個字庫。137、 由于漢字內(nèi)碼系統(tǒng)不具有國際通用性,但是Unicode幾乎把所有的語言都放置進來,這樣在單片機中操作漢字時,就需要將GBK和Unicode轉(zhuǎn)化。尤其是在FATFS中,創(chuàng)建中文文件名和讀取中文文件信息時需要將Unicode換轉(zhuǎn)為GBK后再進行修改操作,再反轉(zhuǎn)換成Unicode保存修改。這么說,兩者的存在是由于標(biāo)準(zhǔn)的不統(tǒng)一,并且Unicode中只有6064個漢字,而GBK顯然是一種漢字?jǐn)U展。138、 BMP圖片編碼的順序是從左到右,從下到上。139、 VS1053是一款高性能的數(shù)字音頻解碼芯片,從SD卡中將mp3等音樂音頻文件通過SPI送給VS1053后,由其進行音頻解碼,輸出音樂給耳機。耳機驅(qū)動可以采用TDA1308芯片,這款芯片為AB類耳機驅(qū)動芯片。
140、 IAP(In Application Programming)在應(yīng)用編程是為了后期開發(fā)更新程序方便而提出的概念;
在普通編程中,flash中的code是通過JTAG和ISP等工具下載到單片機中。而在IAP編程中,flash被分區(qū)為A和B兩個區(qū)域,A區(qū)域只允許用USB/USART等方式下載,此區(qū)域作為更新B區(qū)域的代碼用。B區(qū)域則是用戶的code區(qū)域,真正的代碼在這里被執(zhí)行,放置的就是app。141、STM32正常運行流程圖;
上圖表示STM32正常運行的流程圖,可以看到上電復(fù)位后系統(tǒng)從0x80000004處開始運行程序,這里放置的是復(fù)位中斷向量,然后跳轉(zhuǎn)至復(fù)位中斷程序入口后再跳轉(zhuǎn)至main函數(shù)運行用戶的程序。142、加入IAP之后程序運行流程圖;
上圖表示加入IAP后的STM32程序運行流程圖??梢钥吹缴想姀?fù)位后跳到IAP程序的main函數(shù)處運行IAP過程(這個過程就是把下面灰底色塊的程序代碼燒進B區(qū)域à代碼更新)。后面的過程和STM32正常運行一樣,如果出現(xiàn)中斷請求,還是跳轉(zhuǎn)到A區(qū)域中的中斷向量表中,然后再跳轉(zhuǎn)到B區(qū)域的中斷服務(wù)入口。143、 USB有四根線,VCC、GND、D 、D-。在USB主機上,D 和D-均通過一個15K的電阻接地,這樣兩條線均為低電平。在USB設(shè)備中,對于高速設(shè)備會在D 通過一個1.5K的電阻接到VCC,而低俗設(shè)備會在D-通過一個1.5K的電阻接到VCC。這樣主機就可以通過D 和D-的高電平的到來來檢測是否有設(shè)備接入,并且識別高低速設(shè)備。144、 UCOSII是一種實時操作系統(tǒng),具有執(zhí)行效率高、占有空間?。ㄗ钚?nèi)核2KB)、實施性能優(yōu)良、擴展性強和移植性強等優(yōu)點。
UCOS具有多任務(wù)并發(fā)工作的特點(注意,任何時候只有一個任務(wù)能夠占用CPU。并發(fā)只是任務(wù)輪流占用CPU而不是同時工作)。最大支持255個任務(wù)并發(fā)工作。145、看門狗使用的總結(jié):
(1)調(diào)試程序階段,一般不加看門狗,容易排查問題。
(2)正式發(fā)布的程序必須加看門狗。
(3)排查問題時候,如果有看門狗,可以把看門狗屏蔽再排查。146、STM32的FLASH讀寫操作,一般至少2個字節(jié),注意有時候你只想保存一個字節(jié)的標(biāo)志位,數(shù)據(jù)長度也不能寫1,至少寫2個字節(jié)。例如 HAL庫的STMFLASH_ReadHalfWord,標(biāo)準(zhǔn)庫常用的readEEPROM
//讀取指定地址的半字?jǐn)?shù)據(jù)。
u16 STMFLASH_ReadHalfWord(u32 faddr)
{
return *(vu16*)faddr;
}
void STMFLASH_Read(u32 ReadAddr, u16 *pBuffer, u16 NumToRead)
{
u16 i;
for(i = 0; i < NumToRead; i )
{
pBuffer[i] = STMFLASH_ReadHalfWord(ReadAddr); //讀取2個字節(jié).
ReadAddr = 2; //偏移2個字節(jié).
}
}