[TOC] - 詳見 <手把手教你DSP> 第6章 - 認識程式庫的組成、暫存器的實現並非必要,但能多點此方面程式概念在日後接觸相關領域必有幫助 # 暫存器 - 舉例來說,下面是一個叫做WDCR的暫存器,WDCR是暫存器名。這個暫存器有16個bits(0~15),格子內的名稱稱為<font color="red">位域名</font>,代表這些bits負責的功能,占用的長度稱為<font color="red">位域長</font> - WDPS是位域名,佔據bit0 ~ bit2 - WDCHK是位域名,佔據bit3 ~ bit5 - ...  ## 暫存器通式 - <font color="red">群組名.暫存器名.all=0x0000</font> - <font color="blue">群組名.暫存器名.bit.位域名=1</font> ## 寫入暫存器,以GPIO為例 - 在C語言中使用Structure的方式實現暫存器的結構,對各個Structure內的變量寫入值,相當於對暫存器寫值 - 今天要對GPFDIR暫存器的第3個bit寫入1,第3個bit的位域名稱為GPIOF2 - Library中的GPFDIR暫存器Structure有兩個變數(見區段1),表示有兩種寫法 - 對all寫入 : 直接把值寫入整個暫存器 - GPFDIR.all = 0x0004; // 0000_0000_0000_0100, GPIOF2是第3個bit - 對bit內的變量寫入 : bit又是另一個Structure的實例,Structure內的變量見區段2,全部都是GPFDIR暫存器其中的位域名稱,可以看到要寫入的GPIOF2也在裡面,所以也可以針對位域名做寫入 - GPFDIR.bit.GPIOF2 = 1 - 在程式庫中,GPFDIR暫存器屬於控制GPIO性質的暫存器,GPIO_MUX_REGS 的Structure把類似功能的暫存器Structure都放在裡面,見區段3。 - 而程式庫將暫存器結構體的實例宣告都放在DSP281x_GlobalVariableDefs.c(見區段4),因此要對暫存器寫值是對這個實例內部的結構變量寫入,此處完整寫法應為 - <font color="red">GpioMuxRegs.GPFDIR.all = 0x0004;</font> - <font color="blue">GpioMuxRegs.GPFDIR.bit.GPIOF2 = 1;</font> ``` c++= // 舉例 /*************************************************/ // 這兩行都把GPIOF2腳位設為Output GpioMuxRegs.GPFDIR.bit.GPIOF2 = 1; GpioMuxRegs.GPFDIR.all = 0x0004; //0000_0000_0000_0100 // 區段1 // GPFDIR_REG結構內有兩個實例 // Found in DSP281x_Gpio.h /*************************************************/ union GPFDIR_REG { Uint16 all; struct GPFDIR_BITS bit; }; // 區段2 // GPFDIR_REG結構內有16個實例 // 冒號右邊的數字表示這個位域占用的bit數 // Found in DSP281x_Gpio.h /*************************************************/ struct GPFDIR_BITS { // bits description Uint16 GPIOF0:1; // 0 Uint16 GPIOF1:1; // 1 Uint16 GPIOF2:1; // 2 Uint16 GPIOF3:1; // 3 Uint16 GPIOF4:1; // 4 Uint16 GPIOF5:1; // 5 Uint16 GPIOF6:1; // 6 Uint16 GPIOF7:1; // 7 Uint16 GPIOF8:1; // 8 Uint16 GPIOF9:1; // 9 Uint16 GPIOF10:1; // 10 Uint16 GPIOF11:1; // 11 Uint16 GPIOF12:1; // 12 Uint16 GPIOF13:1; // 13 Uint16 GPIOF14:1; // 14 Uint16 GPIOF15:1; // 15 }; // 區段3 // 可以看到GPFDIR是 GPFDIR_REG 結構的一個實例 ,被宣告在 GPIO_MUX_REGS 結構內 // Found in DSP281x_Gpio.h /*************************************************/ struct GPIO_MUX_REGS { union GPAMUX_REG GPAMUX; union GPADIR_REG GPADIR; union GPAQUAL_REG GPAQUAL; Uint16 rsvd1; union GPBMUX_REG GPBMUX; union GPBDIR_REG GPBDIR; union GPBQUAL_REG GPBQUAL; Uint16 rsvd2[5]; union GPDMUX_REG GPDMUX; union GPDDIR_REG GPDDIR; union GPDQUAL_REG GPDQUAL; Uint16 rsvd3; union GPEMUX_REG GPEMUX; union GPEDIR_REG GPEDIR; union GPEQUAL_REG GPEQUAL; Uint16 rsvd4; union GPFMUX_REG GPFMUX; union GPFDIR_REG GPFDIR; // 在這裡-------------- Uint16 rsvd5[2]; union GPGMUX_REG GPGMUX; union GPGDIR_REG GPGDIR; Uint16 rsvd6[6]; }; // 區段4 // GpioMuxRegs是GPIO_MUX_REGS Structure的實例 /*************************************************/ // Found in DSP281x_GlobalVariableDefs.c volatile struct GPIO_MUX_REGS GpioMuxRegs; ````
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up