STM32實驗一:GPIO之流水燈
阿新 • • 發佈:2019-02-08
前面寫過一篇關於STM32微控制器的GPIO的文章,本來是打著從實用角度來做的實驗,但是發現不積跬步無以至千里啊,咱們從頭開始,先做一個最簡單的,入門級的,微控制器系統中的hello world,流水燈實驗!
我手中有一個神舟3的開發板,我就用這個板子來做實驗,板子中的實驗一共用到4個LED燈來做流水燈的實驗,這裡我們也用這4個燈,他們分別是GPIOF中的6、7、8、9這4個。
1、首先我們複製我們之前做過的模板工程到一個新建資料夾中,(如,你可以取個名字叫流水燈實驗的資料夾)神舟開發板的例程中在專案中添加了兩個檔案,分別是led.c和led.h,這是一種習慣,每做一個專案的時候都在其中新增一個.c和對應的.h檔案,這樣可以是工程看起來更加規整!本來我是不想新增這個的,這裡為了良好的程式設計習慣,我們也新增一個!並且我更改了模板檔案中的一些名字,在下圖中我將標誌出來
2、接下來我們來看一下程式,程式一共分為兩部分,一個main.c,一個led.c,因為程式比較簡單,所以在led.h中我們就不做任何定義了,這也省去了一些麻煩!按照習慣,我們先從main程式看起!
#include "stm32f10x.h" #include "led.h" void LED_config(void);//使用函式前先進行函式宣告 /******************************************************* * 函式名稱: delay * 輸入: 無 * 輸出: 無 * 功能描述: 延時函式 *******************************************************/ void delay(vu32 nCount) { for(; nCount != 0; nCount--); } /******************************************************* * 函式名稱: main * 輸入: 無 * 輸出: 無 * 功能描述: 主函式 *******************************************************/ int main(void) { LED_config(); //呼叫4個LED燈初始化函式 while(1) { GPIO_ResetBits(GPIOF,GPIO_Pin_6);//第一燈亮 delay(800000); //延時 GPIO_SetBits(GPIOF,GPIO_Pin_6); //第一燈滅 delay(800000); //延時 GPIO_ResetBits(GPIOF,GPIO_Pin_7); //第二燈亮 delay(800000); //延時 GPIO_SetBits(GPIOF,GPIO_Pin_7); //第二燈滅 delay(800000); //延時 GPIO_ResetBits(GPIOF,GPIO_Pin_8); //第三燈亮 delay(800000); //延時 GPIO_SetBits(GPIOF,GPIO_Pin_8); //第三燈滅 delay(800000); //延時 GPIO_ResetBits(GPIOF,GPIO_Pin_9); //第四燈亮 delay(800000); //延時 GPIO_SetBits(GPIOF,GPIO_Pin_9); //第四燈滅 delay(800000); //延時 } }
分析一下程式,LED_config();這個函式是呼叫了led.c中的函式,一會會貼出led.c檔案,GPIO_ResetBits、
GPIO_SetBits這兩個函式是庫檔案為我們提供的GPIO操作函式,我們貼出來看一下
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) { /* Check the parameters */ assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); assert_param(IS_GPIO_PIN(GPIO_Pin)); GPIOx->BRR = GPIO_Pin;
}
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
/* Check the parameters */
assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
assert_param(IS_GPIO_PIN(GPIO_Pin));
GPIOx->BSRR = GPIO_Pin;
}
這兩個函式的作用就是將埠置1或者清0
我們再來看一下led.c檔案
void LED_config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* 配置神舟III號LED燈使用的GPIO管腳模式*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF, ENABLE); /*使能LED燈使用的GPIO時鐘*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推輓輸出模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOF, &GPIO_InitStructure); /*神州III號使用的LED燈相關的GPIO口初始化*/
}
這裡主要就是GPIO的配置,前面我們也說過,一共3個步奏,1)、使能GPIOD的時鐘
2)、填充GPIO的屬性結構體
3)、傳遞引數至初始化函式
這裡要注意,我們將管腳模式配置為推輓輸出模式,這個需要注意一下,因為之後的實驗中我們還會給關鍵配置成其他的模式程式編寫完畢,編譯下載到實驗板中完成實驗!