GPIO位帶操作點亮LED,且使用按鍵控制開關


1. 項目

  類似與C51單片機的位操作使能引腳來點亮LED.

  例如,sbit P0^0 = 0 

     LED1 = P0^0; 

2. 代碼

  main.c

  

#include "stm32f10x.h"			//相當於51單片機中的 	#include <reg51.h>
#include "bsp_key.h"
#include "bsp_led.h"

#define GPIOB_ODR_Addr		(GPIOB_BASE + 0x0c)
#define PBout(n)					*(unsigned int*)((GPIOB_ODR_Addr & 0xf0000000) + 0x02000000 + ((GPIOB_ODR_Addr &0x00ffffff)<<5) + (n<<2))

#define GPIOC_IDR_Addr		(GPIOC_BASE + 0x08)
#define PCin(n)					*(unsigned int*)((GPIOC_IDR_Addr & 0xf0000000) + 0x02000000 + ((GPIOC_IDR_Addr &0x00ffffff)<<5) + (n<<2))

void Delay(uint32_t count)
{
	for(; count!=0; count--);
}

int main(void)
{
	//來到這里是,系統的時鍾已經被配置到72MHz了
	LED_GPIO_Config();
	KEY_GPIO_Config();	//初始化KEY函數
#if 0	//GPIO輸出
	while(1)
	{
		PBout(5) = 1;
		Delay(0xfffff);

		PBout(5) = 0;
		Delay(0xfffff);
		
	}
#else	//GPIO輸入
		while(1)
	{		
			if(PCin(13) == KEY_ON)
			{
				while(PCin(13) == KEY_ON);
				LED_R_TOGGLE;
			}
		
	}
#endif

}

  

  bsp_led.c

//bsp: board support package板機支持包
#include "bsp_led.h"

void LED_GPIO_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStruct;
	
	RCC_APB2PeriphClockCmd(LED_R_GPIO_CLK, ENABLE);
	GPIO_InitStruct.GPIO_Pin = LED_R_GPIO_PIN; 	
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	
	GPIO_Init(LED_R_GPIO_PORT, &GPIO_InitStruct);
}

  

 

  bsp_led.h

//頭文件
#ifndef __bsp_led_h
#define __bsp_led_h

#include "stm32f10x.h"

#define LED_R_GPIO_PIN						GPIO_Pin_5
#define LED_R_GPIO_PORT					GPIOB
#define LED_R_GPIO_CLK						RCC_APB2Periph_GPIOB

//C語言中的二進制運算符
//與1異或改變,與0異或不變

#define LED_R_TOGGLE				{LED_R_GPIO_PORT->ODR ^= LED_R_GPIO_PIN;}
void LED_GPIO_Config(void);
#endif /*__bsp_led._h*/

  

  bsp_key.c

#include "bsp_key.h"
void KEY_GPIO_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStruct;	
	RCC_APB2PeriphClockCmd(KEY2_GPIO_CLK, ENABLE);
	GPIO_InitStruct.GPIO_Pin = KEY2_GPIO_PIN;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_Init(KEY2_GPIO_PORT, &GPIO_InitStruct);
	
}


uint8_t Key_Scan(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
{
	if (GPIO_ReadInputDataBit(GPIOx, GPIO_Pin) == KEY_ON )
	{
		//松手檢測
		while(GPIO_ReadInputDataBit(GPIOx, GPIO_Pin) == KEY_ON);
		return KEY_ON;
	}
	else return KEY_OFF;
}

  

 

  bsp_key.h

#ifndef __bsp_key_h
#define __bsp_key_h

#include "stm32f10x.h"

#define KEY_ON				1
#define KEY_OFF				0

#define KEY2_GPIO_PIN						GPIO_Pin_13
#define KEY2_GPIO_PORT					GPIOC
#define KEY2_GPIO_CLK						RCC_APB2Periph_GPIOC

void KEY_GPIO_Config(void);
uint8_t Key_Scan(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
#endif/*__bsp_key_h*/

 

3. 參考資料

  •   原理圖
  •  

     

  •  

     

  •  

     

  •  

     

      addr & 0xF0000000 是為了區別 SRAM 還是外設,實際效果就是取出 4 或者 2,如果是外設,則

    取出的是 4+0X02000000 之后就等於 0X420000000X42000000 是外設別名區的起始地址。如
    果是 SRAM,則取出的是 2+0X02000000 之后就等於 0X220000000X22000000 SRAM 別名
    區的起始地址

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM