stm32F103 入门篇 14-位带操作-GPIO输入输出

本文介绍了STM32的位带操作,通过位带地址和位序号转换宏实现GPIO的LED控制。代码示例展示了如何使用位带操作控制LED的亮灭,并结合中断检测按键状态,实现简单的交互功能。位带操作在中断场景下确保数据完整性,避免了数据丢失的问题。
摘要由CSDN通过智能技术生成

GPIO->ODR |= 0<<0;

P0 = 0XFE; // 总线操作
sbit LED1 = P0^0; //位操作
LED1 = 0;

位带简介:
在这里插入图片描述
外设位带区
1 AliasAddr= =0x42000000+ (A-0x40000000)84 +n4
SRAM 位带区
1 AliasAddr= =0x22000000+ (A-0x20000000)84 +n
4

“位带地址+位序号”转’换成别名区地址统一成一个宏。
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x02000000+((addr & 0x00FFFFFF)<<5)+(bitnum<<2))

main.c

#include "stm32f10x.h"
#include "bsp_led.h"
#include "bsp_key.h"

#define GPIOA_ODR_Addr	(GPIOA_BASE+0X0C)
#define PAout(n) *(unsigned*)((GPIOA_ODR_Addr & 0xF0000000)+0x02000000+((GPIOA_ODR_Addr & 0x00FFFFFF)<<5)+(n<<2))
 
#define GPIOC_IDR_Addr	(GPIOC_BASE+0X08)
#define PCin(n) *(unsigned*)((GPIOC_IDR_Addr & 0xF0000000)+0x02000000+((GPIOC_IDR_Addr & 0x00FFFFFF)<<5)+(n<<2))


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

int main(void)
{
	//来到这个系统时钟被配置成72M
	LED_GPIO_Config();
	KEY_GPIO_Config();
#if 0	
		while(1)
	{
		//LED_R(OFF);
		//GPIO_SetBits(LED_G_GPIO_PORT, LED_G_GPIO_PIN);
		PAout(8) = 1;
		Delay(0xFFFFF);
		//GPIO_ResetBits(LED_G_GPIO_PORT, LED_G_GPIO_PIN);
		//LED_R(ON);
		PAout(8) = 0;
		Delay(0xFFFFF);
	}
	
#else 
	while(1)
	{
		if( PCin(8) == KEY_ON );
		{
			while(PCin(8) == KEY_ON);
			LED_G_TOGGLE;
		}
	}
	
#endif
	
} 


位带操作不会被中断,避免数据的丢失。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值