GPIOC->ODR |=(0<<2);  // 总线操作,即操作整个寄存器.

在51单片机中

P0=0xFE;   //总线操作.

sbit LED1=P0^0;  //位操作,即操作寄存器中的某一位.

LED1 =0;

在STM32中并没有sbit这样的关键字.但是我们可以用位带操作实现位操作.

位带操作

在 STM32 中,有两个地方实现了位带,一个是 SRAM 区(存放代码)的最低 1MB 空间,令一个是外设区最低 1MB 空间。这两个 1MB 的空间除了可以像正常的 RAM 一样操作外,他们还有自己的位带别名区,位带别名区把这 1MB 的空间的每一个位膨胀成一个 32 位的字(4个字节),当访问位带别名区的这些字时,就可以达到访问位带区某个比特位的目的.

位带操作的公式

外设位带区与外设位带别名区的地址转换:    AlisaAddr=0x42000000+(A-0x40000000)*8*4+n*4

SRAM位带区与SRAM位带别名区地址转换:  AlisaAddr=0x22000000+(A-0x20000000)*8*4+n*4

其中:A:表示操作的那个位寄存器所在的寄存器地址

n:位号(第几位)

对上面式子的解释:

AlisaAddr=位带别名区基地址+(寄存器地址-寄存器基地址)[偏移多少个字节]*8[一个字节8位]*4[每个位膨胀4个字节] [这是第0位]+n*4[第n个位膨胀的字节说]

理解要点:位带区的一个位在位带别名区膨胀位4个字节

位带操作的总公式

AlisaAddr =((addr&0xF0000000)+0x02000000+((addr&0x00FFFFFF)<<5)+(bitnum<<2))

其中:addr:要操作的寄存器地址.(寄存器映射表中,每个外设地址+偏移地址)

bitnum:位号,即寄存器的第几位

对上面式子的解释:   addr&0xF0000000:为了取出4和2,用来区分是外设还是SRAM.然后+0x20000000就等于外设/SRAM位带别名区的起始地址

add&0x00FFFFFF0x00FFFFFF:屏蔽掉高2位,外设位带区的高地址位0x4010 0000,SRAM的位带区高地址为0x2010 0000, (0x4010 0000 –0x40000000) 和(0x2010 0000-0x200000)在求偏移地址相减的时候只要第四位有效,所以就把剩下的高两位屏蔽掉,剩下的6位与F相与即可.

点亮LED的源码

我们在上次的代码中继续添加:

main为:

#include "stm32f10x.h"   // 相当于51单片机中的  #include <reg51.h>
#include "bsp_led.h"
#include "bsp_key.h" #define SOFT_DELAY Delay(0x0FFFFF);
//void Delay(__IO u32 nCount); #define GPIOC_ODR_Addr (GPIOC_BASE+0x0C)
#define PCout(bitnum) *(unsigned int *)((GPIOC_ODR_Addr&0xF0000000)+0x02000000+((GPIOC_ODR_Addr &0x00FFFFFF)<<5)+(bitnum<<2)) #define GPIOC_IDR_Addr (GPIOC_BASE+0x08)
#define PCIn(bitnum) *(unsigned int *)((GPIOC_IDR_Addr&0xF0000000)+0x02000000+((GPIOC_IDR_Addr &0x00FFFFFF)<<5)+(bitnum<<2))
void Delay( uint32_t count){
for( ;count!=0;count--); } int main(void)
{
// 来到这里的时候,系统的时钟已经被配置成72M。
LED_GPIO_Config();
LED_OFF;
KEY_LED_Config();
while(1){
if(PCIn(13)==KEY_ON){
while(PCIn(13)==KEY_ON)
; LED_TOGGLE; } } }

位带操作—GPIO输出和输入的更多相关文章

  1. 玩转X-CTR100 | STM32F4 l GPIO位带操作

    更多塔克创新资讯欢迎登陆[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ]       STM32F4位带概念,及位带的GPIO操作实践应用. 原理介 ...

  2. 玩转X-CTR100 l STM32F4 l 基础例程printf、LED、蜂鸣器、拨码开关、位带操作

    我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ]      本文介绍X-CTR100控制器基础板载资源 ...

  3. STM32之GPIO端口位带操作

    #ifndef __SYS_H #define __SYS_H #include "stm32f10x.h" //位带操作 //把“位带地址+位序号”转换别名地址宏 #define ...

  4. 第13章 GPIO—位带操作

    第13章     GPIO—位带操作 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fire ...

  5. (stm32学习总结)—GPIO位带操作

    本章参考资料:<STM32F10X-中文参考手册>存储器和总线构架章节.GPIO 章节,<CM3 权威指南 CnR2>存储器系统章节. 位带简介 位操作就是可以单独的对一个比特 ...

  6. GPIO—位带操作

    GPIO—位带操作本章参考资料:< STM32F4xx 中文参考手册>存储器和总线构架章节. GPIO 章节,< Cortex®-M4 内核编程手册> 2.2.5 Bit-ba ...

  7. 关于STM32位带操作随笔

    以前在学习STM32时候关注过STM32的位带操作,那时候只是知道位带是啥,用来干嘛用,说句心里话,并没有深入去学习,知其然而不知其所以然.但一直在心中存在疑惑,故今日便仔细看了一下,写下心得供日后参 ...

  8. 东芝MCU实现位带操作

    位带操作简介 位带操作的概念其实30年前就有了,那还是 8051单片机开创的先河,如今ARM CM3 将此能力进化,可以说,这里的位带操作是8051 位寻址区的威力大幅加强版.即如果要改写某个寄存器的 ...

  9. STM32位带操作总结---浅显易懂

    正在准备做毕业设计,配置LED_Config()的时候,又看到了位带操作的宏定义,我又嘀咕了,什么是位带操作,一年前在使用位带操作的时候,就查阅过好多资料,Core-M3也看过,但是对于博主这种“低能 ...

随机推荐

  1. 怎么新开一个组件并且配置路由?vue-cli

    首先要明白: 路由就是url路径,如果一个组件被引入到了另外一个组件,这个页面就包含这个组件了,所以这个被包含的组件不要去路由哪里配置了 第一步: 先写上想要添加的组件 2.组件的内容 3.路由的配置 ...

  2. AHOI2012树屋阶梯

    这玩意不是卡特兰的经典模型吗…… 我们设方案数为f(i),则f(0)=1,f(1)=1,f(2)=2,f(3)=5,(其实到这里你再手模一个就出来了)我们把左上角的矩形删掉,则会变成下方和右方两个更小 ...

  3. 深入理解JVM虚拟机5:虚拟机字节码执行引擎

    虚拟机字节码执行引擎   转自https://juejin.im/post/5abc97ff518825556a727e66 所谓的「虚拟机字节码执行引擎」其实就是 JVM 根据 Class 文件中给 ...

  4. NSCTF 2017-pwn2

    目录 程序基本信息 程序漏洞 整体思路 exp脚本 发现的问题 内容参考 程序基本信息 32位动态链接程序,开启了数据段不可执行以及栈溢出保护 程序漏洞 在函数中sub_80487fa中有一个格式化字 ...

  5. java集合类型源码解析之ArrayList

    前言 作为一个老码农,不仅要谈架构.谈并发,也不能忘记最基础的语言和数据结构,因此特开辟这个系列的文章,争取每个月写1~2篇关于java基础知识的文章,以温故而知新. 如无特别之处,这个系列文章所使用 ...

  6. ArcGIS10.3_解决属性表中文乱码问题

    借鉴前辈们解决ArcMap低版本属性表乱码的问题解决方法,勇敢的尝试了一下Pro中的解决方法,其实道理都一样.先来看看第一种方法:打开CMD,如果是ArcMap,输入如下命令: reg add HKE ...

  7. 神经网络模型(Backbone)

    自己搭建神经网络时,一般都采用已有的网络模型,在其基础上进行修改.从2012年的AlexNet出现,如今已经出现许多优秀的网络模型,如下图所示. 主要有三个发展方向: Deeper:网络层数更深,代表 ...

  8. Ionic4.x 中的 UI 组件(UI Components)表单相关组件

    1.ion-input 单行文本框 2.ion-toggle 开关 3.ion-radio-group.ion-radio 单选按钮组 4.ion-checkbox 多选按钮组 5.ion-selec ...

  9. 阶段5 3.微服务项目【学成在线】_day07 课程管理实战_03-新增课程-课程分类查询

    2 新增课程 2.1 需求分析 用户操作流程如下: 1.用户进入“我的课程”页面,点击“新增课程”,进入新增课程页面 2.填写课程信息,选择课程分类.课程等级.学习模式等. 3.信息填写完毕,点击“提 ...

  10. 【407】C函数中的指针

    注意:如果对于函数中指针参数的对应值进行修改,当调用该函数后,实参会被修改,所以如果不想要实参被修改,需要为函数的形参定义一个 str_copy 的量,通过 strcpy() 进行将字符串复制给 st ...