五月天青色头像情侣网名,国产亚洲av片在线观看18女人,黑人巨茎大战俄罗斯美女,扒下她的小内裤打屁股

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

如果不會寄存器開發(fā)而陷入瓶頸, 那么本文將會有較大幫助

2022-05-13 14:40 作者:大方老師單片機課堂  | 我要投稿

如果不會寄存器開發(fā)而陷入瓶,那么本文將會有較大幫助


///插播一條:我自己在今年年初錄制了一套還比較系統(tǒng)的入門單片機教程,想要的同學找我拿就行了免費的,私信我就可以~點我頭像黑色字體加我地球呺也能領取哦。最近比較閑,帶做畢設,帶學生參加省級或以上比///


0.緒論

對于經過系統(tǒng)培訓的開發(fā).單片機SoC的驅動開發(fā),不管是使用各種庫還是直接上寄存,都不成問.

可是很多非專業(yè)但是需要干嵌入式或單片機工程的,比如機,車輛工,,或是其他的一些專業(yè).有時候這些學生需要搞比,做項,不可避免的要用到一些單片(由于種種原,現(xiàn)在幾乎都會首STM32).但是缺乏系統(tǒng)訓練的學生往往無法看懂寄存器版本的例,或是別人的開源項.自己寫的話更是不知道如何開.或者編譯完成后總是出現(xiàn)莫名的問.這給大家?guī)砹藰O大的困.

同時互聯(lián)網(wǎng)上大部分教程都是轉載來轉載,各種差異和版本都.很多人即使看過了也是一頭霧.所以應一個同學要,大概寫一下寄存器的一些操.

本教程將會使"學生用戶體量龐"STM32F1xx系列的單片機作為例.但是不必擔.所有的寄存器操作都是共通.并不會有本質的差.希望你能快速閱讀完并且理解,然后查閱自己需要的資.不管是什么東西,這種方式都是通用.

嵌入式軟件開發(fā)具有一個比較龐大的知識體.限于作者的時間和水,本文不可能講太多東西.但是如果你只是因為不會寄存器開發(fā)而陷入瓶,那么本文將會有較大幫助(畢竟這個是寫文章的目).

理解本文需要一些基,大概包: c/c++,一些數(shù),計算機基礎知.大多數(shù)理工類專業(yè)都會有相關的課程.如果確實存疑可以即時搜.

讓我們先記住開發(fā)的正確方: 摘抄借,修改糅,以實現(xiàn)功能為目,以別人的代碼為基.

只要不涉及什么知識產權的,這樣做是完全沒有問題.畢竟不需要把很多基礎性的東西寫來寫.所以請大膽的找開源項,盡可能在基礎上,而不是從零開發(fā).不廢話,開始正.

比如十進制下0.1就是二進制的無限不循環(huán)小數(shù).上面那個例子也.

著名 IEEE754 float浮點數(shù)標準導致bug:在很多語言, 0.1+0.20.3


就是因0.1是二進制無限循環(huán)小數(shù)的原.但是存儲器位寬不能是無窮.所以產生舍入誤.


在瀏覽器中按F12進入開發(fā)者模,JavaScript下的浮點數(shù)精bug

所以在很多項目,為了實現(xiàn)當兩個值相等時觸發(fā)什么函數(shù),往往不會直接寫相,而是兩者的差值小于多少時即生效

floata,b;........if(a==b){

//這種寫法不建議}........if(abs(a-b)0.00001){

//一般這么寫}

二進制與/十六進制的轉換

剛才那個方法就可以直接.還有其他算法這里不.先讓我貼一個表:

BIN

DEC

HEX

0000

0

0

0001

1

1

0010

2

2

0011

3

3

0100

4

4

0101

5

5

0110

6

6

0111

7

7

1000

8

8

1001

9

9

1010

10

A

1011

11

B

1100

12

C

1101

13

D

1110

14

E

1111

15

F

BIN是二進, DEC是十進, HEX是十六進.都是英語簡.

十六進制和二進制可以直接換.方法是每四位二進制看作一個十六進制

比如

0110 1101 1011 1001

6 D B 9

轉換表背過的話讀代碼快.因為一般情況,為了讓一行代碼看的不至于太,人們會用十六進制代表二進.尤其是對于擁32cortex-M3內核STM32F1系列單片,一次寫一個三十二位數(shù)屬實太冗.

c/c++,默認寫的數(shù)字都是十進.二進制應該0b,0b00101100,而十六進制0x,0x3C.

//一般這么寫GPIOB->CRL&=0x00440000;//這么寫就不太美觀了GPIOB->CRL&=0b00000000010001000000000000000000;

數(shù)學差不多.開始正.

2. c/c++語言基礎

a+b; //加法

a-b; //減法

a*b; //乘法

a/b; //,所有計算需要注意整(數(shù))和浮點(數(shù))的運算區(qū).如有疑問自行搜索

a%b; //.就是小學學的余數(shù). 14÷4=3 ... 2 14mod4=2, 14/4=3. float(14)/4=3.5f

a</.a看為二進制數(shù),整個向左移b. 00000110< 00011000.當溢出的時候會發(fā)生什么?

a>>b; //.和上面一樣的功.

a&b; //按位求(AND), 11010010

// & 01010011

// ------------

// 01010010

a|b; //按位取(OR)

~a; //按位取(NOT)

!a; //邏輯(注意和上面的區(qū))

c+=a; //相當 c=c+a;其他算符同.

重點看左右移和位操(,,).

3.我們配寄存(register)到底是在配置什么

,你的最終目的都是使用單片機GPIO(general pin input & output)/輸出一個高電平還是低電.不管是諸I2C, SPI的通,還是按鍵讀,亮燈報,說到底都是高低電平的控制或探.

ADC輸入的是模(Analog),但是會被轉化為數(shù)(Digital),一樣是高低電.這里暫且不談
,,或者一些功能的使能及配置一樣是通過寄存器.原理相.畢竟芯片集成電路也是電,而且是數(shù)字電.暫時不深.

,為了讓某一Pin輸出電,或者使能一個通,我們可以01現(xiàn).

但是代碼終歸是代,不是魔.為了使需求生,單片機將每一個需要控制的,賦予一個地址.在電路層面上實現(xiàn)相關的功能綁.用戶只需通過給這個地址去寫一個,就相當于控制了需要控制的東西.易于計,我們32位處理器最大可以尋4GB的內存空.

:并不是每一個地址都是有真實物理地址對應.換而言,一個地址可能指向的是真實的內,也可能并不是真實存在的內.不過訪問這個地址相當于控制了被控量一.此時該地址可以看作控制量的一個(handler).
"使能"的意思是enable.反義詞"禁用(disable)".計算機相關的詞匯總是這么的看不懂字面意.看英語就明白.
內存是存儲數(shù)據(jù)的地.任何電子信息數(shù)據(jù)都可以看01. 32位機的最小存儲單元DWORD(, Double Word),32比特. 32位機的內存單元可以看作一個個存32比特位的小倉.為了找到所需要的數(shù)據(jù),需要給這些倉庫編.這個所謂的編號就是地址(Address).存儲的值是地址值的變量叫做(pointer).比如一個倉庫放著一個記錄某個貨物的多個存放倉庫的編,那么這個內存里的數(shù)據(jù)就是一個指.計算機無法分辨哪寫是指,哪些是數(shù)據(jù).這需要人去完.

庫函數(shù)是寄存器的封裝.不管STHAL硬件抽象層,還是標準STL,都是封裝而.本質上是宏定義替換和一些函數(shù).宏定義在編(compile)階段完.不占用寶貴的存儲空.函數(shù)本身會被編譯為代,所以會占用空.盡量避免在庫中使用函數(shù).當然用戶代碼肯定無所.

為什么要用庫函數(shù)?比如

GPIO_InitTypeDef GPIO_Initure;

GPIO_Initure.Pin=GPIO_PIN_13;

GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;

HAL_GPIO_Init(GPIOB,&GPIO_Initure);

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_SET);

這一段代,不加注釋你也知道他的意思是初始PB13為推挽輸.

但是如果寫成了寄存器版本的你可能就看不懂.

GPIOB->CRH&=0XFF0FFFFF;

GPIOB->CRH|=0X00300000;

GPIOB->ODR|=1<

現(xiàn)在會簡要介紹寄存器的配置方.你能搜到這個文章肯定是因為你找見的開源代碼使用的是寄存器版. 正常人的,能找見庫函數(shù)絕對是不會用寄存器版本的代碼.

寄存器版本的代碼實際上也是封,比如上述代碼實際上也可以直接寫成

(uint32_t *)(((((uint32_t)0x40000000) + 0x10000) + 0x0C00)+0x01)&=0XFF0FFFFF;

(uint32_t *)(((((uint32_t)0x40000000) + 0x10000) + 0x0C00)+0x01)|=0X00300000;

(uint32_t *)(((((uint32_t)0x40000000) + 0x10000) + 0x0C00)+0x04)|=1<

//這一段代碼可能不對

上面就是直接通過指針操作寄存器的方.寄存器宏定義和結構體相當,先找GPIOB的開頭地,然后加上結構體的附加地址偏(去操作某一個功,CRH寄存).最后給這個地址寫入一串二進制值去控制相應的東西.

說到底還是去給某些比特上寫高低電.

類似GPIOB->CRH,實際上是定義的一個結構.

typedefstruct{

__IOuint32_tCRL;

__IOuint32_tCRH;

__IOuint32_tIDR;

__IOuint32_tODR;

__IOuint32_tBSRR;

__IOuint32_tBRR;

__IOuint32_tLCKR;}GPIO_TypeDef;

通過結構體的位關系以及各種宏定義替,可以實現(xiàn)地址的編譯時自動確.

寄存器的封裝好在對于實際內存位置不同的芯,移植只需更改寄存器宏定義映射即.而且已經很容易讀.

4.常見的寄存器配置初始(使STM32F1xx系列舉例)

我們寫驅,最常用的就GPIO的配置.我們就舉一些例.

RCC寄存器

RCC寄存器一般用來配RCC時鐘相關的代.比如我要使PA0,我必須開PA的時鐘通道才.時鐘相當于處理器的心,沒有心跳當然是死.但是沒理由的開啟時鐘會帶來額外EMI干擾和整機功.原理暫且不,實際危害就是干擾大,耗電多.尤其針對于一些對功耗要求嚴格的場,例如手環(huán)手,應該盡可能在待機時關閉能關閉的所有時.用來省(比如有的智能手表升級系統(tǒng)后待機變久,可能就是這個原.我們說的(firmware)升級實際上指的就是把新寫的代碼下載到了老設備).

舉個例, RCC時鐘的配置如下

RCC->APB2ENR|=1</使PORTC時鐘

RCC->APB2ENR|=1</使PORTB時鐘

RCC->APB2ENR|=1</使PORTA時鐘

具體使能哪一個位是控制,需要查(除非你背過).

如果是需要快速出項,不管其他,可以省,直接使能所有時.但是不建議這么.

如果不會寄存器開發(fā)而陷入瓶頸, 那么本文將會有較大幫助的評論 (共 條)

分享到微博請遵守國家法律
惠水县| 博白县| 新田县| 天祝| 陕西省| 台前县| 内丘县| 嵩明县| 大埔区| 桐柏县| 卓资县| 区。| 柳河县| 宽城| 和龙市| 伽师县| 香格里拉县| 台北市| 罗江县| 成武县| 凤山市| 凌海市| 治县。| 珠海市| 灵台县| 新营市| 西平县| 城步| 义马市| 邵阳县| 澄城县| 桃江县| 平江县| 平泉县| 永川市| 卫辉市| 娄烦县| 金沙县| 苏州市| 巴塘县| 凌云县|