一、ds18b20
1.使用DS18B20,半双工串行通讯方式
2.P37引脚结构图:
上拉电阻: 把一个信号通过一个电阻接到电源(Vcc);
下拉电阻: 把一个信号通过一个电阻接到地(GND)。
作用:维持输入管脚是一个稳态:当上拉和下拉电阻都不开启时,GPIO引脚处于浮空模式,此时引脚的电压是不确定的,可能会随时间改变。
3.两个或多个输出信号连接在一起可以实现逻辑“与”的功能。
拉高的过程为释放总线的过程;
接收方一定要释放总线,来实现接收数据;
上拉电阻:保证双方释放总线后,总线能够呈现高电平;
4.ds18b20通讯时序:
初始化(复位)--- 写操作 --- 读操作 --- 获取温度
1)初始化
代码:
#define DQ_SET (P3 |= (1 << 7))
#define DQ_CLEAR (P3 &= ~(1 << 7))
#define DQ_TST ((P3 & (1 << 7)) != 0)
int ds18b20_reset(void)
{
int t;
DQ_CLEAR;
Delay10us(70);
DQ_SET;
Delay10us(5);
t = 0;
while(DQ_TST && t < 30)
{
Delay10us(1);
++t;
}
if(t >= 30)
{
return 0;
}
t = 0;
while(!DQ_TST && t < 30)
{
Delay10us(1);
++t;
}
if(t >= 30)
{
return 0;
}
return 1;
}
2)写入操作
代码:
void write_ds18b20(unsigned char date)
{
int i;
for(i = 0; i < 8; ++i)
{
if(date & 1)
{
DQ_CLEAR;
_nop_();
_nop_();
DQ_SET;
Delay10us(5);
}
else
{
DQ_CLEAR;
Delay10us(5);
DQ_SET;
}
date >>= 1;
}
}
3)读操作:
代码:
unsigned char read_ds18b20(void)
{
unsigned char ret = 0;
int i;
for(i = 0; i < 8; ++i)
{
DQ_CLEAR;
_nop_();
_nop_();
DQ_SET;
_nop_();
_nop_();
_nop_();
if(DQ_TST)
{
ret |= (1 << i);
}
Delay10us(5);
}
return ret;
}
4)温度获取
代码:
float get_temp(void)
{
unsigned char tl;
unsigned char th;
short ret;
ds18b20_reset();
write_ds18b20(0XCC);
write_ds18b20(0X44);
Delay1ms(1000);
ds18b20_reset();
write_ds18b20(0XCC);
write_ds18b20(0XBE);
tl = read_ds18b20();
th = read_ds18b20();
ret = th << 8;
ret |= tl;
return ret * 0.0625;
}
二、ARM硬件
1.soc:片上芯片
2.GPIO:控制soc外部引脚的高低电平
3.kernel要与外设间建立联系(BUS总线)
BUS总线分为AHB总线(先进的高速设备)和APB总线(先进的低俗设备)
三、ARM内核概念
1.R0~R12:通用寄存器(内设寄存器不可寻址)
2.ALU:算术逻辑单元
3.SP:栈指针寄存器(在硬件物理层的指针,来管理栈区)
4.PC:程序计数器,PC指到哪,程序就执行到哪
PC一定会从地址0取一个指令开始执行
ARM有32位,每一个指令有4个字节
5.LR:链接寄存器
6.MMU:memory management unit,内存管理单元(内存映射)
7.Cache:高速缓存,可以提高系统运行速率
iCache:指令Cache
dCache:数据Cache,所以ARM是哈弗结构
内核编程中,打开iCache,通常关闭dCache
8.CPSR:程序状态寄存器
9.SPSR:程序状态保护寄存器
10.ARM简介
ARM Cortex A(应用于消费类电子产品)
M(应用于微控制器MAU方向,如STM32)
R(应用于实时性方向,如军事,通信)
ARM的指令集版本:
ARM V4
ARM V5
ARM V7
11.编译流程步骤: