1、位带别名区计算公式为:(GPIOA_IDR_ADDR&0xf0000000)+0x02000000+((GPIOA_IDR_ADDR&0x00ffffff)<<5)+(n<<2)
2、位带别名区参考《CM3权威指南CnR2》
3、灯led、按键key与上节学习笔记9类似,就不贴出了。
#include "stm32f10x.h"
#include "led.h"
#include "key.h"
void delay(uint32_t x);
#define GPIOB_ODR_ADDR (GPIOB_BASE+0X0C)
#define GPIOA_IDR_ADDR (GPIOA_BASE+0X08)
#define GPIOC_IDR_ADDR (GPIOC_BASE+0X08)
#define key1 0//按键1是pin0
#define key2 13//按键2是pin13
#define KEY1_in(n) *(unsigned int *)((GPIOA_IDR_ADDR&0xf0000000)+0x02000000+((GPIOA_IDR_ADDR&0x00ffffff)<<5)+(n<<2))//位带操作计算公式
#define KEY2_in(n) *(unsigned int *)((GPIOC_IDR_ADDR&0xf0000000)+0x02000000+((GPIOC_IDR_ADDR&0x00ffffff)<<5)+(n<<2))//位带操作计算公式
#define LED_R_Pin 5
#define LED_G_Pin 0
#define LED_B_Pin 1
#define LED_out(n) *(unsigned int *)((GPIOB_ODR_ADDR&0xf0000000)+0x02000000+((GPIOB_ODR_ADDR&0x00ffffff)<<5)+(n<<2))//位带操作计算公式
int main(void)
{
key_config( 1, 1);//独立按键初始化配置
LED_config( 1,1,1);//led灯初始化配置
while(1)
{
if(KEY1_in(key1))//判断是否有按键1按下
{
LED_out(LED_R_Pin)=LED_ON;//关闭红灯
while(KEY1_in(key1));//松手检测
}
else
{
LED_out(LED_R_Pin)=LED_OFF;//点亮红灯
}
if(KEY2_in(key2))//判断是否有按键2按下
{
LED_out(LED_B_Pin)=LED_ON;
while(KEY2_in(key2));
}
else
{
LED_out(LED_B_Pin)=LED_OFF;
}
}
}