在使用ST單片機(jī)的GPIO時(shí),會(huì)經(jīng)常涉及到2個(gè)結(jié)構(gòu)體的使用
typedef struct
{
uint16_t GPIO_Pin; /*!< Specifies the GPIO pins to be configured. This parameter can be any value of @ref GPIO_pins_define */
GPIOSpeed_TypeDef GPIO_Speed; /*!< Specifies the speed for the selected pins. This parameter can be a value of @ref GPIOSpeed_TypeDef */
GPIOMode_TypeDef GPIO_Mode; /*!< Specifies the operating mode for the selected pins. This parameter can be a value of @ref GPIOMode_TypeDef */
}GPIO_InitTypeDef;
typedef struct
{
__IO uint32_t CRL;
__IO uint32_t CRH;
__IO uint32_t IDR;
__IO uint32_t ODR;
__IO uint32_t BSRR;
__IO uint32_t BRR;
__IO uint32_t LCKR;
} GPIO_TypeDef;
這2個(gè)結(jié)構(gòu)體在使用時(shí)往往會(huì)令初學(xué)者感到混淆,GPIO_InitTypeDef 和 GPIO_TypeDef 都是一個(gè)結(jié)構(gòu)體類型,我們要用它來定義一個(gè)結(jié)構(gòu)體變量。
我們一般這樣來使用GPIO_InitTypeDef,
GPIO_InitTypeDef GPIO_InitStructure; /*先定義一個(gè)結(jié)構(gòu)體變量 */
/* 對(duì)變量中的成員進(jìn)行初始化定義*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
/* 開啟相應(yīng)的端口時(shí)鐘*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
/* 將定義的結(jié)構(gòu)體的變量中的知傳給GPIO的寄存器*/
GPIO_Init(GPIOB, &GPIO_InitStructure);
我們?cè)賮砜纯磛oid GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct) 這個(gè)函數(shù),
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
{
uint32_t currentmode = 0x00, currentpin = 0x00, pinpos = 0x00, pos = 0x00;
uint32_t tmpreg = 0x00, pinmask = 0x00;
/* Check the parameters */
assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
assert_param(IS_GPIO_MODE(GPIO_InitStruct->GPIO_Mode));
assert_param(IS_GPIO_PIN(GPIO_InitStruct->GPIO_Pin));
/*---------------------------- GPIO Mode Configuration -----------------------*/
currentmode = ((uint32_t)GPIO_InitStruct->GPIO_Mode) & ((uint32_t)0x0F);
if ((((uint32_t)GPIO_InitStruct->GPIO_Mode) & ((uint32_t)0x10)) != 0x00)
{
/* Check the parameters */
assert_param(IS_GPIO_SPEED(GPIO_InitStruct->GPIO_Speed));
/* Output mode */
currentmode |= (uint32_t)GPIO_InitStruct->GPIO_Speed;
}
/*---------------------------- GPIO CRL Configuration ------------------------*/
/* Configure the eight low port pins */
if (((uint32_t)GPIO_InitStruct->GPIO_Pin & ((uint32_t)0x00FF)) != 0x00)
{
tmpreg = GPIOx->CRL;
for (pinpos = 0x00; pinpos < 0x08; pinpos++)
{
pos = ((uint32_t)0x01) << pinpos;
/* Get the port pins position */
currentpin = (GPIO_InitStruct->GPIO_Pin) & pos;
if (currentpin == pos)
{
pos = pinpos << 2;
/* Clear the corresponding low control register bits */
pinmask = ((uint32_t)0x0F) << pos;
tmpreg &= ~pinmask;
/* Write the mode configuration in the corresponding bits */
tmpreg |= (currentmode << pos);
/* Reset the corresponding ODR bit */
if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPD)
{
GPIOx->BRR = (((uint32_t)0x01) << pinpos);
}
else
{
/* Set the corresponding ODR bit */
if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPU)
{
GPIOx->BSRR = (((uint32_t)0x01) << pinpos);
}
}
}
}
GPIOx->CRL = tmpreg;
}
/*---------------------------- GPIO CRH Configuration ------------------------*/
/* Configure the eight high port pins */
if (GPIO_InitStruct->GPIO_Pin > 0x00FF)
{
tmpreg = GPIOx->CRH;
for (pinpos = 0x00; pinpos < 0x08; pinpos++)
{
pos = (((uint32_t)0x01) << (pinpos + 0x08));
/* Get the port pins position */
currentpin = ((GPIO_InitStruct->GPIO_Pin) & pos);
if (currentpin == pos)
{
pos = pinpos << 2;
/* Clear the corresponding high control register bits */
pinmask = ((uint32_t)0x0F) << pos;
tmpreg &= ~pinmask;
/* Write the mode configuration in the corresponding bits */
tmpreg |= (currentmode << pos);
/* Reset the corresponding ODR bit */
if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPD)
{
GPIOx->BRR = (((uint32_t)0x01) << (pinpos + 0x08));
}
/* Set the corresponding ODR bit */
if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPU)
{
GPIOx->BSRR = (((uint32_t)0x01) << (pinpos + 0x08));
}
}
}
GPIOx->CRH = tmpreg;
}
}
乍一看,沒看懂,但我們能清楚地看到這些語句
GPIOx->BRR = (((uint32_t)0x01) << pinpos);
GPIOx->BSRR = (((uint32_t)0x01) << pinpos);
GPIOx->CRL = tmpreg;
GPIOx->CRH = tmpreg;
具體過程是怎么執(zhí)行的我也沒看明白,但沒關(guān)系,只要知道這個(gè)函數(shù)是對(duì)GPIO的BRR,BSRR,CRL,CRH寄存器進(jìn)行了相關(guān)操作就OK了,
最后的結(jié)果就是對(duì)單片機(jī)的PB口進(jìn)行了這些設(shè)置:
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
另外,這個(gè)結(jié)構(gòu)體
typedef struct
{
__IO uint32_t CRL;
__IO uint32_t CRH;
__IO uint32_t IDR;
__IO uint32_t ODR;
__IO uint32_t BSRR;
__IO uint32_t BRR;
__IO uint32_t LCKR;
} GPIO_TypeDef;
是用來定義這些變量的,如下:
#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)
#define GPIOB ((GPIO_TypeDef *) GPIOB_BASE)
#define GPIOC ((GPIO_TypeDef *) GPIOC_BASE)
#define GPIOD ((GPIO_TypeDef *) GPIOD_BASE)
#define GPIOE ((GPIO_TypeDef *) GPIOE_BASE)
#define GPIOF ((GPIO_TypeDef *) GPIOF_BASE)
#define GPIOG ((GPIO_TypeDef *) GPIOG_BASE)
而如下結(jié)構(gòu)體
typedef struct
{
uint16_t GPIO_Pin; /*!< Specifies the GPIO pins to be configured. This parameter can be any value of @ref GPIO_pins_define */
GPIOSpeed_TypeDef GPIO_Speed; /*!< Specifies the speed for the selected pins. This parameter can be a value of @ref GPIOSpeed_TypeDef */
GPIOMode_TypeDef GPIO_Mode; /*!< Specifies the operating mode for the selected pins. This parameter can be a value of @ref GPIOMode_TypeDef */
}GPIO_InitTypeDef;
一般用來定義一個(gè)變量就OK,如GPIO_InitTypeDef GPIO_InitStructure;
上一篇:GPIO復(fù)位函數(shù)void GPIO_DeInit(GPIO_TypeDef* GPIOx) 的理解
下一篇:ST官方庫函數(shù)之GPIO口讀寫函數(shù)
推薦閱讀
史海拾趣
由于字?jǐn)?shù)限制,我將先為您提供一個(gè)關(guān)于Cliff Electronic Components公司的發(fā)展故事,如您需要更多內(nèi)容,請(qǐng)?jiān)俅卧儐枴?/p>
Cliff Electronic Components的崛起與轉(zhuǎn)型
在1977年,一個(gè)名為Cliff Electronic Components Limited的公司在英國悄然成立。初創(chuàng)時(shí)期,它主要為音樂行業(yè)提供連接器,滿足了當(dāng)時(shí)市場(chǎng)上對(duì)于音頻設(shè)備連接的需求。隨著市場(chǎng)的發(fā)展和技術(shù)的進(jìn)步,公司很快意識(shí)到,僅靠單一產(chǎn)品線難以滿足日益多樣化的市場(chǎng)需求。
在公司成立的初期,Cliff面臨著巨大的市場(chǎng)壓力。當(dāng)時(shí),電子行業(yè)正經(jīng)歷著快速的技術(shù)革新,競(jìng)爭對(duì)手層出不窮。為了在市場(chǎng)上站穩(wěn)腳跟,Cliff決定對(duì)其產(chǎn)品線進(jìn)行大刀闊斧的改革和擴(kuò)展。他們不僅繼續(xù)深耕音頻連接器領(lǐng)域,還開始涉足交流電源連接器、直流電源連接器、饋通連接器等多種電子連接器產(chǎn)品。
進(jìn)入80年代,隨著個(gè)人電腦的普及和電子設(shè)備的小型化趨勢(shì),Cliff迎來了新的發(fā)展機(jī)遇。公司迅速調(diào)整戰(zhàn)略,開始研發(fā)和生產(chǎn)適用于個(gè)人電腦的各種連接器。這一轉(zhuǎn)型使得Cliff的產(chǎn)品線更加豐富,也為其贏得了更多的市場(chǎng)份額。
為了滿足客戶對(duì)于高品質(zhì)產(chǎn)品的需求,Cliff不斷加大研發(fā)投入,引進(jìn)先進(jìn)的生產(chǎn)設(shè)備和技術(shù)。他們?cè)诋a(chǎn)品設(shè)計(jì)和制造工藝上不斷創(chuàng)新,力求為客戶提供更加可靠、高效的連接器解決方案。這種對(duì)品質(zhì)的不懈追求,使得Cliff逐漸在市場(chǎng)上樹立起了良好的口碑。
進(jìn)入90年代,隨著全球化的加速和電子行業(yè)的飛速發(fā)展,Cliff開始積極拓展國際市場(chǎng)。他們參加各種國際電子展會(huì),與全球的客戶和合作伙伴建立聯(lián)系。通過與國際知名企業(yè)的合作,Cliff不僅提升了自身的品牌影響力,還進(jìn)一步拓展了其產(chǎn)品的應(yīng)用范圍。
隨著時(shí)間的推移,Cliff逐漸成為了一個(gè)在國際上享有盛譽(yù)的電子連接器品牌。他們始終堅(jiān)持創(chuàng)新、品質(zhì)和服務(wù)至上的理念,贏得了客戶的廣泛認(rèn)可和贊譽(yù)。今天,當(dāng)我們提到Cliff時(shí),人們首先想到的是他們高品質(zhì)的電子連接器和專業(yè)的客戶服務(wù)。
若您想要探索更多內(nèi)容,隨時(shí)可以繼續(xù)輸入。請(qǐng)注意,由于Cliff Electronic Components公司的發(fā)展歷程可能涉及多個(gè)方面,以上內(nèi)容主要聚焦于其產(chǎn)品線擴(kuò)展和市場(chǎng)拓展的方面。如果您對(duì)其他方面如技術(shù)研發(fā)、企業(yè)文化等有進(jìn)一步的興趣,可以再次輸入以獲取更多信息。
若您想要更多關(guān)于Cliff Electronic Components的故事,請(qǐng)隨時(shí)告知。
Eurotechnique公司成立于XXXX年,由幾位具有遠(yuǎn)見卓識(shí)的電子工程師和企業(yè)家共同創(chuàng)立。他們看到了當(dāng)時(shí)電子行業(yè)快速發(fā)展的趨勢(shì),尤其是數(shù)字電路和微控制器領(lǐng)域的巨大潛力。因此,公司決定專注于這兩個(gè)領(lǐng)域的技術(shù)研發(fā)和產(chǎn)品生產(chǎn)。在創(chuàng)立初期,Eurotechnique通過不斷的技術(shù)創(chuàng)新和產(chǎn)品優(yōu)化,逐漸在市場(chǎng)上樹立了良好的口碑。
進(jìn)入21世紀(jì)后,隨著數(shù)碼技術(shù)的迅速崛起,傳統(tǒng)攝影市場(chǎng)遭受了巨大的沖擊。面對(duì)這一挑戰(zhàn),伊士曼柯達(dá)公司開始嘗試向數(shù)碼領(lǐng)域轉(zhuǎn)型。然而,由于公司在數(shù)碼技術(shù)方面的積累相對(duì)較少,轉(zhuǎn)型過程并不順利。盡管如此,柯達(dá)仍然堅(jiān)持創(chuàng)新,不斷推出新的數(shù)碼產(chǎn)品,以應(yīng)對(duì)市場(chǎng)的變化。同時(shí),公司還加強(qiáng)了與數(shù)碼技術(shù)公司的合作,共同研發(fā)新產(chǎn)品,以提高市場(chǎng)競(jìng)爭力。
為了進(jìn)一步豐富產(chǎn)品線,APEM在1984年開設(shè)了新廠,專業(yè)生產(chǎn)開關(guān)面板。這一舉措不僅擴(kuò)充了公司的產(chǎn)品種類,也滿足了客戶對(duì)多樣化產(chǎn)品的需求。此后,APEM不斷推出新產(chǎn)品,逐步形成了完善的開關(guān)和控制面板產(chǎn)品線。
隨著公司業(yè)務(wù)的不斷發(fā)展,誠潤電子開始積極拓展海外市場(chǎng)。他們通過參加國際展會(huì)、與海外客戶建立合作關(guān)系等方式,逐漸將產(chǎn)品推向全球。在這個(gè)過程中,誠潤電子不僅提升了自身的品牌知名度,還積累了豐富的國際市場(chǎng)經(jīng)驗(yàn)。如今,誠潤電子的產(chǎn)品已經(jīng)出口到多個(gè)國家和地區(qū),成為了全球電子保護(hù)元件領(lǐng)域的重要供應(yīng)商之一。
有人用tftpd32.exe做服務(wù)器下載程序到開發(fā)板么? 我怎么下載不了 在PC本機(jī)上測(cè)試,可以下載。 但用開發(fā)板下載不了,在PC上用抓包軟件能看到開發(fā)板發(fā)來的請(qǐng)求,但tftpd32.exe沒反應(yīng)… 查看全部問答∨ |
|
今天看了國嵌的視頻,覺得里面的交叉工具連的制作講得很清楚、明了,之前在網(wǎng)上找了好多資料,不是說的很繁瑣,就是講得含糊不清。我想總結(jié)一下,希望能幫助初學(xué)者能快速的學(xué)會(huì),其實(shí)我也是初學(xué)者!1. 需要的文件: 已經(jīng)編譯好的 arm-linux-gcc壓 ...… 查看全部問答∨ |
|
請(qǐng)?jiān)敿?xì)講解一下#define st(x) do { x } while (__LINE__ == -1) #define st(x) do { x } while (__LINE__ == -1) 那么程序中 st( EA = 0; );//EA當(dāng)作一個(gè)變量吧 怎么理解?… 查看全部問答∨ |
【MSP430 編譯器使用經(jīng)驗(yàn)】IAR開發(fā)MSP430入門篇 本帖最后由 霹靂之火 于 2014-8-5 20:49 編輯 IAR有針對(duì)很對(duì)種芯片的版本,比如針對(duì)ARM核的IAR for ARM. IAR for AVR是針對(duì)AVR單片機(jī)的,IAR for MSP430是針對(duì)TI出品的MSP430系列單片機(jī)的. 你需要根據(jù)你使用的芯片選擇. 為了學(xué)習(xí)用,可以下載先嘗 ...… 查看全部問答∨ |
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦
- 神經(jīng)形態(tài)芯片可能是革新機(jī)器人實(shí)時(shí)電機(jī)控制的未來
- 從三個(gè)方面理解ARM嵌入式系統(tǒng)
- 自動(dòng)報(bào)警 基于MCU的家庭防盜報(bào)警系統(tǒng)的設(shè)計(jì)
- 存儲(chǔ)控制器及其訪問外設(shè)的原理
- 基于51系列單片機(jī)的智能照明控制系統(tǒng)設(shè)計(jì)方案
- 基于STM32的四旋翼飛行器控制系統(tǒng)
- 單片機(jī)應(yīng)用編程技巧解析
- 基于89C52的教室智能節(jié)能照明系統(tǒng)設(shè)計(jì)
- 一種新型的雨量光照傳感器的設(shè)計(jì)
- 新思科技:通過EDA和IP助力中國RISC-V發(fā)展
- 英飛凌:引領(lǐng)RISC-V成為汽車行業(yè)開放標(biāo)準(zhǔn)
- 東芝推出輸出耐壓1800V的車載光繼電器
- 中國制定的全球首項(xiàng)鋰離子電池硅基負(fù)極材料國際標(biāo)準(zhǔn)發(fā)布
- 智能汽車合成數(shù)據(jù)架構(gòu)與應(yīng)用實(shí)踐分享
- 15家車企的固態(tài)電池汽車及供應(yīng)商一覽!
- 8月交付!鋰電巨頭全固態(tài)電池商業(yè)化“快進(jìn)”
- 白皮書點(diǎn)破汽車智駕營銷現(xiàn)象:六個(gè)“不等于”揭示真實(shí)的輔助駕駛
- Unity引擎在智能座艙項(xiàng)目流程之深入優(yōu)化與未來技術(shù)
- Unity引擎在智能座艙項(xiàng)目流程之未來技術(shù)趨勢(shì)與高級(jí)整合
- 傳英特爾XMM 7560良率問題已解決 有望獨(dú)吞iPhone新機(jī)基帶訂單
- 智能制造浪潮逼近,是挑戰(zhàn)更是機(jī)遇!
- 如果人工智能普及,會(huì)造成經(jīng)濟(jì)危機(jī)嗎?
- 軟銀集團(tuán)計(jì)劃通過軟銀公司IPO獲利 然后投資AI領(lǐng)域
- 一年一度科技盛宴開啟在即,RoboMaster機(jī)甲大師總決賽亮點(diǎn)提前看
- STM8學(xué)習(xí)筆記三——錯(cuò)誤:no definition for "assert_failed"
- STM8學(xué)習(xí)筆記四——STM8的GPIO基礎(chǔ)知識(shí)
- 單片機(jī)MSP430入門--理論②--時(shí)鐘模塊
- MSP430單片機(jī)中斷的的優(yōu)先級(jí)順序定義
- MSP430單片機(jī)系列通用串行模塊的I2C模式
- 怎樣尋找靠譜的代工廠
- n1000060?????????????
- 09全國電子設(shè)計(jì)競(jìng)賽預(yù)測(cè)題
- 【求助】如何用135進(jìn)行正交脈沖的計(jì)數(shù)
- 最后一天!有獎(jiǎng)直播 | RSL15 - 安森美更高效更智能更安全的 BLE 5.2 藍(lán)牙芯片
- arm中斷嵌套一定要切換模式嗎?
- 求學(xué)電動(dòng)機(jī)的驅(qū)動(dòng)之路-1
- 430也能玩嵌入式:Contiki內(nèi)核在IAR+MSP430下移植(五)
- [菜鳥提問]WinCE6.0模擬開發(fā),需要什么軟件?
- 廣州知名外企招聘軟件開發(fā)工程師(待遇優(yōu))