IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> STM32入门(十)----位带操作(GPIO的输入和输出) -> 正文阅读

[嵌入式]STM32入门(十)----位带操作(GPIO的输入和输出)

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

参考资料:《Cortex-M3权威指南》第五章的位带操作
理解比特的膨胀对应关系。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
外设位带区与外设位带别名区的地址转换:
AliasAddr=0x4200 0000+(A-0x4000 0000)32+n4;
SRAM位带区与SRAM位带别名区的地址转换:
AliasAddr=0x2200 0000+(A-0x2000 0000)32+n4;

A:表示我们要操作的那个位所在的寄存器的地址;
n:位号

每一个字节都膨胀为一个字(4个字节)

((addr&0xF000 0000)+0x0200 0000+((addr&0x00FF FFFF)<<5)+(bitnum)<<2)
addr:要操作的位所在寄存器的地址
bitnum:位号,即在寄存器的第几位

key.h
#ifndef __KEY_H
#define __KEY_H
#include "stm32f10x.h"
#include "delay.h"
#define KEY_0_GPIO_PIN   GPIO_Pin_4
#define KEY_0_GPIO_PORT  GPIOE
#define KEY_0_GPIO_CLK   RCC_APB2Periph_GPIOE

#define KEY_1_GPIO_PIN   GPIO_Pin_3
#define KEY_1_GPIO_PORT  GPIOE
#define KEY_1_GPIO_CLK   RCC_APB2Periph_GPIOE

#define KEY_UP_GPIO_PIN   GPIO_Pin_0
#define KEY_UP_GPIO_PORT  GPIOA
#define KEY_UP_GPIO_CLK   RCC_APB2Periph_GPIOA

//KEY的键值 0为按下 1为没按
#define KEY0 PEin(4)
#define KEY1 PEin(3)
#define KEY_UP PAin(0)
//用来判断按下了哪一个按键
#define KEY0_PRES 1
#define KEY1_PRES 2
#define KEY_UP_PRES 3

#define GPIOE_ODR_Addr (GPIOE_BASE+0x08)
#define PEin(n)  *(u32 *)((GPIOE_ODR_Addr&0xF0000000)+0x02000000+((GPIOE_ODR_Addr&0x00FFFFFF)<<5)+(n<<2))

#define GPIOA_ODR_Addr (GPIOA_BASE+0x08)
#define PAin(n)  *(u32 *)((GPIOA_ODR_Addr&0xF0000000)+0x02000000+((GPIOA_ODR_Addr&0x00FFFFFF)<<5)+(n<<2))

//按键初始化配置
void Key_GPIO_Config(void);

//按键扫描
uint8_t Key_Scan(void);
#endif

GPIO输入:

#define GPIOE_ODR_Addr (GPIOE_BASE+0x08)
#define PEin(n)  *(u32 *)((GPIOE_ODR_Addr&0xF0000000)+0x02000000+((GPIOE_ODR_Addr&0x00FFFFFF)<<5)+(n<<2))

是参考((addr&0xF000 0000)+0x0200 0000+((addr&0x00FF FFFF)<<5)+(bitnum)<<2)得到的。

#define KEY0 PEin(4)

是GPIO输入的位带操作的应用,可以通过判断KEY0的值来得到按键的状态。

main.c
#include "stm32f10x.h"
#include "bsp_led.h"
#include "key.h"
#include "delay.h"
#define GPIOB_ODR_Addr (GPIOB_BASE+0x0c)
#define PBout(n)  *(u32 *)((GPIOB_ODR_Addr&0xF0000000)+0x02000000+((GPIOB_ODR_Addr&0x00FFFFFF)<<5)+(n<<2))
int main(void)
{
	uint8_t a;
	LED_GPIO_Config();
	Key_GPIO_Config();
	delay_init();
	LED_0(OFF);
	LED_1(OFF);
	
	#if 0
	while(1)
	{
		//LED_0(ON);
		PBout(5)=0;
		delay_ms(500);
		//LED_0(OFF);
		PBout(5)=1;
		delay_ms(500);
	}
	#else
	while(1)
	{
		a=Key_Scan();
		if(a!=0)
		{
			if(a==1){LED_0_TOGGLE;}
			else if(a==2){LED_1_TOGGLE;}
			else if(a==3){LED_0_TOGGLE;LED_1_TOGGLE;}
		}
	}
	#endif
}


GPIO输出:

#define GPIOB_ODR_Addr (GPIOB_BASE+0x0c)
#define PBout(n)  *(u32 *)((GPIOB_ODR_Addr&0xF0000000)+0x02000000+((GPIOB_ODR_Addr&0x00FFFFFF)<<5)+(n<<2))
PBout(5)=0;

是GPIO输出的位带操作的应用,可以直接通过它来赋值。

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-07-14 11:05:27  更:2021-07-14 11:05:55 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 19:30:30-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码