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燈。 |