切换到宽版
  • 395阅读
  • 5回复

移植 ARDUINO oneWire 库 [复制链接]

上一主题 下一主题
离线huaweiwx
 

发帖
1325
M币
118
专家
57
粉丝
251
arduino  onewire 库用于驱动onewire 总线器件如ds18b20,但该库在stm32上却运行死机,所以以前我都是直接写代码,这样要为每个系统都重新写代码实在有点麻烦,因此为在我移植的所有arduino:
stm32
efm32
nuvoton
lm3s
等平台都能使用,决定直接使用arduino 库来移植;
一 硬件准备:
许多自己做的板子和成品板子,上面都没有一线器件,没法测试,因此就从硬件开始,做个ds18b20插件,这样可以插在任何板子上,原理图:


DQ 通过103 电阻上拉,电源加个退耦电容;
引出排针时,DQ和GND排列交换了一下,主要是因为arduno排座上VCC/GND是埃在一起的,这样可以直接对准电源的位置插入,当然也可以插在任何三个脚上来借电,做成的插件图:



二  移植库:
通过跟踪原库代码,发现主要死在这儿:
  1.         ......
  2.         noInterrupts();
  3.         ...
  4.         delayMicroseconds(3);
  5.        ...
  6.         interrupts();

从上面的代码结构可见,在onewire操作时为了保证代码时序的准确性,关闭了中断,但stm32/efm32/nuvoton等都是用了systic中断,关中断也就使系统时钟相关的延时失效导致从死循环中无法跳出;
找到原因就可以修改代码了,有两种方法,一是用个局部循环延时函数代替系统延时函数,二是干脆不开关中断,因为arm运行速度快,大多数中断服务程序都耗时极短,对一线总线时序影响甚微,我就是采用的后一方案;
在库代码开始时加上了这样一段:
  1. #ifdef __arm__
  2. #ifdef  ARDUINO_EXTEND   /*STM32/EFM32/NUVOTON/LM3S  add by huaweiwx@sina.com*/
  3.    #undef  noInterrupts
  4.    #define noInterrupts()
  5.    #undef  interrupts
  6.    #define interrupts()
  7. #endif
  8. #endif
上述代码检测是否是arm 再检查是否有一个ARDUINO_EXTEND的宏定义(这是我扩充arduino stm32/efm32/nuvoton/lm3s的一个标记),如满足上述条件就取消interrupts和noInterrupts宏定义,就可以使该库增加对我移植的所有arm芯片的支持;

三 测试 :
连接在nucleo f401re上:


实际连接图:


测试代码:
  1. #include <OneWire.h>
  2. #include <DallasTemperature.h>
  3. // Data wire is plugged into port 2 on the Arduino
  4. #define ONE_WIRE_BUS PA_5   /* NUCLEO F401 */
  5. // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
  6. OneWire oneWire(ONE_WIRE_BUS);
  7. // Pass our oneWire reference to Dallas Temperature.
  8. DallasTemperature sensors(&oneWire);
  9. void setup(void)
  10. {
  11.   // start serial port
  12.   Serial.begin(115200);
  13.   Serial.println("Dallas Temperature IC Control Library Demo");
  14.   // Start up the library
  15.   delay(1000);
  16.   sensors.begin();
  17. }
  18. void loop(void)
  19. {
  20.   // call sensors.requestTemperatures() to issue a global temperature
  21.   // request to all devices on the bus
  22.   Serial.print("Requesting temperatures...");
  23.   sensors.requestTemperatures(); // Send the command to get temperatures
  24.   Serial.println("DONE");
  25.   Serial.print("Temperature for the device 1 (index 0) is: ");
  26.   Serial.println(sensors.getTempCByIndex(0));
  27. }
编译上传到sram运行一次,显示当前温度:


同样在这个位置上插上个DHT11:

硬件连接:


运行显示温湿度:








[ 此帖被huaweiwx在2018-12-04 14:36重新编辑 ]
本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
本帖最近打赏记录:共2条打赏M币+22
gsm7 M币 +2 您確定 DHT11 的溫度計沒壞? 12-08
2545889167 M币 +20 大佬厉害 支持 12-04
离线panqi

发帖
438
M币
54
专家
0
粉丝
12
只看该作者 1楼 发表于: 12-04
不明觉厉,膜拜大神!
非诚勿扰
离线触景情伤

发帖
3707
M币
384
专家
4
粉丝
65
只看该作者 2楼 发表于: 12-04
感觉阿丢诺被楼主玩出花来了,stm32的官板也在向这个环境开始靠近了看看引脚很多接口都出来了,不知道是啥情况…

内容来自Android手机客户端

爱和伤痛都会败给岁月……
离线2545889167

发帖
13077
M币
20396
专家
301
粉丝
4704
只看该作者 3楼 发表于: 12-04
大佬厉害 支持
离线beiling

发帖
787
M币
282
专家
2
粉丝
25
只看该作者 4楼 发表于: 12-05
厉害了我大佬
离线nan77240

发帖
336
M币
20
专家
2
粉丝
19
只看该作者 5楼 发表于: 12-06
好 支持 多多移植  stm便宜啊啊啊啊啊