通常我們需要對ST單片機的整個IO進(jìn)行復(fù)位操作,這是我們可以用到復(fù)位函數(shù)void GPIO_DeInit(GPIO_TypeDef* GPIOx);
先來看一下這個函數(shù)的定義
void GPIO_DeInit(GPIO_TypeDef* GPIOx)
{
/* Check the parameters */
assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
if (GPIOx == GPIOA)
{
RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA, DISABLE);
}
else if (GPIOx == GPIOB)
{
RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOB, DISABLE);
}
else if (GPIOx == GPIOC)
{
RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOC, ENABLE);
RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOC, DISABLE);
}
else if (GPIOx == GPIOD)
{
RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOD, ENABLE);
RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOD, DISABLE);
}
else if (GPIOx == GPIOE)
{
RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOE, ENABLE);
RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOE, DISABLE);
}
else if (GPIOx == GPIOF)
{
RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOF, ENABLE);
RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOF, DISABLE);
}
else
{
if (GPIOx == GPIOG)
{
RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOG, ENABLE);
RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOG, DISABLE);
}
}
}
這便是對一組IO進(jìn)行復(fù)位的函數(shù),它先后2次調(diào)用了函數(shù)void RCC_APB2PeriphResetCmd(uint32_t RCC_APB2Periph, FunctionalState NewState),
而且這PA,PB,PC,PD,PE,PF,PG 7組IO口的時鐘都掛載在了APB2總線上。
第一次調(diào)用這個函數(shù)RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA, ENABLE)是對PA口的寄存器進(jìn)行復(fù)位使其為0,
第二次調(diào)用這個函數(shù)RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA, DISABLE)是對PA口的寄存器進(jìn)行復(fù)位接觸,之后可以對PA口的寄存器進(jìn)行讀寫操作。
再來詳細(xì)看一下這個函數(shù)void RCC_APB2PeriphResetCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)
void RCC_APB2PeriphResetCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)
{
/* Check the parameters */
assert_param(IS_RCC_APB2_PERIPH(RCC_APB2Periph));
assert_param(IS_FUNCTIONAL_STATE(NewState));
if (NewState != DISABLE)
{
RCC->APB2RSTR |= RCC_APB2Periph;
}
else
{
RCC->APB2RSTR &= ~RCC_APB2Periph;
}
}
RCC->APB2RSTR |= RCC_APB2Periph這句話對RCC的寄存器進(jìn)行置位操作,也是對傳進(jìn)來的RCC_APB2Periph_GPIOA的PA口進(jìn)行復(fù)位操作,執(zhí)行后RCC的寄存器APB2RSTR的第3位為1,即D2位為1,執(zhí)行后PA口的寄存器GPIOA_ODR為0。
RCC->APB2RSTR &= ~RCC_APB2Periph這句話即對PA口的寄存器進(jìn)行復(fù)位解除,執(zhí)行后RCC的寄存器APB2RSTR的第3位為0,PA口的寄存器可以任意讀寫了。
上一篇:單片機控制TFT液晶屏顯示數(shù)字
下一篇:ST之GPIO使用之理解
推薦閱讀
史海拾趣
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦
- 晶心科技:只需提供兩個設(shè)計文件,就能輕松擴(kuò)展RISC-V指令集
- 艾邁斯歐司朗先進(jìn)的高精度溫度傳感器助推動物健康管理
- Microchip與臺達(dá)電子簽署碳化硅解決方案合作協(xié)議,共創(chuàng)電源管理未來
- 馬斯克被曝將旗下腦機接口公司 Neuralink 登記為“小微企業(yè)”
- 寒武紀(jì)宣布將募資 39.85 億元加碼 AI 大模型芯片與軟件平臺
- 如何加快基于RISC-V的SoC項目上市時間?西門子EDA給出了解法
- 負(fù)責(zé)任的賦能技術(shù)實現(xiàn)邊緣AI全面適用
- 半導(dǎo)體創(chuàng)新推動能源格局演變的三種方式
- 大模型怎么幫助RISC-V設(shè)計和驗證?Nuclei Model讓芯來的IP更有競爭力
- 合見工軟如何幫助“香山”解決高性能多核RISC-V驗證難題?