stm32控制LED的亮滅
其實這個小實驗就是學會運用GPIO這個外設。
GPIO是一個片上高速外設,它是由幾個寄存器來控制的,每個寄存器占據0x04:
GPIOx_BSSR:
端口位設置/清除寄存器,這個寄存器的BSy位是0-15位(BS0-BS15),BRy位是16-31位(BR0-BR15);通過這兩個位可以控制16個引腳;BSy只寫,寫0對ODRy無作用,寫1置ODRy位1;BSy只寫,寫0對ODRy無作用,寫1清除ODRy為0;如若兩個位同時設置,BSy位起作用。
GPIOx_CRL/CRH:
端口配置低/高寄存器,用到了兩個寄存器來配置16個引腳,每個引腳由地位開始按順序每四個位控制一個引腳;MODEy[1:0],這兩位00表示輸入模式;01為輸出模式,最大速度10MHz;10為輸出模式,最大速度為2MHz;11為輸出模式,最大速度位50MHz;CNFy[1:0],在輸入/輸出模式,這兩位就可以配置四種不同的輸入/輸出模式。
GPIOx_IDR:
端口輸入數據寄存器,IDRy[0:15](16-31位保留),這些位只能以字(16位)的形式的只讀,讀出的值就是對應引腳的狀態。
GPIOx_ODR:
端口輸出數據寄存器, IDRy[0:15](16-31位保留),這些位能以字(16位)的形式的讀寫,讀出的值就是對應引腳的狀態。
GPIOx_BRR:
端口位清除寄存器,BRy[0:15](16-31位保留),這些位只能以字(16位)的形式的只寫,寫0對相應的ODRy無作用,寫1對對應的ODRy為0。
GPIOx_LCKR:
端口配置鎖定寄存器,LCKK[16],改位可隨時讀出,但只可以通過鎖鍵寫入序列來修改,寫0鎖鍵位激活;寫1,鎖鍵位激活,下次復位前該寄存器被鎖住;
LCKy[0:15],每個鎖定位鎖定CRL/CRH對應的四個位,這些鎖定位可讀,在鎖鍵位為0時寫入;寫0不鎖定端口的配置;寫1鎖定端口的配置。
用單片機點亮一個LED燈,可以通過寄存器,也可以通過庫函數;
下面是寄存器版本:
#include"stm32f10x.h" #define PERIPH_BASE1 ((unsigned int)0x40000000) /*APB2 總線基地址 */ #define APB2PERIPH_BASE1 (PERIPH_BASE1 + 0x10000) /* AHB總線基地址 */ #define AHBPERIPH_BASE1 (PERIPH_BASE1 + 0x20000) /*GPIOB外設基地址*/ #define GPIOB_BASE (APB2PERIPH_BASE + 0x0C00) /* GPIOB寄存器地址,強制轉換成指針 */ #define GPIOB_CRL *(unsigned int*)(GPIOB_BASE+0x00) #define GPIOB_CRH *(unsigned int*)(GPIOB_BASE+0x04) #define GPIOB_IDR *(unsigned int*)(GPIOB_BASE+0x08) #define GPIOB_ODR *(unsigned int*)(GPIOB_BASE+0x0C) #define GPIOB_BSRR *(unsigned int*)(GPIOB_BASE+0x10) #define GPIOB_BRR *(unsigned int*)(GPIOB_BASE+0x14) #define GPIOB_LCKR *(unsigned int*)(GPIOB_BASE+0x18) /*RCC外設基地址*/ #define RCC_BASE (AHBPERIPH_BASE + 0x1000) /*RCC的AHB1時鐘使能寄存器地址,強制轉換成指針*/ #define RCC_APB2ENR *(unsigned int*)(RCC_BASE+0x18) int main() { RCC_APB2ENR |=(1<<3); GPIOB_CRL&=~(0x0F<<(4*0)); GPIOB_CRL|=(1<<(4*0)); GPIOB_ODR&=~(1<0); while(1); }
下面是庫函數版本的bsp_led.h文件:
#ifndef __LED_H #define __LED_H #include"stm32f10x.h" //定義端口,時鐘,引腳 #define red_PORT GPIOB #define red_PIN GPIO_Pin_5 #define red_LCK RCC_APB2Periph_GPIOB #define green_PORT GPIOB #define green_PIN GPIO_Pin_0 #define green_LCK RCC_APB2Periph_GPIOB #define blue_PORT GPIOB #define blue_PIN GPIO_Pin_1 #define blue_LCK RCC_APB2Periph_GPIOB #define ON 0 #define OFF 1 //定義7種顏色的顯示 #define red(a) if(a) GPIO_SetBits(red_PORT,red_PIN);else GPIO_ResetBits(red_PORT,red_PIN) #define green(a) if(a) GPIO_SetBits(green_PORT,green_PIN);else GPIO_ResetBits(green_PORT,green_PIN) #define blue(a) if(a) GPIO_SetBits(blue_PORT,blue_PIN);else GPIO_ResetBits(blue_PORT,blue_PIN) #define yellow red(ON);green(ON);blue(OFF) #define purple red(ON);green(OFF);blue(ON) #define cyan red(OFF);green(ON);blue(ON) #define white red(ON);green(ON);blue(ON) void LED_GPIO_Config(void); #endif
下面是bsp_led.c文件:
#include "bsp_led.h" void LED_GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStructure;//定義一個GPIO結構體 RCC_APB2PeriphClockCmd(red_LCK|green_LCK|blue_LCK,ENABLE);//使能外設時鐘 GPIO_InitStructure.GPIO_Pin=red_PIN;//配置引腳,模式,速度 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(red_PORT,&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin=green_PIN; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(green_PORT,&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin=blue_PIN; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(blue_PORT,&GPIO_InitStructure); red(OFF); green(OFF); blue(OFF); }
下面是main.c:
#include"stm32f10x.h" #include"bsp_led.h" int main(void) { LED_GPIO_Config(); while(1) { red(ON); } }
以上代碼能正常運行的前提是已經搭建好你自己的程序基礎框架。
stm32控制LED的亮滅