、概念

该部分代码在 sys.h 文件中,实现对 STM32 各个 IO 口的位操作,包括读入和输出。当然在这些函数调用之前,必须先进行 IO 口时钟的使能和 IO 口功能定义。此部分仅仅对 IO 口进
行输入输出读取和控制。 位带操作简单的说,就是把每个比特膨胀为一个 32 位的字,当访问这些字的时候就达到了 访问比特的目的,比如说 BSRR 寄存器有 32 个位,那么可以映射到 32 个地址上,我们去访问 这 32 个地址就达到访问 32 个比特的目的。这样我们往某个地址写 1 就达到往对应比特位写 1 的目的,同样往某个地址写 0 就达到往对应的比特位写 0 的目的。

二、代码

sys.h 中位带操作的定义。
代码如下:

#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((
addr &0xFFFFF)<<5)+(bitnum<<2))
#define MEM_ADDR(addr) *((volatile unsigned long *)(addr))
#define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))
//IO 口地址映射
#define GPIOA_ODR_Addr (GPIOA_BASE+12) //0x4001080C
#define GPIOB_ODR_Addr (GPIOB_BASE+12) //0x40010C0C
#define GPIOC_ODR_Addr (GPIOC_BASE+12) //0x4001100C
#define GPIOD_ODR_Addr (GPIOD_BASE+12) //0x4001140C
#define GPIOE_ODR_Addr (GPIOE_BASE+12) //0x4001180C
#define GPIOF_ODR_Addr (GPIOF_BASE+12) //0x40011A0C
#define GPIOG_ODR_Addr (GPIOG_BASE+12) //0x40011E0C
#define GPIOA_IDR_Addr (GPIOA_BASE+8) //0x40010808
#define GPIOB_IDR_Addr (GPIOB_BASE+8) //0x40010C08
#define GPIOC_IDR_Addr (GPIOC_BASE+8) //0x40011008
#define GPIOD_IDR_Addr (GPIOD_BASE+8) //0x40011408
#define GPIOE_IDR_Addr (GPIOE_BASE+8) //0x40011808
#define GPIOF_IDR_Addr (GPIOF_BASE+8) //0x40011A08
#define GPIOG_IDR_Addr (GPIOG_BASE+8) //0x40011E08
//IO 口操作,只对单一的 IO 口!
//确保 n 的值小于 16!
#define PAout(n) BIT_ADDR(GPIOA_ODR_Addr,n) //输出
#define PAin(n) BIT_ADDR(GPIOA_IDR_Addr,n) //输入
#define PBout(n) BIT_ADDR(GPIOB_ODR_Addr,n) //输出
#define PBin(n) BIT_ADDR(GPIOB_IDR_Addr,n) //输入
#define PCout(n) BIT_ADDR(GPIOC_ODR_Addr,n) //输出
ALIENTEK MiniSTM32 V3.0 开发板教程
114
STM32 不完全手册(库函数版)
#define PCin(n) BIT_ADDR(GPIOC_IDR_Addr,n) //输入
#define PDout(n) BIT_ADDR(GPIOD_ODR_Addr,n) //输出
#define PDin(n) BIT_ADDR(GPIOD_IDR_Addr,n) //输入
#define PEout(n) BIT_ADDR(GPIOE_ODR_Addr,n) //输出
#define PEin(n) BIT_ADDR(GPIOE_IDR_Addr,n) //输入
#define PFout(n) BIT_ADDR(GPIOF_ODR_Addr,n) //输出
#define PFin(n) BIT_ADDR(GPIOF_IDR_Addr,n) //输入
#define PGout(n) BIT_ADDR(GPIOG_ODR_Addr,n) //输出
#define PGin(n) BIT_ADDR(GPIOG_IDR_Addr,n) //输入
以上代码的便是 GPIO 位带操作的具体实现,位带操作的详细说明,在权威指南中有详细讲解,请参考 <<CM3 权威指南 >> 第五章 (87 页 ~92 页 ) 。比如说,我们调用 PAout(1)=1 是设置了
GPIOA 的第一个管脚 GPIOA.1 为 1 ,实际是设置了寄存器 ODR 的某个位,但是我们的定义中可以跟踪过去看到却是通过计算访问了一个地址。上面一系列公式也就是计算 GPIO 的某个 io
口对应的位带区的地址了。有了上面的代码,我们就可以像 51/AVR 一样操作 STM32 的 IO 口了。比如,我要 PORTA 的第七个 IO 口输出 1 ,则可以使用 PAout ( 6 ) =1 ;即可实现。我要判断 PORTA 的第 15 个位 是否等于 1 ,则可以使用 if ( PAin ( 14 ) ==1 )…;就可以了。
这里顺便说一下,在 sys.h 中的还有个全局宏定义:
//0,不支持 ucos 1,支持 ucos
#define SYSTEM_SUPPORT_OS 0 //定义系统文件夹是否支持 UCOS

IO 口的位操作实现相关推荐

  1. I/0口输入输出实验 学习IO口的位操作方法,分别选择P0、P1、P2、P3端口中的某一位,该位作为输出使用,连接一只发光二极管,控制器闪烁。

    学习IO口的位操作方法,分别选择P0.P1.P2.P3端口中的某一位,该位作为输出使用,连接一只发光二极管,控制器闪烁. 程序: #include<reg51.h> sbit KEY=P1 ...

  2. 【转载】瑞萨CS+ for CC对单片机IO口进行位操作

    出处:https://www.sekorm.com/news/25653139.html 瑞萨科技是世界十大半导体芯片供应商之一,在汽车领域的MCU市场份额更是排在最前列.近日笔者碰到刚接手瑞萨MCU ...

  3. 51单片机STC89C52点亮一个LED(IO口的位操作)

    51单片机点亮一个LED(IO口的位操作)STC89C52 程序源码 /*-----------------------包含头文件区域-------------------------*/ #incl ...

  4. c语言 不同的io口组成数组,本章内容并行IO口电路结构认识C语言C语言基本语句C语.ppt...

    本章内容并行IO口电路结构认识C语言C语言基本语句C语 并行I/O口电路结构 P0口的结构 P0口的结构 P0口的结构 P1口的结构 P1口的结构 P2口的结构 P2口的结构 P3口的结构 P3口的结 ...

  5. 51单片机开发入门(3)-IO口应用

    前言 根据前面对51单片机的了解和基础理论知识的掌握,接下来就正式进入单片机开发--实践.引用最近几天追的电视剧<觉醒年代>里新文化领袖陈独秀.李大钊等革命前辈们一直在说的和在践行的马克思 ...

  6. 树莓派底层IO驱动开发示例(一个简单io口驱动的开发)

    一.驱动代码的开发 1.树莓派寄存器的介绍 点击查看:树莓派(bcm2835芯片手册) GPFSEL0 GPIO Function Select 0: 功能选择 输入/输出 GPSET0 GPIO P ...

  7. c语言io口置1,AVR_C语言编程的小技巧-IO口置位.doc

    AVR C语言编程的小技巧-IO口置位 给单片机IO口置位是编程用的比较多的操作,这是我在学习C语言编程中的一点小小心得,希望大家觉得有用!AVR 单片机的IO口是标准的双向端口,首先要设置IO口的状 ...

  8. 2、SONIX单片机IO口基本操作

    IO口基本操作,sonix单片机每个IO口都有两个钳位保护二极管 一.IO口方向设置寄存器PnM,n代表0-5组IO口 BIT7 BIT6 BIT5 BIT4 BIT3 BIT2 BIT1 BIT0 ...

  9. STM32笔记 GPIO介绍及IO口操作 STM32F0 利用C语言位域实现仿位带操作

    文章目录 GPIO简介 工作方式 相关寄存器介绍 IO 操作步骤 IO口三种操作细解 附录:C语言相关 偏移地址与绝对地址 GPIO简介 GPIO:每个连接到I/O总线上的设备都有自己的I/O地址集, ...

最新文章

  1. 回应关于《BCH五月硬分叉是伪需求》的疑问
  2. Unity 2D游戏开发教程之精灵的死亡和重生
  3. Mac OS Terminal 几个快捷键
  4. Linux系统检测命令有哪些
  5. list修改元素的值_第115天:Python 到底是值传递还是引用传递
  6. java 内存泄漏_Java开发者必须知道的内存泄漏问题
  7. python多进程的使用方法
  8. 第三次学JAVA再学不好就吃翔(part35)--多态向上转型和向下转型
  9. python 打包exe thread报错_pyinstaller 打包exe 遇到的坑
  10. 计算机应用基础形考作业3Excel,国家开放大学《计算机应用基础》考试与答案形考任务模块3 模块3 Excel 电子表格系统—客观题答案(2020年整理).pptx...
  11. 还在4S店买车?《Boss1+1》张朝阳对话贾鸣镝“种草”购车新方式
  12. 到底什么是 ROI Pooling Layer ???
  13. VMware 虚拟机如何连接网络,且远程可连接
  14. Javascript对象扩展 - JsPoint类
  15. ​专科生学习云计算就业前景如何?
  16. PHP中的PEAR是什么?
  17. VR全景有什么应用,和传统摄影的区别,发展前景如何?
  18. 小米总监汇总的几点软件测试方法~
  19. wps将批量数字转换成条形码_excel表格怎么把数据转换条形码-WPS表格中怎么把数字还原成条形码,本来是条形码的。...
  20. WPS JS宏示例——工作表排序

热门文章

  1. 一个逐渐完善的万能table(一)
  2. igraph的layout布局
  3. android反编译apk常用工具
  4. 产品经理知识体系:6.如何做好产品运营?
  5. MFC-局域网聊天工具bug集锦
  6. Octopus FS 论文阅读 (一)
  7. centos7解压.tar.bz2,.tar.gz,.tar.xz文件
  8. DOTween Ease曲线
  9. 李翊 先吞噬后反刍,擒贼擒王--java之我注六经之二
  10. 105,106数学思维