在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > STM32_GPIO配置及庫函數(shù)講解——LED跑馬燈

            STM32_GPIO配置及庫函數(shù)講解——LED跑馬燈

            作者: 時間:2016-11-11 來源:網(wǎng)絡(luò) 收藏
            gpiogeneral-purposeinput/output通用輸入/輸出端口

            GPIO寄存器縮寫列表

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

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

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

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

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

            第一步:配置系統(tǒng)時鐘。見STM32F103xRCC寄存器配置

            除此之外,還需將GPIO外設(shè)時鐘打開。

            /* 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十分簡單,只需填寫如下結(jié)構(gòu)體的成員變量

            typedef struct
            {
            u16 GPIO_Pin; //哪個管腳
            GPIOSpeed_TypeDef GPIO_Speed; //如果是輸出模式的話,還需要設(shè)置速度
            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寄存器,如下所示
            經(jīng)過上面4步,就可以成功驅(qū)動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

            如何調(diào)試:在while(1)處設(shè)個斷點。

            執(zhí)行完GPIO_Configuration函數(shù)后,觀察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且為輸出模式,所以以通用推挽輸出模式使用輸出驅(qū)動器。

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

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

            其他管腳如此類推。




            評論


            技術(shù)專區(qū)

            關(guān)閉