新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM32_GPIO配置及庫函數講解——LED跑馬燈

        STM32_GPIO配置及庫函數講解——LED跑馬燈

        作者: 時間:2016-11-11 來源:網絡 收藏
        gpiogeneral-purposeinput/output通用輸入/輸出端口

        GPIO寄存器縮寫列表

        本文引用地址:http://www.104case.com/article/201611/317025.htm

        GPIO端口的每個位可以由軟件分別配置成多種模式。

        復位期間和剛復位后,復用功能未開啟,I/O端口被配置成浮空輸入模式。

        LED硬件連接如下圖所示:高電平點亮LED。

        要想成功點亮一個LED,程序所需如下步驟:(必須的)

        第一步:配置系統時鐘。見STM32F103xRCC寄存器配置

        除此之外,還需將GPIO外設時鐘打開。

        /* Enable GPIOC clock */
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

        第二步:配置中斷向量表。決定將程序下載到RAM中還是FLASH中。以后講。

        void NVIC_Configuration(void)
        {
        #ifdef VECT_TAB_RAM //VECT_TAB_RAM沒在程序中定義,所以將程序下載到Flash中
        /* Set the Vector Table base location at 0x20000000 */
        NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
        #else /* VECT_TAB_FLASH */
        /* Set the Vector Table base location at 0x08000000 */
        NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
        #endif
        }

        第三步:配置GPIO的模式。輸入模式還是輸出模式。本章重點。

        void GPIO_Configuration(void)
        {
        GPIO_InitTypeDef GPIO_InitStructure;

        /* Configure PC.06, PC.07, PC.08 and PC.09 as Output push-pull */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_Init(GPIOC, &GPIO_InitStructure);
        }

        其實,使用GPIO十分簡單,只需填寫如下結構體的成員變量

        typedef struct
        {
        u16 GPIO_Pin; //哪個管腳
        GPIOSpeed_TypeDef GPIO_Speed; //如果是輸出模式的話,還需要設置速度
        GPIOMode_TypeDef GPIO_Mode; //管腳的類型
        }GPIO_InitTypeDef;

        提示

        void GPIO_SetBits(GPIO_TypeDef* GPIOx, u16 GPIO_Pin)
        {
        /* Check the parameters */
        assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
        assert_param(IS_GPIO_PIN(GPIO_Pin));

        GPIOx->BSRR = GPIO_Pin;
        }

        涉及到GPIO_BSRR寄存器,如下所示

        又牽扯到GPIOx_ODR,如下所示
        vGPIO_ResetBits向指定Port指定Pin寫0:

        void GPIO_ResetBits(GPIO_TypeDef* GPIOx, u16 GPIO_Pin)
        {
        /* Check the parameters */
        assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
        assert_param(IS_GPIO_PIN(GPIO_Pin));

        GPIOx->BRR = GPIO_Pin;
        }

        涉及到GPIO_BRR寄存器,如下所示
        經過上面4步,就可以成功驅動LED。
        下面給出LED跑馬燈程序:

        /* Includes ------------------------------------------------------------------*/
        #include "stm32f10x_lib.h"

        /* Private function prototypes -----------------------------------------------*/
        void RCC_Configuration(void);
        void NVIC_Configuration(void);
        void GPIO_Configuration(void);
        void Delay(vu32 nCount);

        /*******************************************************************************
        * Function Name : main
        * Description : Main program.
        * Input : None
        * Return : None
        *******************************************************************************/
        int main(void)
        {
        #ifdef DEBUG
        debug();
        #endif

        /* Configure the system clocks */
        RCC_Configuration();

        /* NVIC Configuration */
        NVIC_Configuration();

        /* Configure the GPIO ports */
        GPIO_Configuration();

        /* Infinite loop */
        while (1)
        {
        GPIO_SetBits(GPIOC,GPIO_Pin_6);//點亮LED1
        Delay(1000000);
        Delay(1000000);//多點亮一會,使人能看到LED的確切變化
        GPIO_ResetBits(GPIOC,GPIO_Pin_6);//熄滅LED1

        GPIO_SetBits(GPIOC,GPIO_Pin_7);//點亮LED2
        Delay(1000000);
        Delay(1000000);
        GPIO_ResetBits(GPIOC,GPIO_Pin_7);//熄滅LED2

        GPIO_SetBits(GPIOC,GPIO_Pin_8);//點亮LED3
        Delay(1000000);
        Delay(1000000);
        GPIO_ResetBits(GPIOC,GPIO_Pin_8);//熄滅LED3

        GPIO_SetBits(GPIOC,GPIO_Pin_9);//點亮LED4
        Delay(1000000);
        Delay(1000000);
        GPIO_ResetBits(GPIOC,GPIO_Pin_9);//熄滅LED4
        }
        }

        /*******************************************************************************
        * Function Name : RCC_Configuration
        * Description : Configures the different system clocks.
        * Input : None
        * Return : None
        *******************************************************************************/
        void RCC_Configuration(void)
        {
        ErrorStatus HSEStartUpStatus;

        /* RCC system reset(for debug purpose) */
        RCC_DeInit();

        /* Enable HSE */
        RCC_HSEConfig(RCC_HSE_ON);

        /* Wait till HSE is ready */
        HSEStartUpStatus = RCC_WaitForHSEStartUp();

        if (HSEStartUpStatus == SUCCESS)
        {
        /* Enable Prefetch Buffer */
        FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

        /* Flash 2 wait state */
        FLASH_SetLatency(FLASH_Latency_2);

        /* HCLK = SYSCLK */
        RCC_HCLKConfig(RCC_SYSCLK_Div1);

        /* PCLK2 = HCLK */
        RCC_PCLK2Config(RCC_HCLK_Div1);

        /* PCLK1 = HCLK/2 */
        RCC_PCLK1Config(RCC_HCLK_Div2);

        /* PLLCLK = 8MHz * 9 = 72 MHz */
        RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

        /* Enable PLL */
        RCC_PLLCmd(ENABLE);

        /* Wait till PLL is ready */
        while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) {}

        /* Select PLL as system clock source */
        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

        /* Wait till PLL is used as system clock source */
        while(RCC_GetSYSCLKSource() != 0x08) {}
        }

        /* Enable GPIOC clock */
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
        }

        /*******************************************************************************
        * Function Name : NVIC_Configuration
        * Description : Configures Vector Table base location.
        * Input : None
        * Return : None
        *******************************************************************************/
        void NVIC_Configuration(void)
        {
        #ifdef VECT_TAB_RAM
        /* Set the Vector Table base location at 0x20000000 */
        NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
        #else /* VECT_TAB_FLASH */
        /* Set the Vector Table base location at 0x08000000 */
        NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
        #endif
        }

        /*******************************************************************************
        * Function Name : GPIO_Configuration
        * Description : Configures the different GPIO ports.
        * Input : None
        * Return : None
        *******************************************************************************/
        void GPIO_Configuration(void)
        {
        GPIO_InitTypeDef GPIO_InitStructure;

        /* Configure PC.06, PC.07, PC.08 and PC.09 as Output push-pull */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_Init(GPIOC, &GPIO_InitStructure);
        }

        /*******************************************************************************
        * Function Name : Delay
        * Description : Inserts a delay time.
        * Input : nCount: specifies the delay time length.
        * Return : None
        *******************************************************************************/
        void Delay(vu32 nCount)
        {
        for(; nCount != 0; nCount--);
        }

        #ifdef DEBUG
        /*******************************************************************************
        * Function Name : assert_failed
        * Description : Reports the name of the source file and the source line number
        * where the assert_param error has occurred.
        * Input : - file: pointer to the source file name
        * - line: assert_param error line source number
        * Return : None
        *******************************************************************************/
        void assert_failed(u8* file, u32 line)
        {
        /* User can add his own implementation to report the file name and line number,
        ex: printf("Wrong parameters value: file %s on line %drn", file, line) */

        /* Infinite loop */
        while (1)
        {
        }
        }
        #endif

        如何調試:在while(1)處設個斷點。

        執行完GPIO_Configuration函數后,觀察GPIO_CRL和GPIO_CRH寄存器,可以看到:

        每個管腳模式配置由GPIO_CRL或GPIO_CRH中的4位決定,例如:PC6管腳由GPIO_CRL中的MODE6[1:0]和CNF6[1:0]這4位決定,其他的以此類推。

        涉及到GPIO_CRL寄存器,如下所示

        因為MODE6[1:0]=11,查看上述表格,可以得出PC6是輸出模式,且最大速度是50MHZ。由于CNF6[1:0]=00且為輸出模式,所以以通用推挽輸出模式使用輸出驅動器。

        執行完GPIO_SetBits(GPIOC,GPIO_Pin_6); //點亮LED1,可以看到:GPIO_ODR的ODR6=1

        執行完GPIO_ResetBits(GPIOC,GPIO_Pin_6); //熄滅LED1,可以看到:GPIO_ODR的ODR6=0

        其他管腳如此類推。




        評論


        技術專區

        關閉
        主站蜘蛛池模板: 襄垣县| 邯郸市| 邵阳市| 平和县| 嘉黎县| 神木县| 郁南县| 岑溪市| 三河市| 炎陵县| 台江县| 屏东县| 崇义县| 雷山县| 伊宁县| 廊坊市| 新乡县| 深水埗区| 盐边县| 石渠县| 特克斯县| 潜江市| 信宜市| 泸定县| 武穴市| 济源市| 鸡西市| 杭锦后旗| 江川县| 望谟县| 齐河县| 怀化市| 东丰县| 屯门区| 高台县| 鱼台县| 宝应县| 通道| 五莲县| 呼图壁县| 浙江省|