给帮同学调试ds18b20,使用的是正点原子的程序。按道理只要移植IO口的管脚就没问题了。但是还是不行,所以去看了一下发现:
这是他原来的程序
//IO方向设置 #define DS18B20_IO_IN() {GPIOA->CRH&=0XFFFFFFF0;GPIOA->CRH|=8<<0;} #define DS18B20_IO_OUT() {GPIOA->CRH&=0XFFFFFFF0;GPIOA->CRH|=3<<0;} ////IO操作函数 #define DS18B20_DQ_OUT PAout(8) //数据端口 PA0 #define DS18B20_DQ_IN PAin(8) //数据端口 PA0
现在我使用PA11,应该只要改一点点:比如
//IO方向设置 #define DS18B20_IO_IN() {GPIOA->CRH&=0XFFFF0FFF;GPIOA->CRH|=8<<3;} #define DS18B20_IO_OUT() {GPIOA->CRH&=0XFFFF0FFF;GPIOA->CRH|=3<<3;} ////IO操作函数 #define DS18B20_DQ_OUT PAout(8) //数据端口 PA0 #define DS18B20_DQ_IN PAin(8) //数据端口 PA0
其实问题就出在这个想当然把左移当成3位,其实他移动一个16进制就应该移动4位,所以我应该移动12位
//IO方向设置 #define DS18B20_IO_IN() {GPIOA->CRH&=0XFFFF0FFF;GPIOA->CRH|=8<<12;} #define DS18B20_IO_OUT() {GPIOA->CRH&=0XFFFF0FFF;GPIOA->CRH|=3<<12;} ////IO操作函数 #define DS18B20_DQ_OUT PAout(8) //数据端口 PA0 #define DS18B20_DQ_IN PAin(8) //数据端口 PA0
或者这样写简单易懂
//IO方向设置 #define DS18B20_IO_IN() {GPIOA->CRH&=0XFFFF0FFF;GPIOA->CRH|=0x00008000;} #define DS18B20_IO_OUT() {GPIOA->CRH&=0XFFFF0FFF;GPIOA->CRH|=0x00003000;} ////IO操作函数 #define DS18B20_DQ_OUT PAout(11) //数据端口 PA11 #define DS18B20_DQ_IN PAin(11) //数据端口 PA11
好了,这样就没有问题了