STM32例項之LED燈閃爍控制以及相關注意事項
在本例項中,主要是為了實現LED燈的閃爍。首先分析LED的驅動方式,本實驗中使用的是OpenM3V,內建8個LED均採用灌流方式驅動(低電平亮)。如果想要實現其閃爍,則需要給相應埠持續不斷的高低交替電平。
在軟體結構設計中,加入使用LED8,則需要在PD7口不斷的輸出高電平和低電平。首先需要初始化系統時鐘,然後再開始配置PD7作為輸出使用,開啟外設時鐘最後控制PD7輸出持續的高低輪流。
開始 -> 配置系統時鐘 -> 配置PD7作為輸出在開啟PD外設時鐘 -> 置位PD7,熄滅LED8 -> 延時程式 -> 清PD7,點亮LED8 -> 延時 -> 置位PD7,以此開始迴圈閃爍。
以下給出具體的程式碼(程式碼執行在KEIL5上)。
在軟體程式碼編寫中需要實現LED的閃爍其實是很簡單的,只需要輪流的置低、置高控制LED8的I/O口線就好。
#include<stm32f10x_lib.h> //包含標頭檔案,使用庫函式必須要加入該標頭檔案
int main(void)
{
RCC_Configuration();//配置系統時鐘,設定系統時鐘為72MHz
NVIC_Configuration();//配置中斷
//使能A,B,C,D,E外設時鐘,如果用到那個外設,必須開啟其外設時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|
RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD|
RCC_APB2Periph_GPIOE,ENABLE);
GPIO_InitSrtucture.GPIO_Pin = GPIO_ALL;//選中所有的引腳0~15;
GPIO_InitSrtucture.GPIO_Mode = GPIO_AIN;//配置成模擬輸入;
GPIO_Init(GPIOA, &GPIO_InitStructure);//把A埠全部引腳配置成模擬輸入
GPIO_Init(GPIOB, &GPIO_InitStructure);//把B埠全部引腳配置成模擬輸入
GPIO_Init(GPIOC, &GPIO_InitStructure);//把C埠全部引腳配置成模擬輸入
GPIO_Init(GPIOD, &GPIO_InitStructure);//把D埠全部引腳配置成模擬輸入
GPIO_Init(GPIOE, &GPIO_InitStructure);//把E埠全部引腳配置成模擬輸入
//使能A,B,C,D,E外設時鐘,關閉A,B,C,D,E外設
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|
RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD|
RCC_APB2Periph_GPIOE,DISABLE);
//配置LED所在的外設的6,7,8,9引腳為輸出
GPIO_InitSrtucture.GPIO_Pin = GPIO_Pin6|GPIO_Pin7|GPIO_Pin8|GPIO_Pin9;
GPIO_InitSrtucture.GPIO_Mode = GPIO_Mode_Out_PP;//配置為輸出
GPIO_InitSrtucture.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIO_LED,&GPIO_InitSrtucture);
While(1) //為了產生迴圈
{
}
}
以下是完整的程式(其中以標頭檔案方式包含以上程式)
#include<stm32f10x_lib.h>
Void Delay(void)
{
unsigned long k;
For(k=0;k<0xffff8;k++);
}
int main()
{
RCC_Configuration();//配置系統時鐘,設定系統時鐘為72MHz
NVIC_Configuration();//配置中斷
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);//開啟外設D的時鐘
//配置LED所在的外設的7引腳為輸出
GPIO_InitSrtucture.GPIO_Pin = GPIO_Pin_7;
GPIO_InitSrtucture.GPIO_Mode = GPIO_Mode_Out_PP;// I/Od的方向
GPIO_InitSrtucture.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD,&GPIO_InitStructure);//初始化外設D的7埠
While(1)
{
GPIO_SetBits(GPIOD,GPIO_Pin_7);//置位PD7,滅LED8
Delay(); //延時
GPIO_Resetbits(GPIOD,GPIO_Pin_7);//清PD7,點亮LED8
Delay(); //延時
}
}
以上就是完整的程式,但是在使用外設的時候,以下幾點非常重要。
1.FWLAB檔案組中加入該外設的庫檔案
2.在標頭檔案stm32f10x_conf.h中,開啟對應外設的巨集定義
3.根據系統對該功能的需求,初始化該功能外設
4.開啟該外設的時鐘
5.在NVIC_Configuration()函式中配置巢狀向量中斷
在介紹如何使用I/O外設:
1.需要向FWLAB檔案組中加入時鐘(RCC),中斷(NVIC),flash,系統(LIB)和GPIO相關的庫檔案,這樣有關I/O口的庫檔案也加入了;
2.標頭檔案中的外設定義是否開啟(是否有巨集定義);
3.首先需要使用GPIO_Init(GPIOD,&GPIO_InitStructure)函式來初始化埠D,設定埠7為輸出;
4.呼叫RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE)函式開啟外設D的時鐘;由於沒有使用中斷,所以沒有配置中斷優先順序,加入說有中斷則需要配置中斷優先順序。
(想要正確的使用外設,以上幾點總結是必須要涉及到的)