将GY-302感光模块从51移植到stm32

这个感光模块主要就是用i2c通信,移植的时候其实就是改一下延时,把端口的模式设置正确就行了

为了尽量减少工作量,我尽量多用宏定义定义,少修改代码,对于延时函数,可以用define 把它替换成stm32里的延时函数 对于变量,注意在stm32里int是四个字节,而51是两个字节,再者就是很关键的一点,51里有bit变量,可以位寻址  而stm32却没有,而且也没有sbit,对于前者,我就直接把它变成uchar,而后者是有解决办法的,就是位带操作。

位带操作就是,设定了一块特殊的地方,映射到其他地址,每个位对应一个四个字节长度的地方,而访问这个映射的地址,就间接的能访问到位了,因此想要将某一位置一或零可以直接对这个地址进行操作,定义这个地址和51不一样,51是i/o映射,即i/o口和RAM地址是各自独立的,而stm32作为arm,是内存映射,即io口和内存地址统一编码。51是用sfr定义,stm32则可以这样#define RAM_ADDR      (*(volatile unsigned LONG   *)0x0000555F)

以下解释来自点击打开链接

先把它强制转换为指针类型 (unsigned CHAR *)0x5F,AVR的SREG是八位寄存器,所以0x5F强制转换为指向 unsigned CHAR类型。     volatile(可变的)这个关键字说明这变量可能会被意想不到地改变,这样编译器就不会去假设这个变量的值了。这种“意想不到地改变”,不是由程序去改变,而是由硬件去改变——意想不到。     第二步,对指针变量解引用,就能操作指针所指向的地址的内容了     *(volatile unsigned CHAR *)0x5F     第三步,小心地把#define宏中的参数用括号括起来,这是一个很好的习惯,所以#define SREG     (*(volatile unsigned CHAR *)0x5F)

关于volatile

因为 C 编译器并不知道同一个比特可以有两个地址。所以就要通过 volatile,使得编译器每次都如实地把新数值写入存储器,而不再会出于优化的 虑 在中途使用寄存器来操作数据的复本,直到最才把复本写回(这和 cache 的原理是一样的)

类似的,如果使用一个32位处理器,要对一个32位的内存地址进行访问,可以这样定义#define RAM_ADDR      (*(volatile unsigned LONG   *)0x0000555F)      然后就可以用C语言对这个内存地址进行读写操作了      读:tmp = RAM_ADDR;      写:RAM_ADDR = 0x55;

这样基本就可以像51一样操作端口

再就是端口模式   输出时推挽模式  输入浮空模式

以上注意好的话就大功告成了  本来应该是这样的,不过由于本人的粗心大意,还犯了个错误,一般的时间都花在这上面了

因为是移植,我并没有仔细看别人写的代码内容,对于位CY直接当作普通的位寻址的变量来替换了,实际上CY是保存计算后内容的位,和上一次计算有关,我没注意到,所以一直读出的是111111.。。。所以移植的时候还是要大致看看比人的代码,要搞清变量的作用

代码点击打开链接

这里是后话,最近又把一个湿度传感器51代码移植到stm32上,又出现了一些问题,这里总结一下

移植时的注意:

1,端口:通过位带操作将原先端口通过宏定义来替换成相应的stm32端口,特别注意给端口赋值和读取是要两个不同的端口宏定义的,一定仔细看代码修改,输出推挽模式,输入浮空(或上拉输入经测试也可以),读取数据之前要换输入模式

2,关于时间的:延时函数,us和ms通过宏定义或者写新的函数,且用于计算时间长短的变量也要改视情况改长度(如等待应答信号的计数值)

3,改变量:最好把所有的变量类型都检查下改成合适的

4,调试时printf是很方便,但是要注意printf消耗的时间是不小的!!!至少已经能影响时序的正确性了,调时序一定要慎用!!!

关于湿度传感器dht11多说一句,那个引脚比常用的要细,一定要插牢 否则接触不好容易出问题 (初始化失败)

时间: 2024-10-07 14:58:42

将GY-302感光模块从51移植到stm32的相关文章

Basic脚本解释器移植到STM32

本文来自http://blog.csdn.net/hellogv/ .引用必须注明出处! 上次讲了LUA移植到STM32.这次讲讲Basic脚本解释器移植到STM32. 在STM32上跑Basic脚本,相同能够跟穿戴设备结合.也能够作为刚開始学习的人学习MCU的入门工具,当然前提是有人做好Basic的STM32交互实现.这里使用的是uBasic开源脚本解释器(http://dunkels.com/adam/ubasic/),只是uBasic不支持完整的Basic算法,所以用起来略费心,假设有好的

像51一样操作STM32的IO(转)

源:像51一样操作STM32的IO //----------------------------------------------------------------------------------------------------- //别名区 ADDRESS=0x4200 0000 + (0x0001 100C*0x20) + (bitx*4) ;bitx:第x位 // 把“位段地址+位序号”转换别名地址宏 #define BITBAND(addr, bitnum) ((addr &

基于ZigBee模块与51单片机之间的简化智能家居项目简介(学生版本)(4.30更)

昨天(4.29)任务是完成通信并写出解析码:(4.30)任务基本完成我先用了二个单片机试验基本OK,可以完成通信,解析码为(0x31 0x32 END 0x(END号) 0x77 0x23) 列:0x31 0x32 0x31 0x11 0x77 0x23.目前这只是自动功能的解析码后期我会慢慢的加上其他的功能. 遇到的问题:今天任务简单一切顺利 倒是学会了 QT当中 Qstring char *  QByteArray 的转换 转换如下(网上找的试验过可以) ①把QString 转化为 char

lwip移植到stm32上-enc28j60,103mcu(2)

前面小玩了一下ucos和lwip,但是都还不是真正的网络多任务,真正的网络多任务应该是什么样子的呢?应该是有一个专门的任务负责网络的通讯,他负责将数据发送出去,将数据接收回来,而其他的需要用到网络的任务与这个任务通讯,这才是能够极大提升网络效率的办法,lwip支持这种办法,不过移植起来就比较磨人了 首先第一步是修改lwip的配置文件,如下 #define NO_SYS 0 //使用UCOS操作系统 改了这个之后会发现卧槽一下子缺了好多东西,实际上是这样,lwip使用一系列的宏和方法封装了一个操作

RT-Thread-v2.0.0移植到STM32及驱动LCD和测温

先简单记录下安装: 1. 安装 sourcery工具链或 keil都行 安装python 和 scons: 配置这些工具路径以及RT-Thread源码路径RTT_ROOT,添加到环境变量 2. 开始编译 bsp\stm32f10x工程,在编译以前需要稍微修改如下几个文件 rtconfig.py 此文件必须修改 rtconfig.h 此文件用于裁剪rt-thread(根据需要修改) 比如使用 keil工具来编译: 修改rtconfig.py, CROSS_TOOL='keil' EXEC_PATH

像51一样操作STM32的IO

方法应该有人发过,我只是总结一下//-----------------------------------------------------------------------------------------------------//别名区    ADDRESS=0x4200 0000 + (0x0001 100C*0x20) + (bitx*4) ;bitx:第x位// 把"位段地址+位序号"转换别名地址宏#define BITBAND(addr, bitnum) ((add

uC/OS-II在STM32F103上的移植

uc/os工程的创建和移植 先在官方下载uc/os的源代码,下载链接如下,注册之后即可以下载: https://www.micrium.com/download/micrium_stm32xxx_ucos-ii/ 注意IAR和MDK的区别,IAR版汇编的在MDK上汇编不兼容,改动会比较多. 然后在Keil中新建一个uCOS的工程,选择板子为STM32F103C8,选择CMSIS下的CORE和Device下的Startup,以及Device下的StdPeriph Drivers下的Framewor

[STM32F429-DISCO-uCosiii]1.uCOSIII 移植

uCOSiii的结构比uCOSii看上去是清晰了不少,也比较有条理,所以呢,移植不是让人感觉很乱.在工程中添加如下目录和文件      与CPU相关的文件都集中在uC-CPU文件夹中.这部分有很多是底层的实现,比如调度算法,CPU现场保护,前导零,时间相关的函数,其中也有不少我们需要自己来添加相关代码.库文件提供了我们对字符串.数学运算.存储运算等的处理函数,ucOS-OS提供了操作系统的各功能模块代码.移植的详细步骤UCOSiii user manual.pdf比较详细 我参考其中文译书<嵌入

OpenCV 3 最新模块一次看个够

OpenCV 3 的改动在哪? C 风格的API很快将会消失,完全被C++的API替代,代码更加简洁.不易出错.读者如果想借助opencv最新的功能,记得清理代码中的C风格API. C++ API 将更加简洁. 所有的算法都将继承自 cv::Algorithm 接口. 大型的模块将拆分为小模块,模块将在后面继续讲解. OpenCV 3 有这么多文件夹,从何入手? 3rdparty/,包含第三方的库,比如视频解码用的 ffmpeg,jpg.png.tiff等图片的开源解码库. apps/,包含进行