STM32學習筆記——GPIO之從庫函式到暫存器
* @brief Initializes the GPIOx peripheral according to the specified
* parameters in the GPIO_InitStruct.
* @param GPIOx: where x can be (A..G) to select the GPIO peripheral.
* @param GPIO_InitStruct: pointer to a GPIO_InitTypeDef structure that
* contains the configuration information for the specified GPIO peripheral.
* @retval None
*/
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變數中
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 */
//設定低8位引腳(即pin0~pin7)
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 */
//若欲配置為上拉/下拉輸入,則需要配置BRR和BSRR暫存器
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);
}
}
}
}
//寫入低8位引腳配置字
GPIOx->CRL = tmpreg;
}
/*---------------------------- GPIO CRH Configuration ------------------------*/
/* Configure the eight high port pins */
//設定高8位引腳(即pin8~pin15),流程和低8位引腳一致
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;
}
}
相關推薦
STM32學習筆記——GPIO之從庫函式到暫存器
/** * @brief Initializes the GPIOx peripheral according to the specified * parameters in the GPIO_InitStruct. * @param GPIOx: where x can
Web前端學習筆記——JavaScript之陣列、函式、作用域
陣列 為什麼要學習陣列 之前學習的資料型別,只能儲存一個值(比如:Number/String。我們想儲存班級中所有學生的姓名,此時該如何儲存? 陣列的概念 所謂陣列,就是將多個元素(通常是同一型別)按一定順序排列放到一個集合中,那麼這個集合我們就稱之為陣列
STM32 學習八 USART通訊3 庫函式方式程式設計
STM32 庫是ST公司針對STM32提供的函式介面,即API,開發簡便、維護維護、閱讀。 CMSIS標準(摘自百度百科): 為了解決不同的晶片廠商生產的Cortex微控制器軟體相容性問題,ARM與晶片廠商建立了CMSIS標準(Cortex MicroController
STM32學習筆記(五)LCD函式
//x,y :起點座標 //len :小數點後的位數//size:字型大小,此處省略,預設1608字型//color:顏色,此處僅保留前景色,可自行修改//num:數值(0~4294967295); void LCD_ShowNum(u16 x,u16 y,float nu
Web前端學習筆記—— jQuery之簡介、物件、選擇器
jQuery簡介 JavaScript庫的概念 JavaScript開發的過程中,處理瀏覽器的相容很複雜而且很耗時,於是一些封裝了這些操作的庫應運而生。這些庫還會把一些常用的程式碼進行封裝。 把一些常用到的方法寫到一個單獨的js檔案,使用的時候直接去引用這js檔
Git 學習筆記 - 04 - Git 工作區和暫存區的概念
Git 學習筆記 - 04 - Git 工作區和暫存區的概念 注:本文參照的是廖雪峰老師的Git教程 Git 工作區和暫存區的概念 工作區: 就是你在電腦裡能夠看到的目錄。 我的理解:就是你受 Git 管理的檔案所在的目錄。 版本庫: 工作區中有一個隱
8086彙編學習之[BX],CX暫存器與loop指令,ES暫存器等
一、彙編程式的基本格式: 1、基本格式與解析: assume cs:codeseg //assume假設CS暫存器與codeseg段有關聯,codeseg段本就是程式碼段 codeseg segment //段開始,codeseg為段名,可
stm32f407之PWM(操作暫存器)
PWM 脈寬調製模式可以生成一個由TIMx_ARR暫存器的值確定頻率和TIMx_CCRx暫存器的值確定佔空比的訊號。 可以對每個通道獨立選擇PWM模式,( OCx輸出一個PWM訊號)在TIMx_CCMRx暫存器的OCxM位寫110(PW
STM32學習筆記之GPIO輸入與輸出
1、核心點:對於任意MCU中的外設(模組)操作方法:都是找該模組的工作框圖,根據框圖來寫程式 對於ST中的任何一個外設,都是掛載在不同的時鐘線下的,所有的時鐘線預設都是關閉的;在使用該外設之前,要開啟該外設的時鐘 步驟1 :
STM32學習筆記之Keil工程Lib庫檔案的製作和運用
最近看了百度手環開源專案,發現所有的演算法都被封裝成了一個lib檔案在keil中呼叫 也是第一次學習到。 問題引出:為什麼要做成lib庫? 1、有些方案公司為了將自己寫的關鍵部分原始碼不進行公開,但是同時庫檔案又需要讓別人能夠正常呼叫,那封裝成lib的格式就是一
學習筆記網站之在ASP和PHP語言及數據庫選擇上的3個要點[圖文]
筆記 ASP PHP 數據庫 編程語言 學習筆記網站之在ASP和PHP語言及數據庫選擇上的3個要點[圖文]去年12月份,我開始著手建立一個學習類的博客網站,由於博客站點我以前就接觸過,因此在網站建設方面還是有些心得的,不過讓我有些拿不定註意的是:如何選擇系統語言,例如ASP和PHP的選擇;
[基礎篇]ESP8266-NonOS學習筆記(四)之GPIO操作(按鍵、LED、中斷、定時器)
本篇文章我們再回到基礎篇,難道你還以為我會講UDP?啊哈哈哈,UDP肯定是會講的,但是應用場景不是很多,我們放到後面再講,不過也是簡單一講,畢竟熟悉UDP協議的人來說,都知道UDP一種不可靠的傳輸協議,可以這樣形容“我(Client)只管發,你(Server)愛收不收”,所以在一些實際應用場景
學習筆記 c++ (boost庫,訊號和槽函式)
#include"iostream" #include"boost/signals.hpp" using namespace std; void my_slot(){ cout<<"my_slot()"<<endl; } void my_sl
Web前端學習筆記——JavaScript 之函式進階
函式進階 函式的定義方式 函式宣告 函式表示式 new Function 函式宣告 function foo () { } 函式表示式 var foo = function () { } 函式宣告與函式表示式的區別 函式宣告必須有名字 函式宣告會函
STM32學習筆記之ADC轉換
1. ADC簡介 stm32f103最少有2個AD模數轉換器,每個ADC都有18個通道,可以測量16個外部和2個內部模擬量。最大轉換頻率為1Mhz,也就是轉換時間為1us(在 ADCCLK = 14Mhz,取樣週期為1.5個時鐘週期時)。最大時鐘超過14Mhz,將導致ADC轉換準確度降低。stm32的A
STM32之ADC庫函式的介紹
ADC的基本概念希望各位網友查閱相應的手冊,上面對ADC有比較詳盡的介紹,包括誤差的分析和消除。這裡主要介紹ADC的基本庫函式的定義和使用。 1.ADC_DeInit函式的功能是將外設ADCx的全部暫存器重設為預設值。 ADC_DeInit(ADC2); 2.ADC_Ini
Python學習筆記13:標準庫之子程序(subprocess包)
ubprocess包主要功能是執行外部的命令和程式。從這個意義上來說,subprocess的功能與shell類似。 subprocess以及常用的封裝函式 當我們執行python的時候,我們都是在建立並執行一個程序。 在Python中,我們通過標準庫中的subprocess
STM32學習筆記之ADC--DMA方式
}/*************************************************函式: void DMA_Config(void)功能: DMA配置 引數: 無返回: 無**************************************************/void DMA
《從零開始學Swift》學習筆記(Day 19)——函式引數傳遞
原創文章,歡迎轉載。轉載請註明:關東昇的部落格函式的語法格式如下:func 函式名(引數列表) -> 返回值型別 {語句組return 返回值}關鍵字是func。多個引數列表之間可以用逗號(,
stm32學習筆記(八)中斷服務函式與函式呼叫的區別
在《微機原理》和《計算機組成》等課程[1-4]教學中(本文以MCS-51微控制器為例),中斷過程既是教學難點又是教學重點,它與主程式呼叫子程式過程有一定相似性,但又有很大區別,呼叫子程式過程相對比較容易掌握,通過把兩過程結合起來,採用比較教學方法,能收到了很好的教學效果。 1、兩過程定義與作用 子