转一篇浅显易懂的关于BLE安全机制的文章:
本文转自:http://bbs.21ic.com/blog-1827100-160288.html
A New Hope
转一篇浅显易懂的关于BLE安全机制的文章:
本文转自:http://bbs.21ic.com/blog-1827100-160288.html
此文讲解的BLE配对过程还是比较清楚的,转!转自:http://bbs.21ic.com/blog-1827100-160300.html
在使用ubuntu16.4编译linux-3.0.8内核时出现这样的错误
在之前的版本编译时是可以正常编译通过,还不清楚具体问题
但是可以修改timeconst.pl的内容后正常编译。
以下是编译错误提示的内容:
Can’t use ‘defined(@array)’ (Maybe you should just omit the defined()?) at kernel/timeconst.pl line 373.
/opt/ARM/mini6410/linux/linux-2.6.38/kernel/Makefile:140: recipe for target ‘kernel/timeconst.h’ failed
make[1]: *** [kernel/timeconst.h] Error 255
Makefile:916: recipe for target ‘kernel’ failed
make: *** [kernel] Error 2
将kernel/timeconst.pl中第373行的defined()去掉只留下@val就可以了
在刚开始接触液晶的时候,很多人会选择液晶模块,而1602液晶模块是一种选择,下面推荐我第一次使用液晶的时候,所用的一块模块:
16*2液晶显示模块
外形尺寸:80*36mm
有效显示尺寸:57.7(W)Χ9.4(H)
外形尺寸:8.0×3.6CM
背光:白色LED
控制器:HD44780
引脚定义
1– Vss 电源
2–Vcc 电源+5V
3–Vo 对比度调节
4–RS 寄存器选择 ,H = 数据选择,L = 指令选择
5–R/W 读写信号
6–E 致能信号
7~14– DB0 ~ DB7 数据线
15–A LED+
16–K LED-
下面是它与51单片机的底层驱动代码:
#include “intrins.h”
sbit rs=0x85;//与1602控制口通信的端口
sbit rw=0x86;
sbit ep=0x87;
//液晶显示数据缓存
unsigned char dis1[17]={“03-11 19:57:00 2\0”};
unsigned char dis2[17]={“NOW TEMP: 015.0 \0”};
void lcd_delay(unsigned char ms)
{
unsigned char i;
while(ms–)
{
for(i=0;i<250;i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
bit lcd_bz()
{
bit result;
rs=0;
rw=1;
ep=1;
_nop_();
_nop_();
_nop_();
_nop_();
result=(bit)(P2&0x80);
ep=0;
return result;
}
lcd_wcmd(unsigned char cmd)
{
while(lcd_bz());
rs=0;
rw=0;
ep=0;
_nop_();
_nop_();
P2=cmd;
_nop_();
_nop_();
_nop_();
_nop_();
ep=1;
_nop_();
_nop_();
_nop_();
_nop_();
ep=0;
}
lcd_pos(unsigned char pos)//设定显示位置
{
lcd_wcmd(pos|0x80);
}
lcd_wdat(unsigned char dat)
{
while(lcd_bz());
rs=1;
rw=0;
ep=0;
P2=dat;
_nop_();
_nop_();
_nop_();
_nop_();
ep=1;
_nop_();
_nop_();
_nop_();
_nop_();
ep=0;
}
lcd_init()//模块初始化,不显示光标
{
lcd_wcmd(0x38);
lcd_delay(1);
lcd_wcmd(0x0c);
lcd_delay(1);
lcd_wcmd(0x06);
lcd_delay(1);
lcd_wcmd(0x01);
lcd_delay(1);
}
在最初接触单片机的时候,很多人都想做一个时钟,有些方案是直接用单片机进行计算的,这个我做过;还有一种方案是使用时钟芯片,而在选择时钟芯片的时候,很多人的眼光都会聚焦在DS1302这个芯片上:
DS1302 是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。
我当时在使用DS1302时,也曾收集了一些资料,附件是这块芯片的英文和中文资料,可下载参考。
同时,也贴上这个芯片与51单片机的底层通信代码(代码是本人网上搜集并稍作修改的),希望对大家有用。
sbit DS1302_clk=0xb7;
sbit DS1302_data=0xb6;
sbit DS1302_cs=0xb5;
unsigned char year,month,date,hour,minute,second,week;
void short_ds1302_delay()
{
unsigned char i;
for(i=0;i<5;i++);
}
void long_ds1302_delay()
{
unsigned char i;
for(i=0;i<25;i++);
}
void DS1302_write(unsigned char DS1302_temp)
{
unsigned char i,temp;
long_ds1302_delay();
temp=DS1302_temp;
for(i=0;i<8;i++)
{
DS1302_data=temp&0x01;
short_ds1302_delay();
DS1302_clk=1;
short_ds1302_delay();
DS1302_clk=0;
temp=temp>>1;
}
}
unsigned char DS1302_read(void)
{
unsigned char i,temp;
long_ds1302_delay();
temp=0;
for(i=0;i<8;i++)
{
temp=temp>>1;
if(DS1302_data==1)
temp=temp+0x80;
DS1302_clk=1;
short_ds1302_delay();
DS1302_clk=0;
short_ds1302_delay();
}
return temp;
}
/////////写操作设置,当a=0x80时禁止写操作,a=0x00时允许////////////////
void DS1302_write_able(unsigned char a)
{
DS1302_cs=0;
DS1302_clk=0;
short_ds1302_delay();
DS1302_cs=1;
DS1302_write(0x8e);
DS1302_data=1;
DS1302_write(a);
DS1302_cs=0;
short_ds1302_delay();
DS1302_clk=1;
}
////////////////////ds1302初始化////////////////////////
void DS1302_init()
{
unsigned char i;
DS1302_write_able(0x00); //允许写操作
DS1302_cs=0;
DS1302_clk=0;
short_ds1302_delay();
DS1302_cs=1;
DS1302_write(0x81);
DS1302_data=1;
i=DS1302_read();
DS1302_cs=0;
short_ds1302_delay();
DS1302_clk=1;
second=((i>>4)&0x07)*10+(i&0x0f);
DS1302_clk=0;
short_ds1302_delay();
DS1302_cs=1;
DS1302_write(0x80);
DS1302_data=1;
DS1302_write(0x7f&i);
DS1302_cs=0;
short_ds1302_delay();
DS1302_clk=1;
DS1302_clk=0; //充电设置
short_ds1302_delay();
DS1302_cs=1;
DS1302_write(0x90);
DS1302_data=1;
DS1302_write(0xa6); //允许充电,一个二极管 4k电阻
DS1302_cs=0;
short_ds1302_delay();
DS1302_clk=1;
DS1302_write_able(0x80); //禁止写操作
}
void DS1302_readdate()
{
unsigned char i;
DS1302_cs=0;
//读取second
DS1302_clk=0;
short_ds1302_delay();
DS1302_cs=1;
DS1302_write(0x81);
DS1302_data=1;
i=DS1302_read();
DS1302_cs=0;
short_ds1302_delay();
DS1302_clk=1;
second=((i>>4)&0x07)*10+(i&0x0f);
//读取分minute
DS1302_clk=0;
short_ds1302_delay();
DS1302_cs=1;
DS1302_write(0x83);
DS1302_data=1;
i=DS1302_read();
DS1302_cs=0;
short_ds1302_delay();
DS1302_clk=1;
minute=((i>>4)&0x07)*10+(i&0x0f);
//读取时hour
DS1302_clk=0;
short_ds1302_delay();
DS1302_cs=1;
DS1302_write(0x85);
DS1302_data=1;
i=DS1302_read();
DS1302_cs=0;
short_ds1302_delay();
DS1302_clk=1;
hour=((i>>4)&0x03)*10+(i&0x0f);
//读取日date
DS1302_clk=0;
short_ds1302_delay();
DS1302_cs=1;
DS1302_write(0x87);
DS1302_data=1;
i=DS1302_read();
DS1302_cs=0;
short_ds1302_delay();
DS1302_clk=1;
date=((i>>4)&0x03)*10+(i&0x0f);
//读取月份month
DS1302_clk=0;
short_ds1302_delay();
DS1302_cs=1;
DS1302_write(0x89);
DS1302_data=1;
i=DS1302_read();
DS1302_cs=0;
short_ds1302_delay();
DS1302_clk=1;
month=((i>>4)&0x01)*10+(i&0x0f);
//读取周week
DS1302_clk=0;
short_ds1302_delay();
DS1302_cs=1;
DS1302_write(0x8b);
DS1302_data=1;
i=DS1302_read();
DS1302_cs=0;
short_ds1302_delay();
DS1302_clk=1;
week=i&0x07;
//读取年份year
DS1302_clk=0;
short_ds1302_delay();
DS1302_cs=1;
DS1302_write(0x8d);
DS1302_data=1;
i=DS1302_read();
DS1302_cs=0;
short_ds1302_delay();
DS1302_clk=1;
year=((i>>4)&0x0f)*10+(i&0x0f);
}
void DS1302_writedate()
{
DS1302_write_able(0x00);
DS1302_cs=0;
//写second
DS1302_clk=0;
short_ds1302_delay();
DS1302_cs=1;
DS1302_write(0x80);
DS1302_data=1;
DS1302_write(0x7f&(((second/10)<<4)+(second%10)));
DS1302_cs=0;
short_ds1302_delay();
DS1302_clk=1;
//minute
DS1302_clk=0;
short_ds1302_delay();
DS1302_cs=1;
DS1302_write(0x82);
DS1302_data=1;
DS1302_write(0x7f&(((minute/10)<<4)+(minute%10)));
DS1302_cs=0;
short_ds1302_delay();
DS1302_clk=1;
//hour
DS1302_clk=0;
short_ds1302_delay();
DS1302_cs=1;
DS1302_write(0x84);
DS1302_data=1;
DS1302_write(0x3f&(((hour/10)<<4)+(hour%10)));
DS1302_cs=0;
short_ds1302_delay();
DS1302_clk=1;
//date
DS1302_clk=0;
short_ds1302_delay();
DS1302_cs=1;
DS1302_write(0x86);
DS1302_data=1;
DS1302_write(0x3f&(((date/10)<<4)+(date%10)));
DS1302_cs=0;
short_ds1302_delay();
DS1302_clk=1;
//month
DS1302_clk=0;
short_ds1302_delay();
DS1302_cs=1;
DS1302_write(0x88);
DS1302_data=1;
DS1302_write(0x1f&(((month/10)<<4)+(month%10)));
DS1302_cs=0;
short_ds1302_delay();
DS1302_clk=1;
//week
DS1302_clk=0;
short_ds1302_delay();
DS1302_cs=1;
DS1302_write(0x8a);
DS1302_data=1;
DS1302_write(0x07&week);
DS1302_cs=0;
short_ds1302_delay();
DS1302_clk=1;
//year
DS1302_clk=0;
short_ds1302_delay();
DS1302_cs=1;
DS1302_write(0x8c);
DS1302_data=1;
DS1302_write(((year/10)<<4)+(year%10));
DS1302_cs=0;
short_ds1302_delay();
DS1302_clk=1;
DS1302_write_able(0x80);
}