STM32学习笔记之DS18B20

发布者:小星星龙猫最新更新时间:2016-10-17 来源: eefocus关键字:STM32  DS18B20 手机看文章 扫描二维码
随时随地手机看文章
我买得STM32开发小板儿上的外设实在少,连个数码管都没有,显示都得通过串口在超级终端上完成。我又特别懒,就挑了个比较方便的器件DS18B20来玩儿。

DS18B20应该说是学习嵌入式开发的入门级的器件,也是各种开发板的标准配置。因为它所需附加器件少(最多需要一个几K的电阻),而且操作简单方便(主要是IO口的控制时序),非常适合初学者练手。虽然之前学过8位机,但是却没有用8位机控制过DS18B20,心里一直感觉有些遗憾。现在趁着学32位机的机会好好研究研究它。

第一个要说的时GPIO口的配置问题。读写DS18B20要求GPIO是双向的,51单片机没有问题,但是STM32的GPIO口貌似是单向的,不过即使设置为输出口,也可以通过读取输入寄存器来获取管脚的电平高低,只不过其前提是输出的类型是OD输出,开漏输出。如果输出设置成推挽输出,当GPIO口输出高电平,由于单总线通过场效应管直接被VCC拉高,DS18B20无法将总线拉低。我查看了DS18B20的内部结构,好像DS18B20也是通过场效应管将输出低电平的。这样如果STM32输出高,DS18B20输出地,VCC和GND岂不是直接通过两个低阻的场效应管直接相连!我开始时就是这么干的,幸亏没有发生什么事。

当然将GPIO设置成开漏输出还不行,还要在单总线上接上拉电阻。我用的是4.3K(VCC3.3V)。我看到有的例程不停的变换端口的输入输出属性,有点麻烦,只是省了上拉电阻了。

第二个要说的是STM32的时序。在DS18B20的手册上初始化(复位)时序,读写时序等说得很详细。

       在复位时,低电平的持续时间至少480us,我选的是700us(480和960us的中间值,呵呵)。DS18B20在检测到上升沿之后,首先延时15-60us,在主动将总线拉低60-240us。这两个范围综合一下可以得到,DS18B20的有效举手信号最迟出现在上升沿之后60us,最早结束于上升沿之后75us(最早开始于上升沿之后15us,最迟结束于上升沿之后300us)。所以在60us和75us之间采集举手信号是最保守也是最稳妥的。我选的是65us。有一点要注意DS18B20有可能在上升沿之后300us之前还在忙着主动将总线拉低,所以在这段时间里最好不要开始发送ROM指令。刚开始我没有注意到这一点,但是恰巧,我在检测到举手信号后加了一句串口输出的语句。可能这句话正好为DS18B20结束拉低总线,准备接受指令赢得了时间。后来,我把那句串口输出语句删除了,结果读取的数据全都是高电平了。这就说明,一开始的ROM指令就没有响应,STM32 和DS18B20直接不合拍了,结果STM32读进来一堆毫无意义的高电平。直到我在读取举手指令之后加了个250us的延时,读取结果才又恢复正常了。

     另外一点是,每次读写操作的持续时间不能低于60us。特别是在读的时候,因为DS18B20的输出信号只在下降沿之后15us内有效,这样就很容易忽视60us的总持续时间。我在下降沿之后约13us读取总线电平,然后又延时了50us。这个50us的延时是必需的。没有的话,读入的数据就乱了,这是我实验验证的。

第三个要说的时CRC。

CRC实际算法并不复杂,步骤如下

1、首先判断移位寄存器最低位是否与输入的bit相同,这决定了异或门的输出。
2、如果异或门输出为1,则将移位寄存器右移一位,并将移位寄存器最高位置1即可。
3、如果异或门输出位0,首先将移位寄存器右移一位(隐含最高位清零),并且将相应的位取反。具体是哪几位
则由CRC多项式决定,如CRC=X8+X5+X4+1,则将第2和第3位取反(最低位位第0位)。

第四个要说的是一些小地方,如每个scratchpad读取之前必须加ROM指令。 

关键字:STM32  DS18B20 引用地址:STM32学习笔记之DS18B20

上一篇:STM8S 输入捕获学习
下一篇:在MDK开发环境下的STM32工程结构

推荐阅读最新更新时间:2024-03-16 15:15

STM32寄存器列表 RCC时钟相关寄存器
RCC_CR(时钟控制寄存器) 25位:PLLRDY-PLL时钟就绪标志(PLL锁定后由硬件置1)定义:0(未锁定),1(锁定) 24位:PLLON-PLL使能(手动)定义:0(PLL关闭),1(PLL使能)。进入待机或停机模式时,该位由硬件清零当PLL用作系统始终时,该位不能被清零。 19位:CSSON时钟安全系统使能(由软件置1或清零)定义:0(时钟监测器关闭),1(如果外部4-16M振荡器就绪,时钟监测器开启) 18位:HSEBYP外部高速时钟旁路。定义:0(晶振4-16M),1(有源晶振25M)。调试模式下由软件控制。只有在4-16M振荡器关闭情况下,才能写入该位。 17位:HSERDY外部高速时钟就绪
[单片机]
STM32使用fsmc控制NOR flash 例程
一、基本概念(详细内容见st网站stm32应用笔记AN2784) 1. FSMC配置 控制一个NOR闪存存储器,需要FSMC提供下述功能: ●选择合适的存储块映射NOR闪存存储器:共有4个独立的存储块可以用于与NOR闪存、SRAM和PSRAM存储器接口,每个存储块都有一个专用的片选管脚。 ●使用或禁止地址/数据总线的复用功能。 ●选择所用的存储器类型:NOR闪存、SRAM或PSRAM。 ●定义外部存储器的数据总线宽度:8或16位。 ●使用或关闭同步NOR闪存存储器的突发访问模式。 ●配置等待信号的使用:开启或关闭,极性设置,时序配置。 ●使用或关闭扩展模式:扩展模式用于访问那些具有不同读写操作时序的存储器。 因为NOR闪存/SRA
[单片机]
STM32踩坑记录(1):编写代码时遇到STM32无法进入外部中断的原因及解决方法
@STM32踩坑记录(1) 使用的软件及硬件: 硬件平台:RoboMaster C板(STM32F407IGT6)、Jlink仿真调试器 软件平台:keil5 使用的是标准库+freertos。 ##遇到问题时的场景 在编写RoboMaster C板上的IMU(BMI088)温度闭环控制程序时 ,需要配置外部中断引脚 INT1_ACCEL_Pin(PC4),然后在中断服务函数中给温度控制任务发通知(也就是信号量),温度控制任务就会读取BMI088数据寄存器中的陀螺仪、加速度、温度的值,将温度的值传递给PID控制器,进行PID闭环控温程序。 ##:遇到的问题: 因为板载的BMI088上有两个外部中断引脚,分别为INT1
[单片机]
<font color='red'>STM32</font>踩坑记录(1):编写代码时遇到<font color='red'>STM32</font>无法进入外部中断的原因及解决方法
Cortex-M3内核的异常中断
有许多朋友在学习,或者开发 STM32 时都遇到过HardFault_Handler的情况。 那么,又有多少人认真去分析过Fault这类异常中断呢? 下面结合STM32F1(Cortex‐M3内核)来给大家讲述一下这些异常中断的内容。 1Cortex‐M3异常 说起Fault,我们就要说一下Cortex‐M3的异常。 Cortex‐M3 在内核上搭载了一个异常响应系统, 支持为数众多的系统异常和外部中断。 CM3部分异常列表: 这些异常中断的优先级,有些却是固定的,有些是可以通过软件来配置,如UART发送中断、DMA中断等。 相信大家看到这个列表不会陌生,因为在STM32的启动代码,中断代码中都会看到这些异常。 比如在st
[单片机]
Cortex-M3内核的异常中断
DS18B20,源程序测试OK
; FLAG1: 标志位,为 1 时表示检测到DS18B20 ; DQ: DS18B20的数据总线接脚 ; TEMPER_NUM:保存读出的温度数据 ; 本程序仅适合单个DS18B20和51 单片机 的连接, 晶振 为12M Hz 左右 TEMPER_L EQU 36H TEMPER_H EQU 35H DQ BIT P1.7 ; DS18B20初始化程序 ;//*****************************************// INIT_1820: SETB DQ NOP CLR DQ MOV R0,#06BH TSR1: DJNZ R0,TSR1 ;
[单片机]
DS18B20的使用程序PIC单片机
#include pic.h __CONFIG(0x1832); //芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡 #define uch unsigned char //给unsigned char起别名 uch # define DQ RA2 //定义18B20数据端口 # define DQ_DIR TRISA2 //定义18B20D口方向寄存器 # define DQ_HIGH() DQ_DIR =1 //设置数据口为输入 # define DQ_LOW() DQ = 0; D
[单片机]
STM32 usb_endp.c和usb_istr.c文件分析
有时候总在想,怎么样的学习才是最好的?就像学习USB,到底只要学到会应用就可以了,还是要深入到协议内容和驱动底层呢?经常对别人说自己会某某东西,其实自己也只是一知半解的,只会些应用去糊弄别人。于是总在安慰自己:我只要会做些应用就可以了!!! 下面介绍STM32 USB工程的usb_endp.c文件和usb_istr.c两个文件。 首先是usb_endp.c,这个文件很简单,就是定义了结果几个端点输入输出函数,我的工程只有。 uint8_t USB_Receive_Buffer ; //端点接收数据的缓存 REPORT_COUNT=64 uint8_t USB_Send_Buffer ; //端点发送数据的缓存 v
[单片机]
STM32单片机I/O的工作模式
最近有个朋友在设计低功耗设备,用的是STM32的主控,他知道我做过很多类似的超低功耗项目,于是向我咨询了一些问题,其中就包括I/O口的几种工作模式。今天我就详细的来总结一下这几种工作模式,让大家在以后的设计中知其然也知其所以然。 先说说GPIO 在聊这8种工作模式之前,我想先说一下GPIO的概念—通用输入输出GeneralPurposeInputOutput简称GPIO,就是芯片引脚可以通过它们输出高、低电平,也可以通过他们输入、读取引脚的电压、电平状态。 下面的8种工作模式我将围绕下图进行分析介绍,读懂这一张图大家基本就可以完全理解STM32的GPIO了。希望大家仔细的看一看。 四种不同的输出模式 推挽输出:该模式下引脚
[单片机]
<font color='red'>STM32</font>单片机I/O的工作模式
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved