STM32F103RCT6控制LED轉載於http://blog.csdn.net/snyanglq/article/details/50730895
不管什麼單片機,想要控制LED燈,只能是通過控制單片機芯片的I/O引腳電平的高低來實現。
同樣在ST單片機也一樣,在ST單片機上,I/O引腳可以被軟件設置成各種不同的功能,如輸入或輸出,所以被稱爲 GPIO (General-purpose I/O)。
而GPIO引腳又被分爲GPIOA、GPIOB„„GPIOG不同的組,每組端口分爲 0~15,共16個不同的引腳不等,
對於不同型號的芯片,端口的組和引腳的數量不盡相同,具體請參考相應ST單片機芯片型號的datasheet。
根據ST單片機的GPIO特點,控制LED燈的步驟如下:
1.在衆多 GPIO端口引腳中選定需要控制的特定引腳[與LED相連的控制引腳]
2.根據外設配置GPIO需要的特定功能
3.通過設置 GPIO輸出電壓的高低控制LED的亮和滅
電路圖
從電路圖可以看出低電平LED亮,高電平LED滅
所以我們設置的程序如下:
下面爲庫函數編程,需要加載如下庫文件
main.c
- /*********************************************************
- *平臺:MDKARM 5.14
- *主控:STM32F103RCT6
- **********************************************************/
- #include "stm32f10x.h"
- #include "led.h"
- //延時函數
- void Delay(unsigned int t)
- {
- while(t != 0)
- {
- t--;
- }
- }
- int main (void)
- {
- LED_Init();
- while (1) //步驟3
- {
- LED_Not(0); //LED亮滅交替閃爍
- for (j=0; j<30; j++)
- {
- Delay(60000);
- }
- }
- }
- #include "led.h"
- //LED 端口初始化//步驟2
- void LED_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;//定義一個GPIO_InitTypeDef類型的結構體
- RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE); //開啓GPIO的外設時鐘
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;//選定控制引腳//步驟1
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //設置引腳爲通用推輓輸出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //設置控制引腳的速度
- GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化結構體
- GPIO_SetBits(GPIOC, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3);//初始化LED燈熄滅
- }
- //點亮1個LED燈
- void LED_On(int n)
- {
- switch(n)
- {
- case 0: GPIO_ResetBits(GPIOC,GPIO_Pin_0); //控制引腳輸出低電平
- break;
- case 1: GPIO_ResetBits(GPIOC,GPIO_Pin_1);
- break;
- case 2: GPIO_ResetBits(GPIOC,GPIO_Pin_2);
- break;
- case 3: GPIO_ResetBits(GPIOC,GPIO_Pin_3);
- break;
- default: break;
- }
- }
- //
- void LED_Off(int n)
- {
- switch(n)
- {
- case 0: GPIO_SetBits(GPIOC,GPIO_Pin_0); //控制引腳輸出高電平
- break;
- case 1: GPIO_SetBits(GPIOC,GPIO_Pin_1);
- break;
- case 2: GPIO_SetBits(GPIOC,GPIO_Pin_2);
- break;
- case 3: GPIO_SetBits(GPIOC,GPIO_Pin_3);
- break;
- default: break;
- }
- }
- void LED_Not(int n)
- {
- switch(n)
- {
- case 0: GPIO_WriteBit(GPIOC, GPIO_Pin_0,(BitAction)(1-(GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_0))));
- break;
- case 1: GPIO_WriteBit(GPIOC, GPIO_Pin_1,(BitAction)(1-(GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_1))));
- break;
- case 2: GPIO_WriteBit(GPIOC, GPIO_Pin_2,(BitAction)(1-(GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_2))));
- break;
- case 3: GPIO_WriteBit(GPIOC, GPIO_Pin_3,(BitAction)(1-(GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_3))));
- break;
- default: break;
- }
- }
如此編譯後下載到MCU就能看到LED一閃一閃的