【引言】:
? ? ? ? 嵌入式開發(fā)工程師有別于其他軟件開發(fā)工程師,最大的區(qū)別就是對(duì)硬件操作的敏感性枷恕,眾所周知筏养,硬件的最小描述單位是bit,而軟件領(lǐng)域中兄朋,我們能表示的最小單位是Byte掐禁,原因在本人的課程視頻中已經(jīng)分析過(guò)了,如果有其他認(rèn)識(shí)颅和,也歡迎和我交流探討傅事。
? ? ? ? ?那么如何通過(guò)C語(yǔ)言更好的操作硬件那,我們就會(huì)想到對(duì)某些bit設(shè)置為高電平或者低電平(看看吧峡扩,硬件就是這樣的呆萌^_^)蹭越。那么我們就來(lái)給大家簡(jiǎn)單的總結(jié)下在今后開發(fā)過(guò)程中,常用的位操作方式吧教届。
? ? ? ? 本文响鹃,也是本人在教學(xué)中,看到很多同學(xué)和開發(fā)中遇到的問(wèn)題案训,進(jìn)行的總結(jié)买置,如有不妥,歡迎大家共同交流共同進(jìn)步强霎。
【正文】:
? ? ? ? 一忿项、某一個(gè)位的操作:
? ? ? ? ? 這個(gè)要簡(jiǎn)單的多,基本的思想就是對(duì)對(duì)應(yīng)位進(jìn)行與和或的操作城舞。比如轩触,我們想對(duì)某一組寄存器的第12bit設(shè)置為高電平,那么我們就自然想到了:
? ? ? ? ? unsigned int *addr = (unsigned int *)0xE0100100;
? ? ? ? ?// 這里我們假設(shè)我們操作的寄存器組的基地址是0xE0100100.
? ? ? ? ?addr[0] |= (0x1<<12);? ? // 注意硬件的bit計(jì)數(shù)也是從0開始的哦椿争。
? ? ? ? ?那么怕膛,如果想對(duì)某一組寄存器的第12bit變成低電平那,那么我們就會(huì)想到:
? ? ? ? ?addr[0] &= ~(0x1<<12);
? ? ? ? ?所以秦踪,對(duì)某一位的操作褐捻,是比較簡(jiǎn)單的掸茅,如果還沒(méi)有理解的,可以看看本人講的C語(yǔ)言高級(jí)課程的視頻啊柠逞。
? ? ? ? ?二昧狮、對(duì)某一塊特定區(qū)域設(shè)置為一個(gè)特定的數(shù):
? ? ? ? ? 這種操作,在目前嵌入式開發(fā)中板壮,使用的越來(lái)越多逗鸣,因?yàn)槟壳暗膕oc功能越來(lái)越多,數(shù)字電路的功能選項(xiàng)也非常龐大绰精,再用一個(gè)bit代表一種開關(guān)狀態(tài)已經(jīng)不能滿足現(xiàn)在的開發(fā)需求了撒璧。所以都是某幾個(gè)bit組合來(lái)代表幾個(gè)功能的選擇。比如我想對(duì)12bit---15bit這4個(gè)bit位設(shè)置為1010的話笨使,如果我們還是沿用上一種的方式進(jìn)行操作卿樱,那么想一想會(huì)不會(huì)出問(wèn)題那?
? ? ? ? ? 答案很明顯硫椰,如果我們只是單純的用“|”操作進(jìn)行設(shè)置1的操作繁调,那么如果之前這4個(gè)bit都是1,那么在設(shè)置完成后靶草,4個(gè)bit還是1蹄胰,達(dá)不到我們的要求,同樣的道理奕翔,清零也是會(huì)出現(xiàn)這個(gè)問(wèn)題裕寨。
? ? ? ? ? 那么應(yīng)該怎么處理那,思路很簡(jiǎn)單糠悯,就是先對(duì)這些控制區(qū)域清零帮坚,然后再置位的方式。代碼實(shí)現(xiàn)如下:
? ? ? ? ? unsigned int *addr = (unsigned int *)0x20008000;
? ? ? ? ? addr[0] &= ~(0xf<<12);
? ? ? ? ? addr[0] |= (0x6<<12);
【總結(jié)】:
? ? ? ? ?如果我想對(duì)4-7bit設(shè)置1011互艾,并且對(duì)10-13bit設(shè)置1100,那么該如何操作那讯泣?