2017-06-01 51 views
1

我是嵌入式編程的新手,我需要你的幫助。瞭解爲STM32編寫的函數

+2

沒有什麼特定的架構或在這裏嵌入式編程。函數'setLED()'對參數執行一些相對簡單的算術運算並返回結果。如果你不知道他們在做什麼,請在參考資料或教程中查找涉及的操作符('<<'和'|')。如果你不明白(C的味道)'enum's,那麼閱讀關於C的教程或教科書。 –

+0

這裏似乎沒有真正的問題,它是否被刪除? – jcoder

回答

0

該功能簡單地返回一個int與線的二進制組合的值旋轉的5倍到左側,collumn旋轉2次的左側和命令(其已在枚舉定義的值)

所以,如果你這樣做:

測試= setLED(3,2,LED_TOGGLE)

測試將等於:((00000011 < < 5)|(00000010 < < 2)| 00000011)

這將給:

01100000 OR 
00001000 OR 
00000011 
-------- 
01101011 

邏輯的其餘部分是依賴基於代碼的少量代碼

+0

但爲什麼他們旋轉5次和2次?我試圖改變數字,但我的遊戲不能正常工作,LED只是閃爍。 –

+0

這取決於你的代碼的其餘部分,這個函數並沒有真正設置任何led,它只是返回輸入變量的組合,我試圖研究其餘的代碼,看看它是如何應用的 –

+0

@Alena Everdeen it不旋轉。它被轉移。這有很大的不同。爲什麼。在一塊數據中編碼位置和命令。但是這個功能無論如何不會起作用。要從0到15編碼,你需要4位。所以實際的代碼是:(line << 6)|(collumn << 2)| cmd,並且在此前2位包含cmd之後,接下來的四列和接下來的四行 –

0

的其餘部分的張貼在這裏:

定居()不是做任何事情來真正設置LED。它看起來像它是用來創建一個地址(行/列)和期望狀態組合的值。這可能會被寫入控制寄存器。

如果你想知道return (line<<5)|(collumn<<2)|cmd;,它可能有助於其分割,所以你可以逐步並看看會發生什麼:

結果編輯的 setLED(1, 1, LED_ON);

result = (line << 5);    // result -> 0x20 
result = result | (collumn << 2); // result -> 0x24 
result = result | cmd;    // result -> 0x25 

int setLED(int line, int collumn, enum command_e cmd) { int result = (line << 5); result = result | (collumn << 2); result = result | cmd; return result; } 

: 基於給出的值可能的寄存器位定義(狀態0-3和16x16矩陣)

// Bits: 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 
// Field:     RRRRRRRRRR CCCCCCCCCC SSSS 
// Range of Values:   0-15  0-15  0-3 

編輯: 確定的基礎上,6位地址,然後限制爲7的最大行和列的事實:

if(collumn < 7){ 
    collumn++; 
} 
else{ 
    collumn=0; 
    (line < 7) ? (line++) : (line = 0); 
} 

它看起來像您使用的是8×8 LED矩陣,可用6位尋址(3行代表行,3列代表)。我已經更新了我的「寄存器描述」,它應該清楚2和5的位移來自哪裏。

// Bits: 7 6 5 4 3 2 1 0 
// Field: RRRRRRR CCCCCCC SSSS 
// Range: 0-7  0-7  0-3 

的16×16矩陣的每個象限是寫入用下面的命令,這些8×8矩陣中的一個:

send.led0 = ...; 
send.led1 = ...; 
send.led2 = ...; 
send.led3 = ...; 
+0

謝謝你的幫助。我理解這一部分,但我不明白爲什麼這個數字(5和2)... –

+0

我已經更新了我的問題。 –

+0

它可能在數據表中規定了您正在編程的任何部分。查找寄存器的描述,您可能會看到如下內容:位0-1指定狀態。位2-5指定列,位6-9指定行。它需要4位(0x0到0xA)來尋址行和4位來尋址16x16顯示器的列。根據數據表仔細檢查2和5。你的功能可能有一個錯誤。 –