1. 程式人生 > >STM32學習筆記——GPIO之從庫函式到暫存器

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為段名,可

stm32f407PWM(操作

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

STM32ADC函式的介紹

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、兩過程定義與作用     子