<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

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

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

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

          GPIO寄存器縮寫列表

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

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

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

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

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

          第一步:配置系統(tǒng)時鐘。見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寄存器,如下所示
          經(jīng)過上面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

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

          執(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且為輸出模式,所以以通用推挽輸出模式使用輸出驅動器。

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

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

          其他管腳如此類推。




          評論


          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();