STM32使用之GPIO


STM32第一個例子

//**********************************************************************
// 作者:YYYtech
// 時間:2007/12/14
//***********************************************************************
/***********************************************************************
main文件,GPIO操作,完成最簡單的IO操作實驗,就是控制LED燈
4個LED分別對應PC的6、7、8、9引腳。4個LED流水顯示
**************************************************************************/
#include "stm32f10x_lib.h"


GPIO_InitTypeDef GPIO_InitStructure;

void LED_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);

}

void LED_TurnOn(u8 led)
{
  
}

void Delay(vu32 nCount)
{
for(; nCount != 0; nCount--);
}

main()
{

//RCC_Configuration();
LED_Init();

while(1)
{
   GPIO_SetBits(GPIOC, GPIO_Pin_9);
   Delay(0x8ffff);
   GPIO_ResetBits(GPIOC, GPIO_Pin_9);
   Delay(0x8ffff);
   GPIO_SetBits(GPIOC, GPIO_Pin_10);
   Delay(0x8ffff);
   GPIO_ResetBits(GPIOC, GPIO_Pin_10);
   Delay(0x8ffff);
   GPIO_SetBits(GPIOC, GPIO_Pin_11);
   Delay(0x8ffff);
   GPIO_ResetBits(GPIOC, GPIO_Pin_11);
   Delay(0x8ffff);
   GPIO_SetBits(GPIOC, GPIO_Pin_12);
   Delay(0x8ffff);
   GPIO_ResetBits(GPIOC, GPIO_Pin_12);
   Delay(0x8ffff);
}
}
注意:在這里用到了RCC和GPIO的庫函數,所以必須把這兩個函數加入工程。
  
關於固件庫函數在文件夾:C:\Keil\ARM\RV31\LIB\ST\STM32F10x
為了不在操作過程中避免改變KEIL文件夾下的庫函數,可以固件函數庫放到其他文件夾下,如:E:\jy\work\STM\WxlStm32\LAB\library
其中stm32f10x_lib.c文件是整個庫的一些定義,是必須要的。
加入后的工程為:

GPIO庫函數簡單說明:
函數名稱 功能描述
GPIO_DeInit 重新初始化外圍設備GPIOx相關寄存器到它的默認復位值
GPIO_AFIODeInit 初始化交錯功能(remap, event control和 EXTI 配置) 寄存器
GPIO_Init 根據GPIO_初始化結構指定的元素初始化外圍設備GPIOx
GPIO_StructInit 填充GPIO_初始化結構(GPIO_InitStruct)內的元素為復位值
GPIO_ReadInputDataBit 讀指定端口引腳輸入數據
GPIO_ReadInputData 讀指定端口輸入數據
GPIO_ReadOtputDataBit 讀指定端口引腳輸出數據
GPIO_ReadOtputData 讀指定端口輸出數據
GPIO_SetBits 置1指定的端口引腳
GPIO_ResetBits 清0指定的端口引腳
GPIO_WriteBit 設置或清除選擇的數據端口引腳
GPIO_Write 寫指定數據到GPIOx端口寄存器
GPIO_ANAPinConfig 允許或禁止 GPIO 4 模擬輸入模式
GPIO_PinLockConfig 鎖定GPIO引腳寄存器
GPIO_EventOutputConfig 選擇GPIO引腳作為事件輸出
GPIO_EventOutputCmd 允許或禁止事件輸出
GPIO_PinRemapConfig 改變指定引腳的影射
GPIO_EMIConfig 允許或禁止GPIO 8 和 9 的EMI 模式
拓展實驗:
在上面LED燈流水顯示的基礎之上加上按鍵程序,首先來看看按鍵的原理圖:

當然這個原理圖也是相當之簡單的,不用讀解釋了,唯一注意的是OK鍵與其他三個鍵的區別是按下為高電平,其余三個按下為低電平。
加入后的完整清單如下:
//**********************************************************************
// 作者:JingYong
// 時間:2008/4/24
//***********************************************************************
/***********************************************************************
GPIO操作,完成最簡單的IO操作實驗,用按鍵控制LED燈閃爍
**************************************************************************/
#include "stm32f10x_lib.h"

GPIO_InitTypeDef GPIO_InitStructure;
//鍵盤定義
#define    KEY_OK     GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)
#define    KEY_DOWN    GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1)
#define    KEY_UP     GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2)
#define    KEY_ESC    GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3)
//LED初始化
void LED_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
//按鍵初始化
void KEY_Init (void)
{
    GPIO_InitTypeDef gpio_init;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    gpio_init.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
    gpio_init.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &gpio_init);
}
//延遲函數
void Delay(vu32 nCount)
{
for(; nCount != 0; nCount--);
}
//主函數
main()
{
//RCC_Configuration();
LED_Init();
KEY_Init ();

while(1)
{
   if(!KEY_ESC)
   {
    while(!KEY_ESC) ;
    GPIO_SetBits(GPIOC, GPIO_Pin_9);
    Delay(0x8ffff);
    GPIO_ResetBits(GPIOC, GPIO_Pin_9);
    Delay(0x8ffff);
   }
   else if(!KEY_UP)
   {
    while(!KEY_UP) ;
    GPIO_SetBits(GPIOC, GPIO_Pin_10);
    Delay(0x8ffff);
    GPIO_ResetBits(GPIOC, GPIO_Pin_10);
    Delay(0x8ffff);
   }
   else if(!KEY_DOWN)
   {
    while(!KEY_DOWN) ;
    GPIO_SetBits(GPIOC, GPIO_Pin_11);
    Delay(0x8ffff);
    GPIO_ResetBits(GPIOC, GPIO_Pin_11);
    Delay(0x8ffff);
   }
   else if(KEY_OK)
   {
    while(KEY_OK) ;
    GPIO_SetBits(GPIOC, GPIO_Pin_12);
    Delay(0x8ffff);
    GPIO_ResetBits(GPIOC, GPIO_Pin_12);
    Delay(0x8ffff);
   }
}
}
該例子是按下不同的按鍵,閃爍對應的LED燈。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM