STM32學(xué)習(xí)經(jīng)驗總結(jié)
1. 今天把普中開發(fā)板上的RS232芯片燒壞了,所以接下來要完成stlink的使用,來下載程序,同時也嘗試調(diào)試程序,也算是被逼的去學(xué)一個很有用的工具,本來我都不想學(xué)stlink的。
2. 先學(xué)習(xí)一下STM32的定時器,過程中,加入stlink的下載和調(diào)試。
3. 定時器:STM32分高級定時器(TIM1和TIM8),通用定時器(TIM2-5),基本定時器(TIM6,7)。
4. 通用定時器(TIM2-5):1)位于低速APB1總線上。2)預(yù)分頻:將計數(shù)器時鐘頻率降低。3)各個通用定時器之間是完全獨立的。4)向上計數(shù):從0到加載值,其他類似。5)定時器的時鐘來源,可以來源于內(nèi)部的APB1時鐘倍頻提供,這是時鐘來源之一,但是用的比較多,也比較簡單。
5. 通用定時器工作過程,只要有印象就可以,在配置的時候知道在配置什么。
6. 這是時鐘的計算方法,其中APB1的時鐘來源于AHB,如果APB1 = AHB,也就是APB1 = 1 * AHB,那么,此時的CK_INT = APB1,而如果APB1 = AHB / 2,那么這時候CK_INT = 2 * APB1的時鐘,得到定時器的原始時鐘。
7. 溢出時間 Tout = (ARR + 1)*(PSC+1) / TCLK,就是Tclk /(PSC+1)的倒數(shù),得到原始時鐘被分頻后的頻率,倒數(shù)就是時鐘周期,那么再乘以重裝值,就得到了溢出時間。一般時鐘TCLK為72MHz。
8. 現(xiàn)在為戰(zhàn)艦開發(fā)板,LED0->PB5紅色 LED1->PE5藍色
9. 注意:在要使用相應(yīng)的庫函數(shù)的時候,需要添加庫函數(shù)的.c文件到FWLIB中,但是在使用template工程模板的時候不用考慮,已經(jīng)全部加載進去了,我們只要寫自己的功能函數(shù)就可以。
10. 定時器初始化步驟:1)使能定時器時鐘APB1。2)初始化定時器,配置ARR,PSC,以及計數(shù)方式。3)使能定時器中斷,配置NVIC,不要忘了在主函數(shù)中加入設(shè)置中斷優(yōu)先級分組的一句!4)使能定時器自身。5)編寫中斷服務(wù)函數(shù)。具體參數(shù)配置見功能函數(shù)中注釋。
11. 注:電平的翻轉(zhuǎn),好像可以使用~ 或者 !實現(xiàn)。
————————————
1. 在學(xué)習(xí)定時器PWM波之前,先學(xué)一下stlink如何調(diào)試程序的。
2. stlink調(diào)試:1)首先關(guān)于引腳,PA13-15 以及 PB3 PB4都被默認(rèn)為JTAG的引腳,所以工程中盡量不要使用這些引腳。2)在debug窗口查看變量的變化,可以選中程序中的變量,右擊,然后add towatch1,就可以了。
3. 注:仿真分軟件仿真和硬件仿真,那么軟件仿真時,會有串口數(shù)據(jù)輸出,但是硬件仿真的時候必須使用串口調(diào)試軟件才能看到串口打印的數(shù)據(jù),同理,邏輯分析也是這樣的,可以使用邏輯分析儀采集板子引腳,做邏輯分析,那么keil上的debug的用處是觀察變量,以及寄存器的變化,并且可以通過單步調(diào)試查看硬件執(zhí)行情況。好像并不是很有用。但是keil的load的確方便,直接就可以下到板子里,不用我另外使用軟件下載。
4. 定時器PWM:ARR值確定頻率,CCRx確定占空比信號,可以理解為一個臨界值。
6. 關(guān)于通道重映射問題:通道的重映射根據(jù)上圖,可以看到,定時器三的通道二的部分重映射正好可以映射到PB5,led燈輸出端,便于顯示。注:一旦設(shè)置TIM3為部分重映射,那么四個通道都重映射了,也就是現(xiàn)在CH1->PB4了,沒有專門單獨設(shè)置CH2的映射。
7. 關(guān)于PWM的工作過程設(shè)置問題:
8. 關(guān)于PWM工作模式問題:CCMR1控制的是PWM模式1還是2。模式1的話,當(dāng)CNT < CCR時,輸出有效電平(有效電平到底是低電平還是高電平時根據(jù)CCER確定的),其余為無效電平;那么PWM模式2就和模式1相反。
9. 第7點,其中的CC1P為高極性,那么就是高電平有效。
10. //設(shè)置占空比,占空比=(CCRx/ARR)*100%或(TIM_Pulse/TIM_Period)*100%
TimOCInitStructure.TIM_Pulse= 400-1; 這里我理解的是,這個值就是被放入捕獲比較寄存器中,即CCRx中,用于輸出固定的占空比的PWM波。
————————————
1. 關(guān)于6050陀螺儀模塊問題
2. 今天開始著手平衡小車項目,藍牙模塊不用關(guān)心,只要知道可以連接,再判斷串口發(fā)來的指令即可。
3. 好像比較簡單的是使用DMP,通過結(jié)合DMP,可以將我們的原始數(shù)據(jù)轉(zhuǎn)換成四元素輸出,再通過四元素算出歐拉角,從而得到y(tǒng)awroll 和 pitch。
4. 因為做的是平衡小車,那么就不需要roll 和 yaw,直接通過pitch即可。
2016/4/1
1. 昨天卡在一個比較愚蠢的問題上,就是我很少自己配置工程什么的,所以當(dāng)測試賣家發(fā)來的例程的時候,編譯不通過,最后發(fā)現(xiàn)是要在keil4下打開才可以用,期中涉及的問題我也不想深究,畢竟配置工程什么的不是我學(xué)習(xí)的重點。
2. 今天總結(jié)了一條經(jīng)驗:解決問題,一定要善于使用最簡單的方法!不做無用功,也不能浪費寶貴的時間!比如我發(fā)現(xiàn)他們的例程下進去,小車根本就不能動,排查問題,肯定是資料問題,我問了賣家以后,他們發(fā)了新的資料,成了!工程編譯錯誤,網(wǎng)上百度一下,好像keil4下可以正常使用,那就裝一個keil4,成了!這就是最簡單的解決問題方法,不要自己死磕,不能轉(zhuǎn)牛角尖。
3. MPU6050:首先我要做的就是能夠使用例程,將MPU獲取的數(shù)據(jù)打印出來,這樣便于調(diào)試,也便于我接下來的學(xué)習(xí);然后深入理解6050的工作方式和通信方式(IIC通信);再學(xué)習(xí)6050在DMP方法下,輸出的數(shù)據(jù)怎么可以整定成小車的姿態(tài),那么平衡小車中比較關(guān)鍵的內(nèi)容就結(jié)束了!
因為還是寫成項目日志比較清楚,所以準(zhǔn)備寫項目日志,暫停寫直至平衡小車項目結(jié)束,重新開始學(xué)戰(zhàn)艦開發(fā)板的其他模塊。
————————————
TFTLCD
1. 今天是平衡小車結(jié)束后,開始繼續(xù)學(xué)習(xí)STM32的第一天,上次老師提出來要在mini2440上做攝像頭循跡小車,又是小車!天吶~反正我已經(jīng)快受不了了,而且arm的裸機開發(fā)和STM很相似,根本就沒什么大的差別,而且arm是mini板,外設(shè)很少,學(xué)習(xí)模塊的機會很少,所以我覺得,以后再STM32上做裸機開發(fā),也可以嘗試移植uC/OS系統(tǒng),這樣配套的學(xué)習(xí),肯定比arm上裸機開發(fā)要好!
2. 我現(xiàn)在用的是戰(zhàn)艦的3.5寸屏幕,IC為NT35310,電阻屏,16位并口驅(qū)動,分辨率為320*480,挺高的分辨率了已經(jīng)算是。
3. 我現(xiàn)在想采用的是16位模式下,RGB565存儲數(shù)據(jù),這個型號的驅(qū)動芯片是NT35310(ID5310)。通過一些命令,我們可以設(shè)置GRAM(LCD的顯存)的指針的增長方向,也就是一個個像素點的填寫方向,所以只要設(shè)置一次開始寫的位置,就可以把數(shù)據(jù)連續(xù)的填寫,在SC++(X坐標(biāo)起始位置)碰到EC(X坐標(biāo)終止位置),這時候EC會返回SC,但同時SP++,從下一行開始填寫像素點(在設(shè)置了指針增長方式為從左向右,從上往下模式時),而不需要關(guān)心位置,極大的方便了我們編程,速度也比每次都指定坐標(biāo)的LCD屏要快。
4. 填寫像素時,步驟為:設(shè)置起始位置---發(fā)送寫GRAM命令---寫入GRAM。
5. FSMC:靈活的靜態(tài)存儲控制器。這是STM32板子上帶有的對SRAM、NAND Flash、NOR Flash等進行操作的控制器,那么現(xiàn)在對LCD的操作就相當(dāng)于FSMC對一個SRAM在進行操作。
6. 直接切入LCD使用吧,反正原理大差不差的理解了,然后就觀察他們是如何使用的就可以。
2016/4/20 IIC總線 由飛利浦公司提出
1. 因為IIC總線是一種非常常見而且普及的總線協(xié)議,用來對各種模塊的寄存器讀寫從而進行配置,類似的還有SPI總線協(xié)議,雖然單片機里學(xué)過了,但是也差不多忘了,所以今天再溫習(xí)一下。
2. 今天測試的也是例程上的,使用IIC對24C02進行讀寫操作,通過LCD屏幕顯示。
3. IIC:有起始信號,停止信號,應(yīng)答信號。
4. 硬件上已經(jīng)將PB6接到了IIC_SCL上,將PB7接到了IIC_SDA上,這是因為這兩個端口可以端口復(fù)用成IIC總線的兩根線,模式時推挽輸出。
5. GPIO:關(guān)于靈活控制某個端口為輸入輸出模式:
SDA也就是PB7作為輸出的時候,使用50MHz的輸出速度,做普通輸出(CNF1 CNF0 MODE1 MODE0 =0011);當(dāng)SDA作為輸入時,使用復(fù)用功能,MODE保留(CNF1 CNF0 MODE1 MODE0 = 1000)
6. IIC使用流程,我個人總結(jié)是這樣的:1)配置IIC服用端口;2)檢測IIC器件是否存在;3)由IIC發(fā)出起始信號,同時發(fā)送器件地址,接著就等待應(yīng)答信號的產(chǎn)生;4)等待到了應(yīng)答信號就可以發(fā)送數(shù)據(jù)出去,同樣也需要進行應(yīng)答信號的檢測;5)那么讀取其實也是類似的,具體的時序方面,其實就是根據(jù)手冊上的時序圖模擬一遍,注意位操作的正確性就可以了。
7. SPI協(xié)議:接著溫習(xí)SPI協(xié)議,這個協(xié)議其實在我用單片機接NRF24L01射頻通信模塊的時候已經(jīng)有了比較深刻的理解了,為什么說深刻,因為那時候還不想現(xiàn)在這么浮躁,會耐下性子,一步一步的從通信協(xié)議,配置寄存器開始做起,最后花了五六天才基本搞通互發(fā),第一個煎熬的模塊。
8. SPI是摩托羅拉公司提出的總線協(xié)議,這是一種同步,高速,全雙工的串行通信協(xié)議。
9. 關(guān)于兩個設(shè)置值,用來決定時鐘的空閑信號和采樣時機的CPOL和CPHA。
10. CPOL=0,串行時鐘的空閑狀態(tài)為低電平,反之為高電平;CPHA=0,則在第一個時鐘跳變時做采樣,CPHA=1,則在第二個時鐘跳變時做采樣。
11. 如何記憶MISO和MOSI,可以拆開理解為Master In Slave Out和 Master Out Slave In。
12. 根據(jù)我之前的理解,通俗的講,SPI協(xié)議就是,小時候玩兒的你拍一我拍一,這種節(jié)奏就是時鐘,這種擊掌的過程就是數(shù)據(jù)線的傳輸,其實也還是不夠貼切。應(yīng)該是像兩個小朋友交換同樣個數(shù)的玩具,但是他們選擇一換一的節(jié)奏逐個交換,直至他們的玩具全部交換完成,那么一個小朋友就有了原來屬于另一個小朋友的玩具,那么這些玩具就是數(shù)據(jù),用來裝玩具的就是寄存器,用來以一定節(jié)奏交換就是時鐘。
13. 現(xiàn)在例程上使用的是PB12做W25Q128的CS片選,PB13做SCK,PB14做MISO,PB15做MOSI。
——————————————
485協(xié)議
1. 485協(xié)議:處于物理層,半雙工,多點通信,它類似于RS232,但是它更加穩(wěn)定可靠,傳輸距離比RS232要長,抗干擾性也不錯,所以這個協(xié)議還是有必要做一些了解的。
2. 戰(zhàn)艦上使用的是SP3485芯片,該芯片的原理圖清楚的說明,當(dāng)RE信號為低的時候,為接收模式,當(dāng)RE信號為高時,設(shè)為了發(fā)送模式。
3. 好吧,其實和串口的模式非常相似,只是兩者采用了不同的電壓作為高低電平,其余實在是沒多大差別。
————————————————————
1. CAN總線:也是一種串行通信協(xié)議,為現(xiàn)在歐洲汽車網(wǎng)絡(luò)的標(biāo)準(zhǔn)協(xié)議,可以實現(xiàn)在汽車的LAN中的高速、高質(zhì)量的數(shù)據(jù)傳輸,已經(jīng)經(jīng)過ISO國際標(biāo)準(zhǔn)化的串行通信協(xié)議。它通過兩根線上的電位差來判斷電平,總線電平分為顯性電平和隱性電平,二者必有其一。
2. CAN總線的特點:可以根據(jù)優(yōu)先級來決裁;不需要“地址”這個概念,加入模塊方便;通信速度較快,也比較遠,在現(xiàn)場控制中足夠了;還有錯誤檢測反饋等功能,使之成為公認(rèn)的最有前途的現(xiàn)場總線之一
3. CAN總線電平判斷:隱性電平是指CAN_L與CAN_H之間的電壓差為0V,而顯性電平為CAN_H與CAN_L之間的電壓差為2.5V左右。
4. CAN總線通過五個幀實現(xiàn):數(shù)據(jù)幀,遙控幀,錯誤幀,過載幀,幀間隔。
5. D:顯性電平,也就是0,這時壓差為2V左右;R:隱性電平,也就是1,這時的壓差為0V。那么優(yōu)先級仲裁就是通過顯性電平的多少判斷的,輸出的顯性電平多的優(yōu)先級高;一般先發(fā)起總線請求的優(yōu)先級要高于后來的,而且不能被打斷。
6. CAN控制器:有三個郵箱,用于發(fā)送!發(fā)送過程:空閑郵箱(存在空閑郵箱時)----掛號(等待郵箱成為最高優(yōu)先級)------預(yù)定(郵箱成為了最高優(yōu)先級)------發(fā)送(一旦總線空閑了,就可以進行發(fā)送)----空閑(發(fā)送完成以后,再次把總線變?yōu)榭臻e)。
7. CAN控制器:有三級FIFO用來緩存數(shù)據(jù)!接收過程:FIFO中有一個為空時,接收到有效數(shù)據(jù)----掛號一-----又一次收到有效數(shù)據(jù)-----掛號二------。。。。超過三次收到有效數(shù)據(jù)但是沒有被讀走的話,就會產(chǎn)生溢出,所以需要及時的讀取FIFO中的數(shù)據(jù)。
2016/4/24 攝像頭OV7670
1. OV7670是CMOS VGA圖像傳感器,通過類IIC的SCCB總線控制,VGA可高達30幀/秒。
2. VGA,即分辨率為640*480的輸出模式。QVGA,即分辨率為320*240的輸出模式,一般用這種,因為OV7670的FIFO也只夠存儲一幀的QVGA。
2016/6/11
時隔近兩個月,我又開始玩兒這個板子上的攝像頭了,因為參加比賽的需要,必須要把攝像頭原理和例程都消化,然后將攝像頭改為可以采集灰度圖像,并且可以靈活的設(shè)置圖像閥值。
1. 使用類似IIC的SCCB(串行攝像頭控制總線)控制總線,主要使用這個總線協(xié)議來對7670狀態(tài)配置。
——————————————————————————
上次又被考試打亂了,今天要搞一天。
1. 首先,OV7670正好可以存儲一幀的分辨率大小為320*240,即QVGA格式。
2. PCLK為像素時鐘,一般一個PCLK時鐘輸出一個像素,但要是一個像素為兩個字節(jié)大小,那么就需要兩個PCLK時鐘才能輸出一個完整的像素,例:RGB565。
3. VSYNC為幀同步信號,一幀出現(xiàn)一次。
4. HREF為行同步信號,這是根據(jù)分辨率中的多少行確定的,例如640*480的分辨率,那么一幀中就出現(xiàn)480次的這個行同步信號。
5. 圖像數(shù)據(jù)就是通過D[7-0]八根數(shù)據(jù)線輸出。
6. 根據(jù)時序圖可以看出,當(dāng)行同步信號為高電平有效的時候,數(shù)據(jù)的輸出才為有效,那么再根據(jù)PCLK的上升沿MCU采集,下降沿數(shù)據(jù)改變,就可以實現(xiàn)圖像數(shù)據(jù)的讀取。(兩個字節(jié)的話,高字節(jié)在前)
7. 7670工作流程:首先攝像頭采集圖像數(shù)據(jù),然后存儲到FIFO芯片AL224B(384K),一般我們只要存儲一幀就夠了,再通過接口,使用MCU從這個FIFO芯片中讀取攝像頭之前采集的數(shù)據(jù)。
8.這是針對FIFO操作的對外接口,也就是攝像頭下面引出來的引腳。
9.從第一個幀同步信號開始,說明開始采集到了一幀,那么這時候讓寫指針復(fù)位,也就是從0地址開始寫入,再把寫使能使能,這時候FIFO中就會開始接收7670輸入的圖像數(shù)據(jù),在等待到第二個幀同步信號以后,說明一幀圖像采集完畢,這時候把寫使能禁止,然后讓MCU去讀取FIFO中的數(shù)據(jù),也不會讓新的數(shù)據(jù)沖掉之前的數(shù)據(jù),保證讀取的正確。
11. 注:PB3 4 為JTAG中使用到的接口,如果要把這兩個引腳作為普通的IO口,那么必須禁止JTAG,才能使得這兩個引腳作為普通IO使用。
12. 采用中斷獲取幀同步信號,然后在OV7670往FIFO中寫數(shù)據(jù)的同時,MCU也開始從FIFO中讀取數(shù)據(jù),這樣可以加快數(shù)據(jù)的采集。
2016/6/16
1. "Y"表示明亮度(Luminance或Luma),也就是灰階值;而"U"和"V" 表示的則是色度(Chrominance或Chroma),作用是描述影像色彩及飽和度,用于指定像素的顏色。
2. 也就是說,我主要用到的就是Y分量。
3. 幾個重要的設(shè)置灰度圖像輸出的寄存器,需要進行了解。
寄存器地址 | 寄存器設(shè)置的值 7654 3210 | 解釋 |
0x12 | 0x10 (0001 0000B) | 通用控制寄存器,還是設(shè)置為QVGA格式輸出,輸出YUV編碼方式的圖像數(shù)據(jù) |
0x3a | 0x14 (0001 0100B) | 行緩沖測試選項,使用固定的UV輸出,這兩個值就是0x67和0x68兩個寄存器的值。行緩沖輸出順序,由這個寄存器的【3】(0)和0x3d的【0】(0)兩位決定,對照發(fā)現(xiàn)為使用YUYV輸出,也就是Y:U:V=4:2:2。 |
0x3d | 0x80 (1000 0000B) | 普通控制寄存器,伽馬使能,同時和0x3a相互配合。 |
0x67 | 0x11 (0001 0001B) | 填充U值的寄存器,值為0x11 |
0x68 | 0xff (1111 1111B) | 填充V值的寄存器,值為0xff |
0x40 | 0xc0 (1100 0000B) | 數(shù)據(jù)的輸出范圍為0x00-0xff。 |
4. 注:還是不是很理解輸出順序YUYV輸出,也就是Y:U:V=4:2:2。這個意思。
1. 設(shè)置完成以后,基本就可以實現(xiàn)灰度圖像的采集了,速度也挺快的。
2. 從網(wǎng)上了解了OV7670的特點以后,才明白之前的YUYV輸出順序的真正意義,其實不論Y還是U還是V都是八位二進制表示,也就是一個字節(jié)。那么YUYV輸出格式表明,我們在使用的時候,只要讀取第一個字節(jié)就可以獲取Y(亮度),這個亮度可以進一步的處理判斷,就可以通過閥值獲得二值圖像,也就是黑白圖像。
3.
4. 這是我衣服上的標(biāo)志,我還添加了手動設(shè)置閥值的按鍵操作,便于以后的調(diào)試,在不同的光線條件下可以進行調(diào)整。
編輯:admin 最后修改時間:2018-05-18