源码基本STM32F103C8T6 MCP2518FD开发板  MCP2518FD_CANFD开发板

习惯了PIC单片机的IO设置,就一个TRISx/PORTx/LATx 三个寄存器就搞定了,但应用到STM32时,调试ds18b20时,要设置IO读了ds18b20的数据,开始就有点蒙,看了规格书,感觉还是有点摸不着头脑,所以狂查资料,并写个笔记。

//IO方向设置
#define DS18B20_IO_IN()        {GPIOA->CRL&=0XFFFFFFF0;GPIOA->CRL|=8<<0;}
#define DS18B20_IO_OUT()    {GPIOA->CRL&=0XFFFFFFF0;GPIOA->CRL|=3<<0;}

现在我要定义到PB6引脚,应该怎么定义呢?

规格书里有说明,STM32 的 IO 口可以通过软件配置成如下 8 种模式:

  • 1   输入浮空
  • 2   输入上拉
  • 3   输入下拉
  • 4   模拟输入
  • 5   开漏输出
  • 6   推挽输出
  • 7   推挽式复用功能
  • 8   开漏复用功能

配置模式由2 个 32 位的端口配置寄存器 CRL 和 CRH,
2 个 32 位的数据寄存器 IDR 和 ODR;
1 个 32 位的置位/复位寄存器BSRR;
一个 16 位的复位寄存器 BRR;
1 个 32 位的锁存寄存器 LCKR;
我们常用的 IO 端口寄存器只有 4 个:CRL、CRH、IDR、ODR。CRL 和 CRH 控制着每个 IO 口的模式及输出速率。

STM32 的 IO 口位配置表如表所示:

STM32 输出模式配置如表 :

下面看端口低配置寄存器 CRL (以PA为例,CRL控制PA0---PA7,CRH控制PA8---PA15)的描述 :

STM32 的 CRL 控制着每组 IO 端口(A~G)的低 8 位的模式。每个 IO 端口占用 CRL 的 4 个位,高两位为 CNF,低两位为 MODE

所以如果我们要控制PA0,可以这样子写:

GPIOA->CRL&=0XFFFFFFF0;

//GPIOA->CRL=GPIOA->CRL & 0b1111 1111 1111 1111 1111 1111 1111 0000;

把PA0设置为输入:

GPIOA->CRL|=8<<0;   // 上拉/下拉输入模式

合起来控制写法:

GPIOA->CRL&=0XFFFFFFF0;GPIOA->CRL|=8<<0;

所以,才有上面的写法:

#define DS18B20_IO_IN()        {GPIOA->CRL&=0XFFFFFFF0;GPIOA->CRL|=8<<0;}

PA0为输入(上/下拉)

GPIOA->CRL&=0XFFFFFFF0;GPIOA->CRL|=8<<0;

PA0为输出(通用推挽输出50MHZ)

GPIOA->CRL&=0XFFFFFFF0;GPIOA->CRL|=3<<0;

PA1为输入(上/下拉) 

GPIOA->CRL&=0XFFFFFF0F;GPIOA->CRL|=8<<4;

PA1为输出(通用推挽输出50MHZ)

GPIOA->CRL&=0XFFFFFF0F;GPIOA->CRL|=3<<4;

PA2为输入(上/下拉)

GPIOA->CRL&=0XFFFFF0FF;GPIOA->CRL|=8<<8;

PA2为输出(通用推挽输出50MHZ)

GPIOA->CRL&=0XFFFFF0FF;GPIOA->CRL|=3<<8;

PA3为输入(上/下拉)

GPIOA->CRL&=0XFFFF0FFF;GPIOA->CRL|=8<<12;

PA3为输出(通用推挽输出50MHZ)

GPIOA->CRL&=0XFFFF0FFF;GPIOA->CRL|=3<<12;

PA4为输入(上/下拉)

GPIOA->CRL&=0XFFF0FFFF;GPIOA->CRL|=8<<16;

PA4为输出(通用推挽输出50MHZ)

GPIOA->CRL&=0XFFF0FFFF;GPIOA->CRL|=3<<16;

PA5为输入(上/下拉)

GPIOA->CRL&=0XFF0FFFFF;GPIOA->CRL|=8<<20;

PA5为输出(通用推挽输出50MHZ)

GPIOA->CRL&=0XFF0FFFFF;GPIOA->CRL|=3<<20;

PA6为输入(上/下拉)

GPIOA->CRL&=0XF0FFFFFF;GPIOA->CRL|=8<<24;

PA6为输出(通用推挽输出50MHZ)

GPIOA->CRL&=0XF0FFFFFF;GPIOA->CRL|=3<<24;

PA7为输入(上/下拉)

GPIOA->CRL&=0X0FFFFFFF;GPIOA->CRL|=8<<28;

PA7为输出(通用推挽输出50MHZ)

GPIOA->CRL&=0X0FFFFFFF;GPIOA->CRL|=3<<28;

下面是CRH寄存器器:

和CRL同样的写法,只不过CRH管理是PA8---PA15 端口。

PA8为输入(上/下拉)

GPIOA->CRH&=0XFFFFFFF0;GPIOA->CRH|=8<<0;

PA8为输出(通用推挽输出50MHZ)

GPIOA->CRH&=0XFFFFFF0F;GPIOA->CRH|=3<<0;

PA9为输入(上/下拉)

GPIOA->CRH&=0XFFFFFF0F;GPIOA->CRH|=8<<4;

PA9为输出(通用推挽输出50MHZ)

GPIOA->CRH&=0XFFFFFF0F;GPIOA->CRH|=3<<4;

PA10为输入(上/下拉)

GPIOA->CRH&=0XFFFFF0FF;GPIOA->CRH|=8<<8;

PA10为输出(通用推挽输出50MHZ)

GPIOA->CRH&=0XFFFFF0FF;GPIOA->CRH|=3<<8;

PA11为输入(上/下拉)

GPIOA->CRH&=0XFFFF0FFF;GPIOA->CRH|=8<<12;

PA11为输出(通用推挽输出50MHZ)

GPIOA->CRH&=0XFFFF0FFF;GPIOA->CRH|=3<<12;

PA12为输入(上/下拉)

GPIOA->CRH&=0XFFF0FFFF;GPIOA->CRH|=8<<16;

PA12为输出(通用推挽输出50MHZ)

GPIOA->CRH&=0XFFF0FFFF;GPIOA->CRH|=3<<16;

PA13为输入(上/下拉)

GPIOA->CRH&=0XFF0FFFFF;GPIOA->CRH|=8<<20;

PA13为输出(通用推挽输出50MHZ)

GPIOA->CRL&=0XFF0FFFFF;GPIOA->CRH|=3<<20;

PA14为输入(上/下拉)

GPIOA->CRH&=0XF0FFFFFF;GPIOA->CRH|=8<<24;

PA14为输出(通用推挽输出50MHZ)

GPIOA->CRH&=0XF0FFFFFF;GPIOA->CRH|=3<<24;

PA15为输入(上/下拉)

GPIOA->CRH&=0X0FFFFFFF;GPIOA->CRH|=8<<28;

PA15为输出(通用推挽输出50MHZ)

GPIOA->CRH&=0X0FFFFFFF;GPIOA->CRH|=3<<28;

如果是对端口C操作,方法同理,只是寄存器要找成GPIOC

GPIOC->CRL&=0XFFFFFFF0;

GPIOx->CRL,这句话表示要操作GPIOx的低8位,就是Px0 ~ Px7
GPIOx->CRH,这句话表示要操作GPIOx的高8位,就是Px8 ~ Px15

所以GPIOC->CRL,这句话表示要操作GPIOC,

后面的0XFFFFFFF0,表示操作PC0;
0XFFFFFF0F,表示操作PC1;
0XFFFFF0FF,表示操作PC2;
0XFFFF0FFF,表示操作PC3;
0XFFF0FFFF,表示操作PC4;
0XFF0FFFFF,表示操作PC5;
0XF0FFFFFF,表示操作PC3;
0X0FFFFFFF,表示操作PC7;

合起来的意思就是:利用“与”运算,把这个位清0,同时不影响其他的位的设置。

GPIOC->CRL|=8<<0;

意思就是将1000左移0位(不移位),然后再与GPIOC->CRL进行“或”运算。

再根据原子的寄存器开发手册可以知道CNF0[10]、MODEO[00],对应的就是设置为上拉/输入模式。

如果要将ds18B20 data引脚分配成 PB6,写法如下:

#define DS18B20_IO_IN()        {GPIOB->CRL&=0XF0FFFFFF;GPIOA->CRL|=8<<24;}
#define DS18B20_IO_OUT()    {
GPIOB->CRL&=0XF0FFFFFF;GPIOA->CRL|=3<<24;}

如何设置STM32 IO端口输入输出相关推荐

  1. STM32工作笔记0010---认识GPIO IO端口

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 GPIO,通用baiI/O端口.在嵌入式系统中,经du常需要控制许多结构简单的外部设zhi备或者电 ...

  2. STM32 IO口设置

    STM32 IO配置 以模拟IIC接口形式举例说明: IO方向设置 //IO方向设置 #define SDA_IN() {GPIOB->CRL&=0X0FFFFFFF;GPIOB-> ...

  3. STM32 IO口的8中配置方式解读(推挽输出、开漏输出、复用开漏输出、复用推挽输出以及上拉输入、下拉输入、浮空输入、模拟)

    转自:http://blog.csdn.net/u010592722/article/details/45746079 STM32  IO口的8中配置方式: (1)GPIO_Mode_AIN 模拟输入 ...

  4. STM32 IO 简介

    STM32 IO 简介 1.IO介绍 2.仿真与下载 1.IO介绍 STM32 的 IO 口可以由软件配置成如下 8 种模式: 1. 输入浮空 2. 输入上拉 3. 输入下拉 4. 模拟输入 5. 开 ...

  5. io端口与ion内存

    木子你妹 博客园 首页 新随笔 联系 管理 订阅 随笔- 109  文章- 12  评论- 8  <摘录>io端口和io内存 linux中的 IO端口映射和IO内存映射 (一)地址的概念 ...

  6. STM32 IO口的八种模式

    [冉冰的成长日记007] STM32 的 IO 口可以由软件配置成如下 8 种模式: 1.输入浮空 2.输入上拉 3.输入下拉 4.模拟输入 5.开漏输出 6.推挽输出 7.推挽式复用功能 8.开漏复 ...

  7. 【linux开发】IO端口和IO内存的区别及分别使用的函数接口

    IO端口和IO内存的区别及分别使用的函数接口 每个外设都是通过读写其寄存器来控制的.外设寄存器也称为I/O端口,通常包括:控制寄存器.状态寄存器和数据寄存器三大类.根据访问外设寄存器的不同方式,可以把 ...

  8. 设定pic单片机端口为输入_PIC单片机IO端口的软件/硬件可靠性使用方法讨论

    本帖最后由 dingzy_2002 于 2016-3-19 11:51 编辑 一.PIC的IO端口设置在普通的高低电平情况下 1.有普通的H/L电平下,硬件设计要注意的是外围输出其最大驱动电流(拉出/ ...

  9. 汇编语言单片机c51基本i/o输入输出实验报告,实验二i-o口输入输出实验报告.doc...

    实验二i-o口输入输出实验报告 单片机实验报告 2 姓名 徐伟彬 学号 1215111035 时间 地点 实验题目 I/O口输入.输出实验 一.实验目的 1. 学习I/O口的使用方法. 2. 学习延时 ...

最新文章

  1. node--非阻塞式I/O,单线程,异步,事件驱动
  2. C++高斯赛德迭代法,求线性方程组的解(version1.0)
  3. 精准扶贫探索新融合模式-农业大健康·李龙:谋定乡村振兴
  4. asp接收ajax乱码_Asp中处理AJAX乱码问题总结
  5. Android官方开发文档Training系列课程中文版:Activity测试之创建功能性测试
  6. lnmp解析php,LNMP之 php解析
  7. 从零开始编写深度学习库(二)FullyconnecteLayer CPU编写
  8. java random array_java復習之Math、Random、Arrays工具類
  9. PCL之在Debian10下配置pcl.1.9.1
  10. 下拉树取值与赋值单元格填报(取值赋值)
  11. rapidxml库生成xml小例子及需注意的问题
  12. R语言书籍学习02 《R语言数据分析、挖掘建模与可视化》-第一章 R语言必备基础知识
  13. 向量代数:向量加法、共线与共面
  14. 1292:宠物小精灵之收服
  15. QQ留言代码,网页QQ留言
  16. 物业智能化管理西方行政学说
  17. Ureport2导出内容加入PDF文件
  18. 使用计算机进行飞机设计属于,利用计算机对飞机、汽车、机械、服装等进行设计、绘图属于()。...
  19. jquery-210812-05---jquery函数02
  20. Qt 画图工具擦除操作,恢复透明色

热门文章

  1. 【原创】关于noot的学习笔记
  2. ps技巧:从黑白图片中创建蒙版
  3. hardware 中的几个地址问题
  4. jQuery 搜索条件联合查询 (数组条件查询)
  5. vue 前端生成二维码,并转换为图片
  6. python能安装在d盘吗_python必须要装到C盘吗 d盘 e盘不行吗
  7. [附源码]Node.js计算机毕业设计高校心理咨询管理系统Express
  8. 稳压、调压、监控、DC/DC电路大全
  9. 俯仰角,赤经赤纬,望远镜
  10. 游戏语音聊天系统完美运营源码,附详尽视频教程