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