STM32-(06):位绑定的基础应用

发布者:Serendipity66最新更新时间:2019-08-12 来源: eefocus关键字:STM32  位绑定  基础应用 手机看文章 扫描二维码
随时随地手机看文章

通过位绑定来快速实现位操作。


这些区域可以进行位绑定

SRAM区:0x2000 0000 ~ 0x200f ffff 1M

公式:A的范围(0x2000 0000 ~ 0x200f ffff) n的范围(0~7),表示第几位 ,AliasAddr表示位绑定的地址

AliasAddr = 0x22000000 + ((A-0x20000000)*8 + n)*4

     = 0x22000000 + (A-0x20000000)32 + n4

     

片上外设:0x4000 0000 ~ 0x400f ffff 1M

公式:A的范围(0x4000 0000 ~ 0x400f ffff) n的范围(0~7),表示第几位,AliasAddr表示位绑定的地址

AliasAddr = 0x42000000 + ((A-0x40000000)*8 + n)*4

     = 0x42000000 + (A-0x40000000)32 + n4

     

拿如下一小段代码举例:


if((GPIOA->IDR & 0x0800) == 0x0800) GPIOA->ODR = GPIOA->ODR | 0x08;

else GPIOA->ODR = GPIOA->ODR & (~0x08);


首先看GPIOA->ODR的地址是多少

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

GPIOA_ODR:

A = GPIO_ODR的地址= GPIOA_BASE+ODR偏移地址 = GPIOA_BASE+0x0C (0Ch中的h表示16进制)

n = 3 (0x08表示操作的是第三位)


GPIOA_IDR:(地址查询方法同ODR)

A = GPIO_ODR的地址= GPIOA_BASE+ODR偏移地址 = GPIOA_BASE+0x09 (0Ch中的h表示16进制)

n = 3 (0x0800表示操作的同样是第三位,范围0-7)


int  main(void)

{

//ODR 和 IDR 这里属于片内外设

//ODR的地址:即A=(0x4000000 + 0x10000 + 0x0800 + 0x0c)= 0x4001080c   n=3

u32 *PAO3 = (u32*)(0x42000000 + (0x4001080c - 0x40000000)*32 + 3*4)   //PAO3表示GPIOA输出第3位

//IDR的地址:即A=(0x4000000 + 0x10000 + 0x0800 + 0x09)= 0x40010809   n=3

u32 *PAI11 = (u32*)(0x42000000 + (0x40010809 - 0x40000000)*32 + 3*4)   //PAI11表示GPIOA输入第11位

//或者:u32 *PAI11 = (u32*)(0x42000000 + (0x40010808 - 0x40000000)*32 + 11*4)


// 1、PA.0 ~ PA.7 输出、50Mhz   PA.8 ~ PA.15 输入(PA.0用到CRL, PA.8用到CRH)

GPIOA->CRL = 0x33333333; //PA.0 ~ PA.7 输出、50Mhz

GPIOA->CRL = 0x44444444; //PA.8 ~ PA.15 输入(选择浮空输入,因为模拟输入与复用输入不经过输入数据寄存器)

// 2、PA.8 ~ PA.15 引脚输入状态影响PA.0 ~ PA.7 引脚输出状态

while(1)

{

//if((GPIOA->IDR & 0x0800) == 0x0800) GPIOA->ODR = GPIOA->ODR | 0x08;

//else GPIOA->ODR = GPIOA->ODR & (~0x08);

//简化为:

if(*PAI11 == 1) *PAO3 = 1; //写1直接置1

else *PAO3 = 0; //清零直接置0

}

return(1);

}



继续简化:

1.定义地址

2.定义公式


#define GPIOA_ODR_A (GPIOA_BASE+0x0C)

#define GPIOA_IDR_A (GPIOA_BASE+0x08)

#define GPIOA_ODR_B (GPIOB_BASE+0x0C)

#define GPIOA_IDR_B (GPIOB_BASE+0x08)

#define GPIOA_ODR_C (GPIOC_BASE+0x0C)

#define GPIOA_IDR_C (GPIOC_BASE+0x08)

#define GPIOA_ODR_D (GPIOD_BASE+0x0C)

#define GPIOA_IDR_D (GPIOD_BASE+0x08)

#define GPIOA_ODR_E (GPIOE_BASE+0x0C)

#define GPIOA_IDR_E (GPIOE_BASE+0x08)


//0x22000000 + (A-0x20000000)*32 + n*4

//0x42000000 + (A-0x40000000)*32 + n*4

//合并为 ((A&0xF0000000) +0x2000000+ ((A&0xfffff)*32) + n*4)

#define BitBand(Addr,BitNum) * ((volatile unsigned long *)((Addr&0xF0000000) +0x2000000+ ((Addr&0xfffff)<<5) + BitNum*<<2))

#define PAout(n) BitBand(GPIOA_ODR_A,n)

#define PAin(n) BitBand(GPIOA_IDR_A,n)


int  main(void)

{

// 1、PA.0 ~ PA.7 输出、50Mhz   PA.8 ~ PA.15 输入(PA.0用到CRL, PA.8用到CRH)

GPIOA->CRL = 0x33333333; //PA.0 ~ PA.7 输出、50Mhz

GPIOA->CRL = 0x44444444; //PA.8 ~ PA.15 输入(选择浮空输入,因为模拟输入与复用输入不经过输入数据寄存器)

// 2、PA.8 ~ PA.15 引脚输入状态影响PA.0 ~ PA.7 引脚输出状态

while(1)

{

//if((GPIOA->IDR & 0x0800) == 0x0800) GPIOA->ODR = GPIOA->ODR | 0x08;

//else GPIOA->ODR = GPIOA->ODR & (~0x08);

//简化为:

//if(*PAI11 == 1) *PAO3 = 1; //写1直接置1

//else *PAO3 = 0; //清零直接置0

//再简化为:

if(PAin(11) == 1) PAout(3) = 1; //写1直接置1

else PAout(3)  = 0; //清零直接置0

}

return(1);

}


关键字:STM32  位绑定  基础应用 引用地址:STM32-(06):位绑定的基础应用

上一篇:STM32-(05):GPIO原理与操作
下一篇:STM32-(07):串行通信基础(164芯片)

推荐阅读最新更新时间:2024-11-02 08:08

STM32的printf函数重定向
在前面学习了STM32的串口编程,通过USART1向计算机的串口调试助手打印数据,或者接收计算机串口调试助手的数据,接下来我们可以实现STM32工程上的printf()函数了,方便用于程序开发中调试信息的打印。 1. 法1:使用MicroLIB库 1.1 KEIL-MDK中的Use MicroLIB选项 在MDK开发环境中, MicroLib是缺省c库的备选库,它可装入少量内存中,与嵌入式应用程序配合使用,且这些应用程序不在操作系统中运行。 MicroLib进行了高度优化以使代码变得很小,功能比缺省c库少,不具备某些ISO c特性,部分库函数的运行速度也比较慢,如内存拷贝函数memcpy()。 MicroLib与缺省c库之间
[单片机]
stm32案例分享之使D-CACHE时FMC外设运行不正常原因
前言 前段时间某客户反馈,在使用STM32H7的FMC时,如果使能了D-CACHE就运行不正常。数据没有写到FMC外部的存储器里,FMC接口也没有波形。而不使能D-CACHE是工作则是正常的。 其实对于这个问题,如果了解STM32H7的架构的话,就很容易理解了。下面我们就来看一看到底是什么原因让客户觉得使能DCACHE后FMC就工作不正常了。 STM32H7的架构 下面是STM32H7架构图中和FMC相关的部分。从图中可以看到,STM32H7是基于Cortex-M7内核,在内部的Cortex-M7内核里带有一个16KB的D-CACHE和一个16KB的I-CACHE。内核通过AXIM总线连接到64位的AXI总线矩阵,再经过这
[单片机]
<font color='red'>stm32</font>案例分享之使D-CACHE时FMC外设运行不正常原因
STM32 GPIO入门学习
今天下午开始学习STM32的GPIO控制,开始以为跟AVR单片机一样,只是设置方向寄存器跟引脚寄存器,一排引脚由8位变16位而已,谁知道一看资料才发现居然还有IO口状态设置,设置速度设置 不过还好,使用的是STM32的FWLib3.0软件包,里面的GPIO口函数都做好了,只要看一下使用就可以了。 先看一些网上跟书上找到的资料跟自己总结的咚咚: 1.STM32每个GPI/O 端口有两个32 位配置寄存器(GPIOx_CRL,GPIOx_CRH),两个32位数据寄存器(GPIOx_IDR,GPIOx_ODR),一个32 位置位/复位寄存器(GPIOx_BSRR),一个16 位复位寄存器(GPIOx_BRR)和一个32 位锁定寄存
[单片机]
打造新一代智能电子产品 ST正式加入ARM mbed项目
近日,ARM®与意法半导体(STMicroelectronics, 以下简称ST) 共同宣布,ST已正式加入ARM mbed™项目。该项合作将允许开发者在使用ST基于ARM Cortex®-M系列处理器STM32微控制器系列产品进行开发的同时,自由获取mbed软件、开发工具及在线合作平台,帮助他们实现打造新一代智能电子产品的愿景。 ARM mbed是一项专为支持物联网发展、满足新一代专业开发者需求而设立的产业合作项目。它提供免费开发工具与基础开源软硬件元件,帮助迅速开发基于ARM架构的创新设备。与此同时,该项目能将连接器、传感器与云端服务软件组件及工具更轻松地加以整合,为开发商和合作伙伴打造一个动态的、合作的生态系统。 S
[单片机]
HC-SR505红外感应模块驱动(STM32
一、前期准备 单片机:STM32F103ZET6 开发环境:MDK5.14 库函数:标准库V3.5 HC-SR505红外感应模块:淘宝有售 二、实验效果 三、驱动原理 这个模块比较简单,当有人靠近时候其IO输出3.3V,STM32可以直接采集。 需要完整工程或者有问题的请加QQ:1002521871,验证:呵呵。 四、驱动代码 HC_SR505.h #ifndef __HC_SR505_H__ #define __HC_SR505_H__ #include stm32f10x.h #include gpio.h #define HC_SR505 PAin(0) #define HC_SR505_
[单片机]
HC-SR505红外感应模块驱动(<font color='red'>STM32</font>)
STM32不同型号芯片的程序移植
1、启动文件改成对应容量的。 2、Device里面选择芯片对应的型号 3、C/C++中的Preprocessor Symbols中的FLSAH改为适合你处理器的大小 4、把Programming Algorithm 中的FLASH容量选择适合自己处理器大小的
[单片机]
<font color='red'>STM32</font>不同型号芯片的程序移植
STM32串口蓝牙实验--蓝牙控制小灯
用的正点原子的串口模板 V3接线 效果,可以控制PB5开关 #include led.h #include delay.h #include key.h #include sys.h #include usart.h int main(void) { delay_init(); //延时函数初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 uart_init(9600); //串口初始化为115200 LED_Init(); //LED端口初始化 KE
[单片机]
<font color='red'>STM32</font>串口蓝牙实验--蓝牙控制小灯
基于STM32单片机的数据记录装置设计
  引言   本文针对电动汽车研究的实际需求,设计一款数据记录装置,该数据记录装置是搭建在电池能量管理系统基础上的,通过与能量管理系统通信,记录电动汽车实际运行时电池的外部状态(如:电池电压、电流、温度等),一方面为了研究电池的工作特性,另一方面为了对能量管理系统的工作情况做验证,为电动汽车动力电池的理论研究提供数据支持。   1 系统总体设计   本数据记录装置的设计包括硬件设计与软件设计两方面,软件设计主要包括数据接收的编程以及数据存储的编程,而硬件设计主要有几个方面:主控芯片的选择、复位功能的实现、电源模块、实时时钟、通信模块以及SD卡连接等。主控芯片是控制系统的核心,它内部所集成的模块越多,就能省去更多的外部电路,使
[单片机]
基于<font color='red'>STM32</font>单片机的数据记录装置设计
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved