1. 程式人生 > >stm32控制LED的亮滅

stm32控制LED的亮滅

修改 清除 lap IT 就是 clu lse end else

其實這個小實驗就是學會運用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的亮滅