数据专栏

智能大数据搬运工,你想要的我们都有

科技资讯:

科技学院:

科技百科:

科技书籍:

网站大全:

软件大全:

「深度学习福利」大神带你进阶工程师,立即查看>>> 关键基础精华及注意事项 STM32数字模拟地的处理
硬件开发
2016-06-17 03:16:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
转自: http://topeetboard.com

iTOP-6818开发板是一款四核ARM 八核开发板与iTOP-4418开发板完全兼容,CPU主频1.4GHz,内存1GB DDR3(2GB可选),存储16GB EMMC,板载千兆以太网,GPS,WIFI蓝牙,陀螺仪等模块,同时支持3G模块,4G模块。可适用于智能家居、医疗、媒体、车载、手持设备、通讯等行业。






核心板参数
尺寸:50mm*60mm
高度:核心板连接器为1.5mm
C P U:ARM Cortex-A9 四核 S5P4418处理器 1.4GHz 28nm
内存:1GB DDR3(2GB可选)
存储:16GB EMMC
电源管理:AXP228,支持动态调频,超低功耗
工作电压:直流5V供电
系统支持:Linux、Android等系统
引角扩展:4418功能全部引出,四组连接器共320个PIN脚
运行温度:-25℃至+80℃
最大分辨率:2048*1280



底板参数
尺寸:底板:125mm * 190mm
POWER:电直流电源输入接口,5V/2A电源输入
SWITCH:电源接口
DIP SWITCH:3位拨码开关
A/D:1路
JTAG接口:1个
CAMERA接口 :1个(可支持500万摄像头)
GPIO/CAN/RS485接口:1路CAN 1路RS485接口
User Key:4个功能按键
IRDA: 1个红外一体化接收头
MIC:支持MIC输入
PHONE:支持耳机输出
串口:2个串口
USB Host :3路USB Host,支持USB2.0协议
TF Card:1个标准TF卡接口
3G模块:中兴3G模组,WCDMA制式
WIFI模块:支持
GPS模块:支持
网口:千兆以太网接口
LCD接口: 2路LVDS接口, 1路RGB接口
MIPI接口:1路接MIPI接口的屏幕
HDMI接口:标准HDMI v1.4,1080p高清分辨率输出接口
USB OTG :1路USB OTG 2.0
RTC座:1个
多媒体编码:支持H.263 H.264 MPEG等多种音频格式
陀螺仪/重力感应器:支持
硬件开发
2016-06-16 17:54:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
一:下载地址:
https://sourceforge.net/projects/xampp/files/XAMPP%20Linux/1.7.1/
1.7版本官方没有64位、只有32位的
下载 成功
二:解压到 /opt/ 目录下

tar xfz xampp-linux-1.7.7.tar.gz

注意,由于压缩包包含权限等属性,只能使用此命令来解压,(xfz)并且下载的tar.gz压缩包不允许在Windows环境下编辑或解压。至此,XAMPP已经安装完了~:)~是否感到不可思议?

三:解压完成后 进入 lampp目录
./lampp start 启动xampp



————————————————————————————————————
五:mysql 启动和配置
1: 进入mysql 的目录为:
/lampp/bin

bin 目录下 直接登陆mysql 默认没有密码
./mysql

2:
设置 mysql root密码:
mysql>use mysql;
mysql> update user set password=passworD("test") where user='root';
mysql> flush privileges;
mysql> exit;
3: 进入mysql
./mysql -uroot -proot

4:设置mysql 远程连接帐号密码

mysq> GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'%' IDENTIFIED BY'mypassword' WITH GRANT OPTION;
mysq>FLUSH PRIVILEGES;

5:重启服务 。 完成

四:默认开启80 端口。访问的 默认路径为
修改默认的访问路径 在这里配置:(修改URL 就可以)









——————————————————————————————————
忘记 xampp mysql 密码 :
设置密码 如下
1、停止mysql服务器 sudo /opt/lampp/lampp stopmysql
2、使用`--skip-grant-tables' 参数来启动 mysqld sudo /opt/lampp/sbin/mysqld --skip-grant-tables
3、再开一个终端(在终端中直接右键+B) 进入mysql sudo /opt/lampp/bin/mysql -uroot
现在会直接进入mysql
4、连接mysql权限数据库 use mysql;
5、修改root用户的密码 update user set password=password("123456") where user="root";
6、刷新权限表(必须要有这一步) flush privileges;
7、退出mysql quit;
8、重启mysql服务 sudo /opt/lampp/lampp startmysql

ok 现在就可以使用刚才设置的密码登录msql了
硬件开发
2016-06-16 14:59:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
单片机的开发一直都是很枯燥的,51直接操作寄存器,stm32的标准库不人性,和操作寄存器没啥区别,然而,对于一个mcu的外设来讲,管脚是确定的,功能是确定的,总得来说是有规律可循的,开发者不应该把时间浪费在驱动编程上,而更多的应该关注业务逻辑。所以stm32在原来的标准库基础上升级为HAL库,称为stm32Cube,同时推出了在pc端使用的CubeMX工具,其目的就是要把那些针对芯片的有规律的机械编程可视化,让你点点选选就可以初始化好相关外设的驱动代码,生成工程项目。进而使用新的stm32Cube库开发。
cube库相比标准库在封装及api命名上有一定的进步,当然标准库的优势就是比cube封装的弱,更接近底层,可以学习的芯片架构方面的东西,方便深入了解底层。
下面是一些资源: http://www.stmcu.org/module/forum/thread-600243-1-1.html CubeMX和HAL库官方下载 http://jingyan.baidu.com/article/a948d6510293ec0a2ccd2e49.html
对于CubeMX,我们拿来规划芯片引脚使用情况或者参考其生成的代码流程。多数情况下,不应该直接使用其生成的代码。这是因为基本上所谓的智能化代码生成都是没有针对性的复杂冗余实现。我们只能拿来参考而不宜直接使用。
硬件开发
2016-06-15 21:27:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
架构
做嵌入式硬件开发,要以某个控制器为核心,引出其它外围器件。主流上可以按功能强弱分类为 51系列8位mcu——cortex Mx系列32位mcu——cortex A系列 SoC,其中51是x86指令,cortex是arm指令,两者都是哈佛结构。Intel最近也推出了使用Linux的物联网开发芯片,如夸克、伽利略等嵌入式芯片或开发板,及其它移动处理器,但在嵌入式领域,Intel市场要远落后于arm。
51 8位系列是Intel几十年前的产品,也是mcu的祖先,由于其市场占有率及简单架构、适合教学等因素,51至今还没退出市场。由于51系列结构简单,历史较早,可以授权,现在能够生产51的厂家很多,存在一定的兼容问题。经典的51可以使用汇编和c语言指针操作寄存器开发,一般没有官方用c语言封装的库,当然如果自己把51的外设都摸索清了,也可以形成自己用c语言封装的库,只是由于现在的嵌入式开发需要的功能越来越多,性能要求更高,51的架构及开发方式受到很大限制。
随着cortex Mx系列的32位mcu出现,很多嵌入式控制领域采用了cortex M方案,由于cortex M一般是32位,且外设很多,此时再使用类似51使用c语言指针直接操作寄存器开发方式效率很低,故arm公司和mcu开发商一般会给出用c语言结构体和函数对寄存器封装的标准开发库,这里以stm32为例,其它厂商产品基本一样。stm32早期到现在一直支持标准库开发方式,这一定程度上提高了开发效率,但是标准库开发的方式本质上仍然是操作寄存器,需要开发者了解mcu的寄存器参数才能使用。目前stm32又推出了stm32Cube开发方式,进一步进行了抽象,简化了开发方式。当然除了官方开发库,还可以使用rtos方式开发。
但是,面向嵌入式控制的芯片由于在硬件设计阶段比较灵活,多数应用场景所需功能较少,一般不需要上操作系统,这就导致了mcu的开发很大一部分工作是基于特定硬件架构进行的枯燥驱动开发。而官方的标准库能够提供的抽象有限,上层开发仍需要和底层打很多交道。即使使用操作系统,也需要先进行对应的驱动移植。
基于cortex A系列的高性能控制器一般用作面向消费领域的SoC,如果不是用于控制领域,则底层驱动一般参考厂家提供的Linux驱动,需要自己改动的底层驱动较少,而大部分工作是做上层的应用开发,就不会那么枯燥。当然,如果将SoC用于控制领域,也是需要基于Linux的驱动模型和具体硬件打很多交道,如传感器信息获取,只不过上层应用一般只和Linux内核提供的抽象接口打交道,Linux驱动的抽象接口也可以适当标准化驱动的开发。
选型
硬件开发
2016-06-14 15:41:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
1、 sudo pip install paho- mqtt
2、python代码
# -*- coding: utf-8 -*-
import paho.mqtt.client as mqtt
# import RPi.GPIO as GPIO
import json,sys
# if sys.version_info < (3, 0):
# reload(sys)
# sys.setdefaultencoding('utf8')
# else:
# raw_input = input
username='public'
password='123456'
hostname='xxx.xxx.xxx.xxx'
# BCM GPIO编号
pins = [17,18,27,22,23,24,25,4]
def gpio_setup():
# 采用BCM编号
GPIO.setmode(GPIO.BCM)
# 设置所有GPIO为输出状态,且输出低电平
for pin in pins:
GPIO.setup(pin, GPIO.OUT)
GPIO.output(pin, GPIO.LOW)

def gpio_destroy():
for pin in pins:
GPIO.output(pin, GPIO.LOW)
GPIO.setup(pin, GPIO.IN)

# 连接成功回调函数
def on_connect(client, userdata, flags, rc):
print("Connected with result code " + str(rc))
# 连接完成之后订阅gpio主题
client.subscribe("gpio")
# 消息推送回调函数 .decode("utf-8")
def on_message(client, userdata, msg):
print(msg.topic+""+str(msg.payload))
#获得负载中的pin 和 value
# gpio = json.loads(str(msg.payload))
# if gpio['pin'] in pins:
# if gpio['value'] == 0:
# GPIO.output(gpio['pin'], GPIO.LOW)
# else:
# GPIO.output(gpio['pin'], GPIO.HIGH)
if __name__ == '__main__':
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
# gpio_setup()

try:
# 请根据实际情况改变MQTT代理服务器的IP地址及账户密码认证
#client.username_pw_set(username,password)
client.connect("xxx.xxx.xxx.xxx", 1883, 60)
client.loop_forever()
except KeyboardInterrupt:
client.disconnect()
gpio_destroy()
发送数据为 {"pin":12,"value":1}
硬件开发
2016-06-14 11:41:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
帮助和提供一些使用Make in China的J-LINK 同学解决无并口烧录NorFlash的方案:
1)打开jlink command程序然后输入:
CMD#speed 12000 /*设置TCK为12M,设置下载速度*/
CMD#r CMD#h CMD#loadbin e:\init.bin 0 /* 下载内存初始化程序到0x0地址处*/
CMD#h /*次命令是暂时挂起CPU*/
CMD#setpc 0x0 /*设置初始化SDRAM的代码,此段代码一般SDK都有,可以直接使用对应平台的裸机代码*/
CMD#g /* 执行内存初始化程序*/
CMD#h CMD#loadbin e:
硬件开发
2016-06-12 16:47:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
0 预备 端口 :在OSAL中,为每个子程序分配了一个端口号task_id。 事件 :OSAL的运行是依赖事件进行的。每个事件都有对应的task_id,一个task_id可以对应多个事件。这些事件相当于一个个小的子线程。这些事件什么时候运行是由用户编程实现的。一般的,每个事件会有特定的标志位,这个标志位由特定的操作触发,比如在时间性事件中,当到达特定时间时,其标志位便会被置为1。通过查询这些标志位,我们可以决定是否运行某些事件。 HAL_ENTER_CRITICAL_SECTION(x) HAL_EXIT_CRITICAL_SECTION(x) 是将定时器4的计数器EA的值保存起来,并置EA的值为0,相当于禁止了定时器4的中断 是设置EA的值为给定值,这两个函数经常配合使用。
1 Main函数
安装好的zigbee协议栈中有示例程序,路径在Texas Instruments\ZStack-CC2530-2.5.1a\Projects\zstack\Samples\SampleApp\CC2530DB中,打开路径下面的工程就可以在IAR中查看这个示例程序了。
我们将会一眼看到ZMain并顺手打开ZMain.c文件
看到主函数 int main( void ) ,它在执行了一系列的初始化函数后,便会执行 osal_start_system() ,双击这个函数然后右键跳转到定义,于是我们看到了熟悉的永无止尽的循环 void osal_start_system( void ) { #if !defined ( ZBIT ) && !defined ( UBIT ) for(;;) // Forever Loop #endif { osal_run_system(); } }
当程序开始执行,它就会通过循环 osal_run_system() 不断的运行这个系统,而这个系统就是被称为OSAL的操作系统。于是我们的重点自然就落到了函数 osal_run_system() 上,不过在此之前,我们先来看osal初始化时做了些什么。
2 初始化OSAL
回到之前的主函数,在很多初始化函数中会看到 osal_init_system() ,这个就是osal系统的初始化函数。从 osalInitTasks() 进入,在这个函数的最后一行,就是 SampleApp_Init() ,这是示例程序在应用层的初始化函数,我们也可以将自己想要做的初始化操作函数放到这里来。从 SampleApp_Init 进入,就来到了 SampleApp.c 文件,这个文件位于
这里是应用层,而大部分的应用功能都写在了这里。
重新回到 osalInitTasks() 可以看到函数下的每个初始化的操作函数都分配了一个taskID,这个taskID相当于应用程序的端口号。因为其是8位的,因此最多能有255个端口号,其中包含了一些特殊的端口号。此处还申请了一个 tasksEvents 数组,每个taskID将对应其中的一个 tasksEvents[x] 。
tasksEvents[x] 是一个16位的标志位集合,一个事件使用一个标志位,一个 tasksEvents[x] 下可以有16个事件,当到达事件的发生时间时,会将这个标志位置为1。在示例程序中,在 SampleApp.c 中自定义了一个名为 SAMPLEAPP_SEND_PERIODIC_MSG_EVT 的事件,它使用了第一位的标志位,因此其值是 0x0001 。另外与 osalInitTasks() 在同一个文件中,有一个函数指针数组 tasksArr[] ,这个数组与端口号一一对应,其作用在下文可以看到。
3 OSAL的Timer链表
osal维护了一个链表,其节点的数据结构如下 typedef struct { void *next; uint16 timeout; uint16 event_flag; uint8 task_id; uint16 reloadTimeout; } osalTimerRec_t;
我们暂且叫它 计划表 。计划表中的每个节点包含5个数据,第一个是指针,指向下一个节点,第二个是执行时间,第三个是事件标志位,第四个是端口,第六个是重载时间。通过以下函数 uint8 osal_start_timerEx( uint8 taskID, uint16 event_id, uint16 timeout_value ) uint8 osal_start_reload_timer( uint8 taskID, uint16 event_id, uint16 timeout_value )
都可以将一个新的事件注册到计划表里面,不同的是后者为 reloadTimeout 赋了值,其值等于传进去的参数 timeout_value ,这个区别将在下文说到。
每次进入 osal_run_system() ,先执行更新时间的操作 osalTimeUpdate() ,这个函数先读取定时器2的计数(定时器2是专为mac层提供定时服务的),经过计算后将经过的时间(从上一次更新时间到当前的值)的毫秒数赋值给 elapsedMSec ,单位是毫秒。并判断 elapsedMSec 是否有值,即超过1ms的话就执行两个更新操作,分别是 osalClockUpdate( elapsedMSec ); osalTimerUpdate( elapsedMSec );
第一个函数更新了系统的时间值,确切说是系统的秒数以及系统的毫秒数。第二个函数遍历了链表即 计划表 。一个个节点遍历,首先会判断当前节点的 timeout 是否小于 elapsedMSec ,大于执行
timeout = timeout - elapsedMSec ,
小于,则说明当前节点代表的事件到了执行时间了,根据节点的task_id和event_flag可以找到在tasksEvents数组下的该节点的事件标志位,并将其置为1。接下来判断 reloadTimeout 是否大于0,大于0便将这个值赋值给timeout。这样事件标志就可以在下次到期时被触发,reloadTimeout决定了这个事件是周期事件还是仅仅只发生一次。
回到 osal_run_system() ,在 osalTimeUpdate() 之后,是 Hal_ProcessPoll() ,这个函数主要是去查询硬件上是否触发了其他事件。
4 对事件进行处理
通过上文已经可以知道,当我们将一个事件注册到链表 计划表 里面时,便可以在特定时间将这个事件对应的事件标志置为1,于是通过查询这个标志就可以知道事件是否应该发生了。而所有的事件的标志位其实都在 tasksEvents 数组中,这么多的事件,系统每次却只处理一个事件,所以都得排着队来处理。系统检索 tasksEvents 的每个元素是否有值,有则说明这个端口对应的事件至少有一个被触发,然后从 tasksArr 数组中选择端口对应的函数指针进行调用。比如示例程序中应用层的回调函数指针是 SampleApp_ProcessEvent ,而函数的主体则是位于应用层SamleApp.c文件中 uint16 SampleApp_ProcessEvent( uint8 task_id, uint16 events )
回调时的传参分别是task_id端口号和events该端口号下的事件触发标志。示例程序在 SampleApp_ProcessEvent 中,第一步先检查定义的系统事件是否被触发,假如没有,就判断 SAMPLEAPP_SEND_PERIODIC_MSG_EVT ,一个示例程序定义的事件是否被触发,触发了就执行发送信号的操作。无论是哪种事件,最后都需要手动清零标志位,这就是为什么我们会看到类似这种写法,之所以return是因为一次只处理一个事件 return (events ^ SAMPLEAPP_SEND_PERIODIC_MSG_EVT);
总结一下,在应用层,可以自定义事件,并把它注册到链表中去,然后可以在回调函数中判断事件是否发生并提供关于事件的处理方法。
硬件开发
2016-06-09 21:06:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
Arduino可穿戴开发入门教程Windows平台下安装Arduino IDE
Windows平台下安装Arduino IDE
Windows操作系统下可以使用安装向导和压缩包形式安装。下面详细讲解这两种方式。
1. Arduino IDE Windows安装向导方式
Windows安装向导方式安装和绝大多数Windows应用程序安装类似,只需要直接运行下载的.exe文件即可。例如1.6.0版本的安装向导方式的文件名为arduino-1.6.0-windows.exe。直接双击该文件即可开始安装。
(1)首先进入的是浏览协议对话框,如图2.7所示。
(2)在阅读了协议之后,单击“I Agree”按钮进入安装选项对话框,如图2.8所示。
图2.7 安装协议 图2.8 安装选项
(3)在这一步中,有4个可供用户选择的项目,如图2.9所示。各个选项的含义如下:
Install USB driver:安装USB驱动,这个选项通常选中为好,否则硬件有可能不能正确地运行; Create Start Menu shortcut:在开始菜单创建快捷方式,这个可以根据自己的喜好选择; Create Desktop shortcut:在桌面创建快捷方式,这个选项通常选中为好,可以使你更容易打开Arduino IDE; Associate .ino files:关联.ino文件,这个选项通常选中为好。这可以使你直接使用Arduino IDE打开后缀为.ino的文件。Arduino IDE的源文件就是以.ino为后缀保存的。
(4)在配置了合适的选项之后,就可以单击“Next >”按钮进入安装文件夹选择对话框,如图2.10所示。
图2.9 安装选项 图2.10 安装文件夹
(5)这一步要完成的是选择Arduino IDE要安装的目标文件夹,在选择合适的安装目录之后,就可以单击“Install”按钮开始安装了,如图2.11所示。
(6)在进度条充满之后,安装就完成了。此时左下角的“Close”按钮变为可用状态,如图2.12所示。
图2.11 安装过程 图2.12 安装完成
(7)单击“Close”按钮,完成Arduino IDE的安装。
2. Arduino IDE 压缩包形式安装
压缩包形式的安装就非常简单了,只需要使用压缩工具打开后缀为.zip的压缩包,并将其中的内容解压缩到期望的位置即可。
(1)1.6.0版本压缩包形式的文件名是arduino-1.6.0-windows.zip。笔者使用的解压缩工具是7-Zip。在该压缩文件上单击鼠标右键,在打开的菜单中选择“7-Zip”选项,并在下级菜单中选择“打开压缩包”命令,如图2.13所示。
图2.13 使用7-Zip打开
(2)使用压缩工具打开Arduino IDE的压缩包之后可以看到只有一个以版本命名的文件夹,如图2.14所示。
图2.14 压缩包中的内容
(3)现在的解压缩工具一般支持拖拽的方式,所以在你选择好你的目标文件的时候,直接将整个“Arduino-1.6.0”拖拽到其中即可,这就完成了Arduino IDE的安装。
本文选出自: Arduino可穿戴开发入门教程转载请注明出处,尊重技术尊重IT人!
硬件开发
2016-06-06 10:27:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
1.在线激活 菜单 help >>>> Register 选择 License Server 输入 http://idea.qinxi1992.cn/


2.本地激活
以上需要在联网的环境下,如果没有网络则提示没有激活:
下载
http://idea.qinxi1992.cn/jar/JetbrainsCrack-2.5.3.jar
放到phpstorm安装目录下的lib文件夹
如放到f盘 F:\Program Files (x86)\JetBrains\PhpStorm 2016.1\lib\JetbrainsCrack-2.5.3.jar 选择菜单 help >>>> Edit Custom VM options 如果没有会提示创建,进行创建,打开文件 最后面加入 一行 -javaagent:F:\Program Files (x86)\JetBrains\PhpStorm 2016.1\lib\JetbrainsCrack-2.5.3.jar 后面是补丁的路径,根据自己放的位置修改,保存文件,关闭并重新打开phpstorm
到网站 http://15.idea.lanyus.com/ ,生成一个激活码
菜单 help >>>>Register
选择Activation Code 将验证码粘贴进去 激活...
原文在这里: http://idea.lanyus.com/ 感谢大神.
硬件开发
2016-06-06 10:09:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
相对于使用c语言指针操作寄存器地址直接设置寄存器数据,标准库使用c语言结构体和函数对mcu外设进行了封装。由于c没有面向对象机制,所以只能使用结构体来封装 外设对象的属性,函数来实现对外设对象的行为操作。
对于GPIO每个外设一般都对应多个寄存器,如控制寄存器、数据寄存器、时钟寄存器等,每个寄存器最多32位,可实现很多种设置。因此采用了结构体 + 枚举 进行封装。
PPP_InitTypeDef 用来定义外设对象结构体和直接属性,每个属性对应一个寄存器枚举类型PPPxxx_TypeDef,属性(寄存器)枚举类型包含了对该寄存器的所有可能设置。
另外有些外设没有使用枚举的方式定义寄存器的可选值,而是采用定义多个常量宏方式,这时PPP_InitTypeDef 属性仍然对应一个寄存器可能的值。
所以,无论使用枚举还是宏的方式定义寄存器可选值,最终都通过PPP_InitTypeDef来设置外设寄存器。
实现对寄存器设置的函数为PPP_Init,设置好外设对象的结构体后,调用该函数即完成对 对象寄存器的初始化配置。
由于普通的IO(GPIO)是独立工作的,只需要控制其输出高低电平即完成工作,所以一般不需要其它操作,当然如果需要使用GPIO模拟其它功能,这时就需要标准库定义的其它函数,如读数据、写数据、设置复用功能等。
具体到stm32的外设,由于stm32 芯片的管脚除了电源、极少数独立功能引脚,剩下的都是GPIO,所有具体外设功能都是从这些GPIO复用而来,因此要想使用某功能,需要通过GPIO_PinAFConfig 设置该GPIO引脚要复用的功能。
另外,考虑到低功耗的设计,stm32的所有外设功能可以独立设置开启和关闭,对应外设的时钟也需要独立开启和关闭,如果该外设的时钟没有开启,无论怎样外设都不会工作。
对于其它外设,一般都需要遵守某个协议才能使用,如通信类的i2c、spi、UART管脚,需要先熟悉协议,了解是否需要时钟同步、数据收发的格式等其它协议规范,然后按照规范通过函数操作外设寄存器,实现具体外设功能。
无论使用什么外设,必须根据硬件原理图,确定具体使用的管脚才能进行开发。硬件的通信一般都是在特定时钟频率下发送一系列特定格式的帧(高低电平)来实现的。
具体到显示外设,则必须有基本的字库实现对ascii码的解析才能显示文字,中文还需要中文字库。
stm32标准库是对寄存器的封装及直接操作,如果不熟悉外设结构和外设寄存器或者相关外设的通信协议、原理,则没法使用相关函数。
硬件开发
2016-06-03 15:59:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
Arduino可穿戴开发入门教程Arduino开发环境介绍
Arduino开发环境介绍
Arduino不像我们使用的PC端操作系统一样,可以直接在操作系统中安装软件为操作系统编程。Arduino的软件开发部分需要在PC端进行,硬件只负责执行编译好的程序。所以,本章就来详细地介绍一下Arduino IDE的安装和一些主要的操作。
Arduino IDE
Arduino IDE是在电脑端用来为Arduino进行程序开发的集成开发环境。Arduino开发程序通常需要使用到编辑器、编译器以及上传工具,Arduino IDE集所有这些工具为一身。所以,我们只需要安装Arduino IDE就可以囊括全部的Arduino软件开发工具。
Arduino IDE安装包下载
Arduino IDE可以在三大主流操作系统(Windows、Linux以及Mac OS X)中部署,但是鉴于笔者并没有运行Mac OS X的设备,因此这里只为读者介绍在Windows和Linux平台中Arduino IDE相关的知识。
1.版本的选择
在本书编写的时候,Arduino IDE最新的版本是1.6.0。虽然在读者得到本书的时候IDE的版本可能已经迭代了多次。但是,他们在使用上以及兼容性上不会出现太大的变化。所以,读者在选择Arduino IDE的时候选择当前的最新版本下载即可。
Arduino IDE下载的地址为:http://arduino.cc/en/Main/Software。图2.1显示了Arduino提供的IDE版本。
图2.1 Arduino IDE版本
其中,图2.2显示了Arduino IDE最新的1.6.0版本各平台的下载。
图2.2 各平台下载
图2.3显示了之前版本的下载链接。
图2.3 早期版本下载 图2.4为Intel提供的特殊IDE

图2.4显示了为Intel Galileo和Intel Edison两种硬件提供的特殊IDE,由于我们使用的是LilyPad所以不会选择这里的IDE。
2.平台的选择
如果你使用的是Windows操作系统,那么就选择如图2.5所示的两个链接中的一个进行下载。

图2.5 Windows系统下载 图2.6 Linux平台
其中,Windows Installer是Windows操作系统下常见的向导形式的安装包。Windows ZIP file for non admin install则是压缩形式的安装包。它是为没有管理员权限的用户准备的。当然如果你喜欢“绿色版”,也可以选择下载这种形式的安装包。
如果你使用的是Linux操作系统,那么就需要根据你的操作系统选择如图2.6所示链接中的一个进行下载。
Linux平台的Arduino IDE区分32位和64位版本。在Linux操作系统中,可以通过在终端中执行uname –r命令来获取平台信息,如下是笔者使用的Linux系统输出的信息:
$ uname -r 3.18.3-201.fc21.x86_64

其中的x86_64表明了这是一个64位Linux操作系统,所以应该选择Linux 64bit进行下载;如果输出中出现的是ix86字眼,则说明你的系统是32位的,需要选择Linux 32bit进行下载。
Arduino IDE在Linux和Windows操作系统下的安装方式比较简单,下面分别进行介绍。
本文选出自: Arduino可穿戴开发入门教程转载请注明出处,尊重技术尊重IT人!
硬件开发
2016-06-03 14:19:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
Arduino可穿戴开发入门教程LilyPad和LilyPad Simple的介绍
LilyPad和LilyPad Simple的介绍
LilyPad和LilyPad Simple是LilyPad微控制器板的两个主要变型。他们是本书的核心,所以在开始使用之前,我们应该大致了解一些它具备哪些能力。
LilyPad
LilyPad是一个小型可穿戴CPU,它可以被缝在织物上通过导线控制其它外设,如前面我们介绍过的输入输出模块。LilyPad的核心是ATmega328V微控制器(板子中间的正方形),我们所有的工作都是围绕它展开的。
LilyPad有22个端口,它们以花瓣状环绕在板子的周围。其中,两个端口是电源(+和-)。其他20个端口就可以用来控制各种外设。这20个端口分别为0~13和A0~A5。其中:
0和1号端口可以被服用为串口通讯端口; 所有20个端口都可以被用作数字输入输出端口; A0~A5端口具有模拟输入功能; 3、5、6、9、10和11端口具有PWM输出功能。 13号端口连接了一个板载LED,如图1.30所示。
图1.30 板载LED 图1.31 六针插座

板子上方的六针插座是用来连接编程器为板子编程的,如图1.31所示。
以上这些端口的特殊功能我们都将在实际使用时候介绍,所以在这里就不再详述。
LilyPad Simple
从名字上就可以看出,LilyPad Simple是LilyPad的简化版本,它的简化体现在了端口上。它只引出了11个端口。除了电源之外就剩下9个了,它们分别是5、6、9、10、11和A2~A5。它们的功能和LilyPad完全一致。
当然,LilyPad Simple虽然减少了输出端口,但是增加了一个电源插座,它可以直接使用对应规格的外部电源,如图1.32所示。
图1.32 电源插座
本文选出自: Arduino可穿戴开发入门教程转载请注明出处,尊重技术尊重IT人!
硬件开发
2016-06-03 10:06:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
#使用homebrew安装pebble sdk
安装 pebble cli工具
brew install pebble-sdk
安装好后我们有了命令行工具 pebble 这时候sdk还没有实际安装,试着 pebble --version 检验是否正确
安装最新版sdk
###在线安装 pebble sdk install latest
同意了开发者协议即可开始下载sdk并安装。不过由于在本地试验一直下载失败,所以考虑使用离线安装
###离线安装
首先确定sdk版本号,可以通过 pebble sdk list 查看可用的版本 Installed SDKs: Available SDKs (beta channel): 3.12-beta6 (beta) 3.11.1 3.11 3.10.1 3.10 3.10-beta6 (beta) 3.10-beta2 (beta) 3.10-beta1 (beta) 3.9.2 3.9 3.9-beta8 (beta) 3.9-beta7 (beta) 3.9-beta5 (beta) 3.8.2 3.8.1 3.8 3.8-beta12 (beta) 3.8-beta10 (beta) 3.8-beta8 (beta) 3.7 3.6.2 3.4 3.3 3.2.1 3.1 3.0 2.9
目前(2016.6.1)的最新版本为3.12,所以下载下面这个sdk离线包(大小2.9M), http://s3.amazonaws.com/assets.getpebble.com/sdk3/release/sdk-core-3.12.tar.bz2
下载完毕后进入文件所在目录执行
pebble sdk install sdk-core-3.12.tar.bz2 完成安装
开始开发
终于到了开始开发的阶段,我所用的工具为pebble + vim 来开发,(目前还没完全解决让ycm支持pebble略微遗憾)
新建工程
pebble new-project hello_world
Build cd hello_world pebble build
仿真测试
pebble 有一个仿真环境来测试我们的程序显示效果,很方便
pebble install --emulator basalt
执行上面这句话后 刚刚那个默认应用就安装到仿真环境上了
实体键盘的上下左右对应的虚拟按键为: up -> up, down-> down , left->back , right->select
如果将应用类型改为watchface(修改工程目录里的appinfo.json watchapp.watchface ),那么按键将无法被应用捕捉到(因为up,down会切到timeline上去)
硬件开发
2016-06-01 14:15:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
myeclipse-10.7.1-offline-installer-windows
链接: http://pan.baidu.com/s/1qYtKFRu 密码:7tw9
Myeclipse10汉化
链接: http://pan.baidu.com/s/1i5ezVE1 密码:ayc6
MyEclipse10破解
链接: http://pan.baidu.com/s/1c0sQyq 密码:hfs1
JDK1.n
链接: http://pan.baidu.com/s/1b30z2Q 密码:hrmr
硬件开发
2016-06-01 10:41:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
banana pi 与全志科技携手参加2016年台北电脑展(computex TAIBEI 2016)
2016年COMPUTEX(台北国际电脑)即將于5月31日至6月4日盛大展出,今年该展全新定位─「建构全球科技生态系」结合「物联网技术应用」、「创新与新创」、「商业解决方案」及「电竞」等四大主题,將以崭新样貌全面出击。针对「物联网」,COMPUTEX今年首度成立SmarTEX展区,位于世贸一馆;而针对新创与创新议题,则成立InnoVEX展区,位于世贸三馆。
Banana pi团队与全志科技紧密合作,携全系列banana pi开发板参加此次展会。与全志共同推动开源,教育,公益的banana pi开源项目,并进行了深入交流,今后将全面进行开源硬件,VR,智能硬件领域的相关合作
全志科技媒体见面会
Justin在媒体见面会上做Banana Pi开源项目专题报告
Banana Pi 全系列产品在COMPUTEX展出
Banana Pi团队Nora接受媒体采访
allwinner 全志科技VR体验区
Banana Pi 项目由台湾鸿海(富士康)与大陆源创通信(SINOVOIP)共同推动,为两岸合作开源项目树立了一个优良典范。
硬件开发
2016-05-31 20:01:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
前言:生命不息,折腾不止。这是一种对生命的认知及态度。吾本是学软件的,但由于大学期间接触到的社团有搞硬件的,看到他们搞的遥控小车,小四轴。。。觉得他们好geek,于是也对硬件愈发的感兴趣。业余时间研究一下硬件,积累了一点硬件知识。一直期盼着做一个小项目来实战一下。某日在arduino论坛发现了一位大神的作品是用微信控制arduino的,于是在他的作品上演译了一番。
硬件:
arduino uno(¥25/一块,原谅我穷B只能用山寨的了),
enc28j60(¥13/一块,以太网模块),DHT11(温湿度传感器,便宜),MQ-2(烟雾传感器,也不贵)
led(在废弃家电上扒下来的),
杜邦线(若干根,焊工好的话,可以从废弃家电上扒下来再用来焊接)。
帐号准备:微信公众号或测试号,新浪云帐号(新浪云免费的空间足够使用,由于最近学了springmvc,想用java写,但java环境初期都要收费,无奈只好用原文的php)。
硬件接线:arduino uno 与 enc28j60
Enc28j60 Arduino UNO
VCC 3.3V
GND GND
SCK Pin 13
SO Pin 12
SI
CS
Pin 11
Pin 10

arduino uno与DHT11接线说明
arduino uno与MQ-2接线说明
实物:

一切线路okay!下面准备烧录程序:(使用arduino ide将下面代码烧录进uno板,两个库文件需要放进ide的libraries下:文件) // // FILE: dht_test.pde // PURPOSE: DHT library test sketch for Arduino // #include #include #define DHT11_PIN 6//put the sensor in the digital pin 6 EthernetClient client; signed long next; char server[] = "1.smarthousetest.applinzi.com"; char state = '0'; char c; unsigned long lastConnectionTime = 0; boolean lastConnected = false; const unsigned long postingInterval = 200*1000; double temperature=0; double humidity=0; double smoke=0; int ledPin=2; //设定控制LED的数字IO脚 dht DHT; void setup() { Serial.begin(9600); Serial.println("DHT TEST PROGRAM "); Serial.print("LIBRARY VERSION: "); Serial.println(DHT_LIB_VERSION); Serial.println(); Serial.println("Type,\tstatus,\tHumidity (%),\tTemperature (C)"); // 设置串口通信波特率 uint8_t mac[6] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xE1}; IPAddress myIP(192,168,0,110); Serial.println("*****"); Ethernet.begin(mac,myIP); Serial.print("My IP address: "); Serial.println(Ethernet.localIP()); pinMode(5,OUTPUT); } void loop() { // READ DATA Serial.print("DHT11, \t"); int chk = DHT.read11(DHT11_PIN); switch (chk) { case 0: Serial.print("OK,\t"); break; case -1: Serial.print("Checksum error,\t"); break; case -2: Serial.print("Time out error,\t"); break; default: Serial.print("Unknown error,\t"); break; } // DISPLAT DATA Serial.print(DHT.humidity,1); Serial.print(",\t"); Serial.println(DHT.temperature,1); temperature=DHT.temperature; humidity=DHT.humidity; temperature=DHT.temperature; if(state == '0'){ digitalWrite(5, LOW); }else if(state == '1'){ digitalWrite(5, HIGH); } smoke=analogRead(0); Serial.println(smoke,DEC); if(smoke>=300){//烟雾浓度值大于300时,自动亮 digitalWrite(ledPin,HIGH); //设定PIN5脚为LOW = 0V }else{ digitalWrite(ledPin,LOW); //设定PIN5脚为LOW = 0V } while(client.available()) { c = client.read(); if (c == '{'){ state = client.read(); } Serial.println(state); } if (!client.connected() && lastConnected) { Serial.println("disconnecting**."); client.stop(); } if(!client.connected()) { Serial.println("!client.connected()"); if (client.connect(server, 80)) { Serial.println(client.connect(server, 80)); // send the HTTP PUT request: client.print("GET /update.php?token=smarthouse&temperature="); client.print(temperature); client.print("&humidity="); client.print(humidity); client.print("&smoke="); client.print(smoke); client.println(" HTTP/1.1"); client.println("Host: 1.smarthousetest.applinzi.com");//项目url client.println("Connection: close"); client.println(); lastConnectionTime = millis(); }else { Serial.println("connection failed"); Serial.println("disconnecting.////"); client.stop(); } } lastConnected = client.connected(); delay(1000); } // // END OF FILE //
烧录完成,则将服务器端的项目部署上去。部署步骤省略
index.php: FromUserName; $toUserName = $xmlObj->ToUserName; $msgType = $xmlObj->MsgType; if($msgType == 'text'){ $content = $xmlObj->Content; }else{ $retMsg = '只支持文本和语音消息'; } if (strstr($content, "温度")) { $con = mysql_connect(SAE_MYSQL_HOST_M.':'.SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS); mysql_select_db("app_smarthousetest", $con); $result = mysql_query("SELECT * FROM sensor_data"); while($arr = mysql_fetch_array($result)){ if ($arr['ID'] == 0) { $tempr = $arr['temperature']; } } mysql_close($con); $retMsg = "亲爱的主人,你的房间的温度为".$tempr."℃。"; }else if(strstr($content, "湿度")) { $con = mysql_connect(SAE_MYSQL_HOST_M.':'.SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS); mysql_select_db("app_smarthousetest", $con); $result = mysql_query("SELECT * FROM sensor_data"); while($arr = mysql_fetch_array($result)){ if ($arr['ID'] == 0) { $tempr = $arr['humidity']; } } mysql_close($con); $retMsg = "亲爱的主人,你的房间的湿度为".$tempr."%"; }else if(strstr($content, "烟雾浓度")) { $con = mysql_connect(SAE_MYSQL_HOST_M.':'.SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS); mysql_select_db("app_smarthousetest", $con); $result = mysql_query("SELECT * FROM sensor_data"); while($arr = mysql_fetch_array($result)){ if ($arr['ID'] == 0) { $tempr = $arr['smoke']; } } mysql_close($con); $retMsg = "亲爱的主人,你的房间的烟雾浓度值为".$tempr; }else if (strstr($content, "开灯")) { $con = mysql_connect(SAE_MYSQL_HOST_M.':'.SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS); $dati = date("h:i:sa"); mysql_select_db("app_smarthousetest", $con); $sql ="UPDATE led_data SET create_time='$dati',status = '1' WHERE ID = '0'";//修改开关状态值 if(!mysql_query($sql,$con)){ die('Error: ' . mysql_error); }else{ mysql_close($con); $retMsg = "好的"; } }else if (strstr($content, "关灯")) { $con = mysql_connect(SAE_MYSQL_HOST_M.':'.SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS); $dati = date("h:i:sa"); mysql_select_db("app_smarthousetest", $con); $sql ="UPDATE led_data SET create_time='$dati',status = '0' WHERE ID = '0'";//修改开关状态值 if(!mysql_query($sql,$con)){ die('Error: ' . mysql_error()); }else{ mysql_close($con); $retMsg = "好的"; } }else{ $retMsg = "暂时不支持该命令"; } //XML信息 $retTmp = " %s 0 "; $resultStr = sprintf($retTmp, $fromUserName, $toUserName, time(), $retMsg); //反馈到微信服务器 echo $resultStr; ?>

update.php

数据库:
sensor_data
id id int
温度 temperature float
湿度 humidity float
烟雾浓度
创建时间
smoke
create_time
float
dataTime
led_data
id id int
状态
创建时间
status
create_time
int
dataTime

一切基本完成,就差将申请的微信公众号,使用开发者模式,将url填写为项目的url,这里的为:1.smarthousetest.applinzi.com。token则为:smarthouse。

下面就是正式的调用了,关注公众号后,则可实现如下图功能:


折腾多时,终于完成!




































硬件开发
2016-05-31 09:05:00
「深度学习福利」大神带你进阶工程师,立即查看>>>

#include
#include
#include
#include
#include "utility/debug.h"
#define WiDo_IRQ 7
#define WiDo_VBAT 5
#define WiDo_CS 10
Adafruit_CC3000 WiDo = Adafruit_CC3000(WiDo_CS, WiDo_IRQ, WiDo_VBAT,
SPI_CLOCK_DIVIDER); // you can change this clock speed
#define WLAN_SSID "Tenda_XXXXX" // cannot be longer than 32 characters!
#define WLAN_PASS "12345678"
// Security can be WLAN_SEC_UNSEC, WLAN_SEC_WEP, WLAN_SEC_WPA or WLAN_SEC_WPA2
#define WLAN_SECURITY WLAN_SEC_WPA2
#define TIMEOUT_MS 2000
void setup(){

Serial.begin(115200);
/* Initialise the module */
Serial.println(F("\nInitialising the CC3000 ..."));
if (!WiDo.begin())
{
Serial.println(F("Unable to initialise the CC3000! Check your wiring?"));
while(1);
}

/* NOTE: Secure connections are not available in 'Tiny' mode!
By default connectToAP will retry indefinitely, however you can pass an
optional maximum number of retries (greater than zero) as the fourth parameter.
*/

Serial.println(F("Connecting Router/AP"));
if (!WiDo.connectToAP(WLAN_SSID, WLAN_PASS, WLAN_SECURITY)) {
Serial.println(F("Failed!"));
while(1);
}

Serial.println(F("Router/AP Connected!"));

/* Wait for DHCP to complete */
Serial.println(F("Request DHCP"));
while (!WiDo.checkDHCP())
{
delay(100); // ToDo: Insert a DHCP timeout!
}
}
void loop(){

static Adafruit_CC3000_Client tcpClient;
static unsigned long heartRate = millis();

if(!tcpClient.connected()){
Serial.println("Try to connect the Local Server");
tcpClient.close();

/* Set the target ip address and connection port */
uint32_t ip = WiDo.IP2U32(192,168,0,12);
tcpClient = WiDo.connectTCP(ip, 8080);

if(!tcpClient.connected()){
Serial.println(F("Couldn't connect to server! Make sure TCP Test Tool is running on the server."));
while(1);
}
}
else if(millis() - heartRate > 1000){
heartRate = millis(); // Update time stamp of the microcontroller system

char clientString[30];
sprintf(clientString, "%s%d%s", "Wido heartRate: ",heartRate/1000," s\r\n");

Serial.println(clientString);
tcpClient.fastrprintln(clientString);
}

/* Read data until either the connection is closed, or the timeout is reached. */
unsigned long lastRead = millis();
while (tcpClient.connected() && (millis() - lastRead < TIMEOUT_MS)) {
while (tcpClient.available()) {
char c = tcpClient.read();
Serial.print(c);
lastRead = millis();

// Disable sending message for a moment
heartRate = millis();
}
}
}
硬件开发
2016-05-30 17:24:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
首先导入STM32固件库文件 STM32F1百度云盘地址 密钥:pzad
硬件开发
2016-05-29 05:20:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
首先我们需要一个linux系统
装一个Linux系统
推荐:装一个虚拟机(VirtualBox+Ubuntu)
参考 http://blog.sina.com.cn/s/blog_88534dff01010455.html
1.交叉编译工具:gcc-arm-none-eabi 点击百度云下载 密钥:gr4r
2.jlinke调试工具:openocd
测试环境配置: $ cd /usr/share/openocd/scripts $ openocd -f interface/jlink.cfg -f target/stm32.cfg
硬件开发
2016-05-29 00:15:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
任务:在 OpenWRT 路由器 C 用公钥验证方式登录另一台 OpenWRT 路由器 S。
现象:一开始配置完很顺利登录,后来进行一些操作后,居然登录不了了,提示输入密码……
类似情况: https://github.com/rssnsj/openwrt-hc5x61/issues/99

  一开始也以为是 OpenWRT 版本的问题,从 dd trunk 降到 cc,无用。再降到 bb,发现没问题了,因为 bb 没有 sshtunnel,最后把怀疑对象锁定到 sshtunnel。
  sshtunnel 是基于 openssh 的,在装 sshtunnel 时,openssh 会作为依赖项被装上,然后替换了系统自带的 dropbear 客户端,所以后来使用的 ssh 是 openssh,但私钥文件却是一开始用 dropbearkey 产生的……两者并不兼容。
  正确的做法是:装上 openssh-keygen,然后用 ssh-keygen 产生新的私钥,再用 ssh-keygen -y -f ~/.ssh/id_rsa 打印公钥。
硬件开发
2016-05-26 10:12:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
解压官方标准库后,根目录有一个chm文档,该文档包含了标准库使用的基本信息。文档由在源码或readme文件中的内容自动生成,内容很多但没有条理,需要注意查询方法。
主要功能
1、库结构及使用描述
2、寄存器结构、地址映射和外设声明
其中寄存器结构页面没有直接注释,需要点击下面的文件行数进入定义该结构的文件查看注释
3、外设驱动函数
如GPIO,包括管脚定义和使用函数等
硬件开发
2016-05-25 17:46:00
「深度学习福利」大神带你进阶工程师,立即查看>>> http://www.stmcu.org/ http://www.stmcu.com.cn/ http://www.cnblogs.com/51mcu/p/3330444.html http://www.st.com/content/st_com/zh.html http://www.openedv.com/forum.php http://www.chuxue123.com/ http://www.elecfans.com/tags/STM32/ http://bbs.21ic.com/iclist-49-1.html http://www.ing10bbs.com/forum.php http://bbs.armfly.com

RTOS http://www.rt-thread.org/ https://www.micrium.com
http://tieba.baidu.com/f?kw=stm32&fr=ala0&tpl=5 http://tieba.baidu.com/f?kw=%E5%8D%95%E7%89%87%E6%9C%BA&frs=yqtb

st官网使用说明
在st全球官网http://www.st.com,的MCUs Embedded Software 频道,可以获取所有官方信息,包括软件和文档。
需要说明的是,大多数情况,我们可能会用到顶部的搜索框,如果此时是英文语言,则搜索结果一般为英文资料,如果为中文语言,则搜索结果为中文资料,如果中文资料不能满足要求,可以换成英文后搜索。
在该频道主页右侧,有product tree 和resources两个连接,分别用于查询软件和文档。
硬件开发
2016-05-24 11:10:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
MDK
http://www.keil.com/arm/mdk.asp
MDK-ARM(Microcontroller Development Kit) 是功能强大和常用的cortex-mx 开发环境。
其包含 µVision4 IDE,最新版本需要根据mcu的系列下载不同的pack包( http://www.keil.com/dd2/Pack/ )以支持特定设备,目前stm32库开发方式有两种,一种是最新的cube方式,另一种是传统的标准库方式,如果使用前者,不需要下载其它东西即可,如果需要stm的标准库开发方式,还需单独下载st官方的标准库。
因为标准库方式之前比较主流,参考资源较多,这里先学习标准库方式。
官方标准固件库
链接
Home 》Embedded Software 》MCUs Embedded Software 》STM32 Embedded Software

首页 》 软件 》 微控制器软件 》 STM32微控制器软件
在灰色的导航中选择 STM32 standard peripherals library,然后根据需要的型号进入对应页面,在页面最底部提供软件下载地址(需要输入邮箱)
如何使用标准库
解压下载的标准库压缩包,目录结构如下:
├── _htmresc
├── Libraries
│ ├── CMSIS 符合cmsis规范的cortex核心驱动
│ └── STM32F4xx_StdPeriph_Driver stm32外设驱动
├── Project
│ ├── STM32F4xx_StdPeriph_Examples 各外设使用例子有效代码(基于官方评估板)
│ └── STM32F4xx_StdPeriph_Templates 例子的公共部分模版
└── Utilities
├── Media
├── ST
├── STM32_EVAL 例子中可能用到的其它评估板代码
└── Third_Party
上面是对基本目录的解释,另外根目录有个chm帮助文件,关于固件库的一切信息都可以在这个帮助里找到。
重要文件说明
File name Description
stm32f4xx_conf.h 在 stm32f4xx.h被引用(如果定义了宏USE_STDPERIPH_DRIVER)
位于库目录下的每个实例项目和模版目录,用于配置应用需要哪些外设驱动
This file can also be used to enable or disable the Library run-time failure detection before compiling the firmware library drivers, through the preprocessor define USE_FULL_ASSERT
stm32f4xx_ppp.h stm32外设驱动头文件,位于 Libraries\STM32F4xx_StdPeriph_Driver
This file includes the PPP peripheral function and variable definitions used within these functions.
stm32f4xx_ppp.c stm32外设驱动,位于 Libraries\STM32F4xx_StdPeriph_Driver
stm32f4xx_it.h
stm32f4xx_it.c
中断控制原型,位于 库目录实例和模版目录,实例中没有被引用过
Template source file containing the interrupt service routine (ISR) for Cortex-M4F exceptions. User can add additional ISR(s) for the used peripheral(s) (for the available peripheral interrupt handler's name, please refer to the startup file startup_stm32f4xx.s ).
STM32F4xx CMSIS files
File name Description
stm32f4xx.h CMSIS 外设访问层文件,该文件是唯一需要在main.c文件中包含的库文件
该文件定义了所有外设的数据结构、地址映射、访问寄存器的宏,寄存器声明和位定义,在该文件末尾可通过注释或不注释 #define USE_STDPERIPH_DRIVER来决定是使用 库还是直接访问寄存器方式开发
位于Libraries\CMSIS\Device\ST\STM32F4xx\Include
This file contains: configuration section that allows to select:
- the device used in the target application
- to change few application-specific parameters such as the HSE crystal frequency
system_stm32f4xx.h CMSIS 外设访问层系统函数,如控制时钟、执行 SystemInit
被 stm32f4xx.h引用
位于Libraries\CMSIS\Device\ST\STM32F4xx\Source\Templates
system_stm32f4xx.c
startup_stm32f4xx.s
CMSIS Cortex-M4F STM32F4xx devices peripheral access layer system source file.
STM32F4xx 设备启动汇编文件,每个编译器需要一个
位于Libraries\CMSIS\Device\ST\STM32F4xx\Source\Templates\arm
总结下,如果使用库开发方式,需要的文件如下,
startup_stm32f4xx.s 》stm32f4xx.h 》 system_stm32f4xx 、 stm32f4xx_conf.h 》用户文件 》库驱动
需要在编辑器的c/c++宏定义中定义 USE_STDPERIPH_DRIVER和使用的cpu型号宏(参考stm32f4xx.h中对芯片型号的定义),多个宏间用逗号分割
注意
虽然m3和m4库文件使用方式基本一样,但仍有些区别,如库文件目录结构和宏的名称
项目工程建立
需要从逻辑上分组,并将上述必须的文件添加进来,然后设置调试选型等
硬件开发
2016-05-23 16:37:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
输入子系统,顾名思义这本身是大神撸的一个系统。这个系统它不仅把输入设备底层驱动的共性部分(比如注册设备,open、write等)编写成一个大集合 以供调用,而且把与底层相匹配的处理事件程序也完成了。所以你只需要用这些集合把相对应的底层驱动设置好后注册进系统就可以了,这样不仅省去了很多事而且 保护了内核的统一。
首先我们先设置好相应的驱动(这其中最主要还是设置input_dev这个结构体和set_bit()等函数),然后注册。当输入事件发生时(按下 鼠标、点开显示屏),内核通过(input_report_...)函数向输入子系统报告发生的事件(其中这个函数最主要的部分还是 input_event函数),然后通过输入子系统匹配到相应的处理事件中去,而通过这个处理事件函数我们就可以连接到上层的应用中去,这就是大致的过程 了。
通过这个过程知道事件驱动一部分,输入子系统本身一部分和底层驱动三部分组成了输入子系统。而和上层有关的函数无非就是 open,write.read.close等,和底层有关的无非就是寄存器的操作等。这些在输入子系统其实同样适用,不过对输入子系统这个要更简单,因 为在事件处理部分我们的linux大神已经帮你完成了,你只需要把相应的底层驱动匹配上去就行,所以我们要做得就是完成底层驱动的部分,但是呢,对底层驱 动大神们怕你撸的还是不够规范所以也把一些简单的接口给你,你只需要直接调用就可以了。。说是输入子系统,但我已经把这么明显的分离分层思想已经暴露出来 了。我们把整个系统分层为上层应用----下层驱动(这就是分层)然后又把下层驱动分离为事件驱动和设备驱动(这就是分离)。
这只是输入子系统的主要部分,其他的部分一样。。
一个例程: http://www.oschina.net/code/snippet_2241389_52566(只有部分注释)
硬件开发
2016-05-22 15:07:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
转眼间近半年多没写文章了,年后来京后换了家公司,工作性质也有了些变化,从以前的杂七杂八干活到如今的杂七杂八...
大面上的一些转变是从服务器/web安全转到了智能硬件/web安全,还是很杂吧,学习的太广,没有非常精通的一门也是个一直以来缺陷。
================正题=============
kali下qemu的安装: apt-get install qemu
使用Docker容器进行操作 https://hub.docker.com/r/asmimproved/qemu-mips/
分析某路由器固件包: binwalk -Me bcrm.bin # -M 递归解压看情况可加可不加 -e 自动化提取
一般固件解压后的文件系统有squashfs和cpio,进入相应的文件夹 root@kali:~/work/openwrt/_brcm/squashfs-root# qemu-mipsel -L . bin/ls bin/ls: Invalid ELF image for this architecture # qemu-mipsel qemu user模式模拟运行 -L . 设置库路径为当前目录
一般报上面的这种错误目前我知道的会有两种情况 老版本的qemu会存在,新版本一般都不存在,参考解决链接:
http://www.devttys0.com/2011/12/qemu-vs-sstrip/ 文件的打开方式不正确,使用了错误的程序执行了ELF文件
针对第2种的解决方法及常识: # 使用file识别当前文件的格式 # 识别为:ARM格式的ELF文件 root@kali:~/work/openwrt/_brcm/squashfs-root# file bin/busybox bin/busybox: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-uClibc.so.0, stripped # 识别为:MIPS格式的ELF文件 root@kali:~/work/openwrt/_openwrt-we800g-squashfs.bin.extracted/squashfs-root# file bin/busybox bin/busybox: ELF 32-bit LSB executable, MIPS, MIPS32 version 1, dynamically linked, interpreter /lib/ld-uClibc.so.0, corrupted section header size
依据上面类型使用不同的qemu程式模拟即可 root@kali:~/work/openwrt/_brcm/squashfs-root# qemu-arm -L . bin/ls bin etc opt proc readonly sbin usr
先写这些,后续遇到问题再补充,至于漏洞挖掘的慢慢来。
期待各位同道中人交流~
最后弹弹弹~算漏洞么?其实也不算,仅限部分Firefox ESR版本触发 。
硬件开发
2016-05-18 16:32:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
博主从事嵌入式Linux上的软件开发,其中用到了很多库。博主发现这些库都是静态链接的。如果有多个程序都要用到这个库,而且这个库又比较大的时候。这将是一个莫大的空间浪费。
博主对比了一下本地编译与交叉编译下的日志输出,发现有以下比较可疑的信息:
上面左边76,77行,不能支持shared libraries。
打开 ./configure,找到对应的输出语句:
能否支持,是由 can_build_shared 这个变量决定的。
而 can_build_shared 在这里有修改:
去 confilg.log 中搜 11262 行的输出结果:
结果可以看出 dynamic_linker 的值是 “GNU/Linux ld.so”,不是 "no",所以不是这里影响了 can_build_shared 变量。
查得另一处影响的变量:
去 config.log 查得 ld_shlibs 的值为 no:
那为什么 ./configure 认为 rsdk-linux-gcc 不支持 shared library 呢?它的判断标准是什么?
博主翻了好几页,这 ./configure 真不是人看的,没有对缩进,而且好深的case嵌套。哎~,脑空量溢出了。
大概可以分析出跟 host 有关系,./configue 在分析是什么系统,根据系统来判断 ld_shlibs 的值。
如果是这样,很可能是我在 Makefile 中:
./configure --host=mips-linux 所致?将 "mips-linux" 改成 "linux" 再试试。
通过打调试信息,得知是在这里设置的 ld_shlibs 为 no 的:

与这个case相关的代码好大,好难看出到底是什么条件了。查得与 host_os 变量相关。
在调试信息中打印 host_os 变量的值,为 "elf" 。为什么是这个?而 host_os 在这里赋值:
从 config.log 中得知 ac_cv_host = mips-unkonwn-elf 。
ac_cv_host 来源:
这个由 config.sub 与 host_alias 所得。而 host_alias 来自于:
可以从 L984 得知,host_alias 来自于我们 ./configure 时传的 --host=mips 所得。
理一下思路:
我们转入了一个 --host=mips-linux,configure 执行 sh config.sub mips-linux,返回的结果是 "mips-unkonwn-elf",host_os 从中提取出 "elf",然后就不对了。
那 --host=?? 得看 config.sub 如何转换。
硬件开发
2016-05-15 23:08:05
「深度学习福利」大神带你进阶工程师,立即查看>>>
一、 问题描述 :
ERROR:NgdBuild:455 - logical net 'clk400m_p' has multiple driver(s)
ERROR:NgdBuild:455 - logical net 'clk400m_n' has multiple driver(s)
解决办法 :
DDR 生成后有一个顶层的源文件,在那里面找到一个关于原语写的BUFG也不知 是IBUFG,将这个原语跳过就可以,保存然 后在编译就不报错了。
原因分析 :
DCM 出来的时钟经进了BUFG,而DDR的输入时钟是从IBUFG进入的,在底层结构 上BUFG不能联到IBUFG。

二、 问题描述:
在Translate过程中出现如下错误:
"ERROR:ConstraintSystem:59 - Constraint< xxx >: NET/INST "xxx" 未找到。 Please verify that:
1. The specified design element actually exists in the design.
2. The specified object is spelled correctly in the constraint source file.
解决办法 :
为了防止综合工具删除 net,应为 net 应用 "KEEP"
另外注意检查管脚约束UCF文件中,是否有对多余的IO信号分配了同一个管脚。

三、 问题描述 :
在implement时点击translate后,出现如下错误:
ERROR:NgdBuild:924- input pad net 'clk' is driving non-buffer primitive 。
意为输入信号clk未经buffer就 用来驱动其他primitives了
原因分析 :
输入时钟clk_in在作为DCM输入引脚的时候又为其他module的输入,也就是说clk 有两个load,连接PLL时,输入信号先要连接到内部buffer以产生较强的驱动能力, 从而保证时钟的时序质量。但是由于输入信号的另一分支不经过任何电路就直接连接 到了输出Pad ,所以存在一种可能,即连接buffer的分支会被短路,从而失去预期 的效果。即输入clk两个分支,一个直接连到模块fsm;一个连在了DCM的输入时钟 源。由于经过DCM时会自动加一个buffer缓冲器,而到fsm会直接连在一起,这样 会造成DCM这一路短路出现错误。正因为如此,ISE给出了错误警告。
解决办法 :
clk 只是连接一个load,就是DCM。DCM两个输出一个CLKFX_OUT_1,另外一个用 CLK0_OUT , 此信号和clk无论相位还是频率是一样的 。
另外: chipscope 不能用晶振输入时钟来作为采样时钟

四、 问题描述 :
PLL 或者DLL产生的时钟直接接到核上,出现如下错误
ERROR:NgdBuild:770 - BUFG 'test_ddr2_inst/memc3_infrastructure_inst/se_input_clk.u_ibufg_sys_clk'
And BUFG 'pll_200m_inst/clkout1_buf' on net 'clk_200m' are lined up in series. Buffers of the same direction cannot be placed in series.
原因分析 :
IBUFG 和BUFG串一块儿了。
解决办法 :
进到PLL或者DDR2模块里,把相应的BUFG(IBUFG)屏蔽掉。

硬件开发
2016-05-05 18:14:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
一、最近研究了一下二维码相关操作,制作了一个二维码/条形码识别工具
环境需要:.Net Framework 4.5框架
使用方式:
先下载软件
软件地址:csdn--- http://download.csdn.net/detail/u011127019/9507821
51cto--- http://down.51cto.com/data/2215285
源代码地址: http://git.oschina.net/tiama3798/QrCodeTool
代码介绍: http://www.cnblogs.com/tianma3798/p/5426869.html 解压运行软件 将一个二维码拖到当前窗口中就能识别显示二维码的数据,如果解析失败,返回空字符串

硬件开发
2016-05-01 21:53:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
1.开关三极管
三级管npn和pnp当开关使用,工作于截止区和饱和区(相当于电路的切断和导通)。
NPN三极管做开关管时,当基极Vin为低电压时,由于基级没有电流,因此集电极亦无电流,致连接于集电极的负载也没有电流,而相当于开关开启(关闭状态),此时三极管工作于截止(cut off)区。
同理NPN三极管当基极Vin为高电压时,由于基级有电流流动,因此使集电极流过更大的电流,因此负载回路被导通,而相当于开关闭合(连接状态)此时三极管工作于饱和(saturation)区。
图1.NPN三极管当做开关管使用实例
当LED_DPI为高电平时,三极管集电极和发射极导通,LED_DPI_TC由于三极管导通使之接地。
图2.两只三极管组合形式的开关管
两个三极管组合起来这种方式也可以形成开关管,这种连接方式也称为达林顿管,这两个三极管串连组成的一只等效的新三极管,其放大倍数是原来的两只三极管之积,它可以放大非常微小的信号。它同时也可以做开关管,其通断情况于一只三极管通断情况相同。
达林顿管就是两只三极管适当的连接起来,组成一个等效三极管(通断以第一个三极管为准),电流放大倍数是二者之积,常用于功率放大和稳压电路中。达林顿管电路有几种接法:NPN+NPN,PNP+PNP,NPN+PNP,PNP+NPN,它们的通断情况都是以第一只的为准。
以上都是相关与NPN三极管当开关管的情况。
PNP和NPN两种三极管做开关,原理类似,但所需逻辑电平刚好相反。
图3.PNP三极管当开关时电路图
图3中当基极为低电平时,三极管导通,如果为高电平,三极管截止。
总结: 三极管当开关管情况下,NPN三极管如果要导通,要输入高电平,如果输入低电平,三极管截止。PNP三极管如果要导通,要输入低电平,如果输入高电平,三极管截止。 三极管当做开关时技巧:三极管上箭头 ( 发射极 ) 所在的方向的二极管只需要二极管正向导通,那么三极管上下就能导通。三极管作开关时不涉及任何所谓公式,放大倍数。
=============================================================================================
三极管有以下特性:
IE=IB+IC
IC=β*IB(其中β≈10~400)
如果IB=0,那么IE=IC=0
工作在放大区时微弱变化的电信号通过三极管放大成波幅很大的电信号。
IC=β*IB(其中β≈10~400)
图4.三极管放大电路
此电路放大到一定状态到饱和状态时也是一个开关管。 控制电机正反转电路:
此电路可以控制相对于功率小的电机正转或者反转,当R1端输入高电平电机正转,R2端输入高电平电机反转。具体原理就不在这里赘述。
2.mos管通断
关于mos管和三极管的封装
三极管:1B,2E,3C
Mos管:1G,2S,3D
图中, Q1 表示 N 沟道, Q2 表示 P 沟道。(判断方法,在 G 栅极记住为沟道,箭头表示 PN 结,在沟道位置对应是什么结就表示什么沟道)
箭头指向G极的就是N沟道,箭头背向G极的是P沟道,它们两个寄生的二极管均于箭头方向一致。
Nmos:(G极高电平,比S极高3V)D极接输入,S极输出;
Pmos:(G极低电平,比S极底3V)D极接输出,S极输入;
N沟道导通时:Ug>Us,Ugs>Ugs(th)
P沟道导通时:UgN沟道管子加正向电压即导通沟道加反向电压,一般2V-4V。 ( 即图中 PN 结反向时 , 且 PN 结压降有达到要求,即可导通 )
N型管在栅极为高电平时候导通,低电平时候关闭截止。
P型管在栅极为底电平时候导通,高电平时候关闭截止。
以上都针对增强型 mos 管,耗尽型一般不常用。
场效应管的作用有信号转换和控制电路通和断的作用。
Mos 管通断判断速记:
MOS 管导通条件,只要记住电压方向与中间箭头方向相反即为导通 ( 当然,这个相反的电压需要达到 MOS 管开启电压 )。导通时候,都是电流方向和箭头PN 结相反的流动方向。 ( 可以理解为 G 极和 S 极压差,使得 PN 结被击穿,让电流反过 PN 结流动,导通后电路方向和其二极管方向相反 )
例如:导通电压为3V的N沟道MOS管,只要G的电压比S极电压高3V即可导通(导通过程D的电压比S要高),同理导通电压为3V的P型mos管,只要G电压比S极电压低3V即可导通(导通过程S极电压比D极高)。
Mos管做开关典型应用:
图5.N沟道mos管做开关的情况(N沟道的电路图通断情况描述如图)
图6.P沟道mos管做开关的情况
在图6中P沟道的电路:P沟道的mos控制管控制GPS模块电源通和断,芯片电压控制引脚为低电平时导通,GPS模块正常供电。
电源开关电路:
尤其是mos管的电源开关电路,常用于各个“功能模块”电路的电源通断控制。(如上述的P型mos管电路)
图7.P型mos管做电源开关电路时模型和控制方式。
用mos管实现电源开关电路,并且带软开启功能如下。
设计软启动,软启动是指电源缓慢开启,以限制电源启动时的浪涌电流。 ( 浪涌电流可令电源系统不堪重负而掉电,导致系统不稳定,严重会损坏电路上的元器件 ) 电压示意如图所示:
在设计中,只需要添加一个电容 C1 和电阻 R2 就可以实现软启动 (soft start) 功能。
分析:控制电源信号 control 为低或者高阻状态时,二极管 Q2 拉低到地, Q2 不导通, +5v_out 就没有输出,电阻 R4 是为了在 control 为高阻状态时,将三极管基极固定在低电平,不让其浮空。
控制信号为高电平时,三极管 Q2 饱和导通,进而 C1 通过电阻 R2 充电,即 C1 与 G 极相连电压 5V 缓慢下降到 0V ,导致 Vgs 电压逐渐增大。
Mos 管 Q1 的 Vgs 缓慢增大。令其缓慢打开,到完全打开,最终 Vgs=-5V 时,利用 C1 电容充电时间实现 Q1 缓慢打开,实现软启动。
硬件开发
2019-10-14 19:29:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
基于迅为-iMX6D、iMX6Q 和 iMX6PLUS 三个硬件版本,设备树镜像的烧写方法以及镜像所在目 录,镜像名称全部一致,所以作者将烧写章节合并到一起。
请注意,如果购买的是 iMX6D 版本,想要烧写设备树版本镜像,请使用 iMX6D 设备树 版本的光盘(iMX6D 还有一个非设备树版本的光盘);
如果购买的是 iMX6Q 版本,想要烧写设备树版本镜像,请使用 iMX6Q 设备树版本的光 盘(iMX6Q 还有一个非设备树版本的光盘);
如果购买的还是 PLUS 版本,请使用 PLUS 版本的光盘。
烧写工具是 iMX6D/Q/PLUS 设备树内核光盘资料的“02 编译器以及烧写工具\烧写工
具”目录下的“android_m6.0.1_2.0.0_ga_tool_20190412.7z”压缩包(红色日期可能会 变),解压压缩包,进入解压得到的文件夹“mfgtools”。
其中,“MfgTool2.exe”是烧写工具,烧写工具需要拷贝镜像以及识别到 开发板 之后才 能打开,正常使用。
“cfg.ini”是配置文件,打开“cfg.ini”,如下图所示,确保“[LIST]”之后的参数是
Android 。

编译好的 Android6.0.1 镜像,在 imx6q/plus 设备树内核光盘资料的“03 镜像
_android 6.0.1 文件系统”目录下。其中分为 1G 和 2G 的镜像,用户根据硬件内存大小使用对应的镜像。
这里以 1G 内存镜像为例,将其中的“u-boot.imx”、“system.img”、
“recovery.img”,还有剩下的“boot-topeet_XXX.img”全部拷贝到烧写工具的
“mfgtools\Profiles\ Linux \OS Firmware\files\android”目录下,如下图所示。
务必先执行这一步骤!否则后面打开烧写工具软件会报错。

开发板的 拨码开关 设置参考“2.2.1 启动模式设置(拨码 开关 )”设置为 USB 烧写模
式,接上 otg 线,开发板上电。最后开启“mfgtools”目录下的“MfgTool2.exe”工具(如
果是 win10 系统,要以兼容模式运行),如下图所示。

单击“Start”开始烧写,如下图所示,烧写工具出现进度条。

在烧写过程中,串口控制台,会有一些打印信息。

如下图所示,烧写完成,单击“Stop”,然后关掉烧写工具“MfgTool2.exe”。

开发板断电,参考“2.2.1 启动模式设置(拨码开关)”小节,将开发板设置为 eMMC
启动模式,上电,然后参考“2.2.2 uboot 模式”小节,进入 uboot 模式,如下图所示。

设置系统参数:在 uboot 的命令行中,使用命令“setenv bootsystem android”设置
环境变量参数为“Android”启动模式,然后使用“saveenv”保存,如下图。

设置屏幕参数:

如上表所示,用户根据实际屏幕,选用“设置命令”。例如作者是 9.7 寸屏,则使用
“setenv lcdtype 9.7”,然后“saveenv”保存参数,如下图所示

设置完成之后,使用“reset”命令,重启开发板,开发板启动之后就是 Android6.0 系
统。
硬件开发
2019-10-12 10:41:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
网上折腾了好久,终于把这个原始而古老的编译方法挖掘出来了。由于现在新的linux系统都有非常成熟的gcc工具,其预处理、编译、汇编、链接过程都全自动完成了,所以几乎完全搜不到相关资料。值得一提的是,cpp这个工具的名称,跟C++源文件后缀是一样的,搜出来居然是各种gcc、g++编译教程,真是哭笑不得。
run.c源程序: #include int main(){ printf("\nHello World!\n"); int a=5; return a+3; }
【第一步】预处理命令(用于检查c文件是否合法): cpp run.c
【第二步】编译命令,将c代码编译成汇编代码(装的cc1可执行文件没有添加到环境变量,因此使用全路径): /usr/lib/gcc/mipsel-linux-gnu/4.3/cc1 -quiet -v run.c -quiet -dumpbase run.c -mabi=32 -mllsc -mno-shared -auxbase hello -version -o /tmp/ccLBiGXW.s
【第三步】汇编命令,将汇编代码编译成二进制字节码: as -EL -no-mdebug -mabi=32 -mno-shared -v -KPIC -o /tmp/ccalbwQH.o /tmp/ccLBiGXW.s
【第四步】链接命令,将程序所需的各种二进制代码汇总,链接到一起,输出最终能在linux系统下执行的可执行文件: ld --eh-frame-hdr -EL -dynamic-linker /lib/ld.so.1 -o hello_mips_test /opt/gcc-4.3-ls232/sysroot/usr/lib/crt1.o /opt/gcc-4.3-ls232/sysroot/usr/lib/crti.o /opt/gcc-4.3-ls232/lib/gcc/mipsel-linux/4.3.0/crtbegin.o -L/opt/gcc-4.3-ls232/lib/gcc/mipsel-linux/4.3.0 -L/opt/gcc-4.3-ls232/lib/gcc/mipsel-linux/4.3.0/../../../../mipsel-linux/lib -L/opt/gcc-4.3-ls232/sysroot/lib -L/opt/gcc-4.3-ls232/sysroot/usr/lib /tmp/ccalbwQH.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /opt/gcc-4.3-ls232/lib/gcc/mipsel-linux/4.3.0/crtend.o /opt/gcc-4.3-ls232/sysroot/usr/lib/crtn.o
第四步链接的时候需要注意的问题:
1、龙芯玲珑系统可能没有自带用mips指令集编译好的库文件,需要从交叉编译工具集导进来: 下载页面 、 下载地址 ,下载完后将工具集安装在/opt/下
2、/opt/gcc-4.3-ls232/sysroot/usr/lib/libc_nonshared.a /usr/lib/


参考:
预处理、编译、汇编、链接、启动代码、相关command
硬件开发
2019-10-10 22:57:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
Python平台:Python 2.7(经测试,Python3.6.1可用,需要添加少许改动,详见文章末尾)
二进制代码查看工具:WinHex

假设我们有如下16进制代码,需要当成binary文件写入: output_code = """00400000,24090002 00400004,21280004 00400008,00082021 0040000c,24020001 00400010,0000000c"""

那么只需要使用bytearray.fromhex方法,它会直接将8位16进制的字符串转换成相应binary: file1 = open('byte_file', 'wb') output_code = output_code.split('\n') for line in output_code: print line file1.write(bytearray.fromhex(line.split(',')[0])) file1.write(bytearray.fromhex(line.split(',')[1])) file1.close()
假设我们遇到的是2进制字符串咋办呢?下面是一个32位的字符串: binary_str = "10001100000000100000000000000100" # ----------> 123456789 123456789 123456789 12一共32位2进制数字
下面的代码能把32位的2进制str,转换成8位的16进制str(2^32 == 16^8): def transfer_32binary_code(opcode_in): optcode_str = '' for i in range(len(opcode_in) / 4): small_xe = opcode_in[4 * i: 4 * (i + 1)] small_xe = hex(int(small_xe, 2)) optcode_str += small_xe[2] return optcode_str
输出结果如下: 8c020004


我们将前面的步骤结合起来,写入一个binary文件,内容为8c020004,试一试: file1 = open('hex_16_str.binary', 'wb') hex_16_str = transfer_32binary_code('10001100000000100000000000000100') print hex_16_str file1.write(bytearray.fromhex(hex_16_str)) file1.close()
我们通过WinHex打开保存的binary文件,确认写入的二进制代码符合

附录:
Python3.6.1使用以上功能的时候,需要注意len除以int后是float的问题,float不能被range函数接收,需要改动如下: def transfer_32binary_code(opcode_in): optcode_str = '' for i in range(int(len(opcode_in) / 4)): # in python 3.6.1, int divide by int is float small_xe = opcode_in[4 * i: 4 * (i + 1)] small_xe = hex(int(small_xe, 2)) optcode_str += small_xe[2] return optcode_str

硬件开发
2019-10-10 14:32:00
「深度学习福利」大神带你进阶工程师,立即查看>>>

Facebook Hydra是一个新的开源框架,旨在通过简化命令行参数处理、配置管理和日志记录等常见功能的实现来加快Python应用程序的创建。
Facebook开发Hydra是为了加快几个研究项目的开发,其中应对需求变化的能力是关键。
Hydra提供了一种组合应用程序配置的创新方法,允许通过配置文件和命令行更改组合。这解决了在修改配置时可能出现的挑战,比如必须维护配置的许多略有不同的副本,或者添加自定义逻辑来覆盖各个配置值。
它的主要目标之一是减少处理命令行参数、基于文件的配置、日志记录等通常需要编写的样板代码。Hydra还提供了一种可插拔的体系结构,旨在支持未来的扩展,比如在云提供商上无缝运行代码。
减少样板文件的机制之一是建立一个关于指定应用程序配置方式的约定。特别是,配置由构成层次结构的多个源组成,可以从命令行覆盖这些源。例如,如果您有一个配置。yaml配置文件包含许多配置选项为您的程序,您可以通过Hydra无缝使用它: hydra.main(config_path='config.yaml') def my_app(cfg): # use cfg configuration options...
如果在特定的运行中,你想要覆盖一个配置值,你可以提供新的值在命令行使用:
$ python my_app.py db.user=root db.pass=1234
Hydra还使处理可选配置选项组变得很容易。例如,您可以有两个配置文件,一个连接到MySQL数据库,另一个连接到PostgreSQL数据库。在每次运行你的程序时,你可以通过像这样在命令行指定配置文件来选择使用哪个配置文件:
$ python my_app.py db=postgresql
$ python my_app.py db=mysql db.timeout=20
配置文件存储在单个目录中,并使用文件系统分层组织。Hydra通过传递给应用程序的cfg映射映射文件系统层次结构。这允许在独立的空间中组织配置选项,然后根据需要组合。例如,除了PostgreSQL和MySQL的配置文件外,你还可以用配置文件来描述你想要使用的数据库模式,然后在启动时决定在特定的运行中使用哪种数据库/模式组合:
$ python my_app.py db=postgresql模式=学校
$ python my_app.py db=mysql schema=home
Hydra使用shell选项卡补全来指导您完成可以在命令行上使用的配置和子配置,因此不需要记住所有允许的组合。另外一个好处是,Hydra将为程序的每次运行创建一个输出目录,并将运行时的配置复制到任何输出文件中。当您希望运行多个实验并跟踪结果以便能够在最后比较它们时,这是理想的。
最后,Hydra包含了一些日志功能,目的是减少与Hydra配置管理完全集成的设置成本。
import logging
# A logger for this file
log = logging.getLogger(__name__)
@hydra.main()
def my_app(_cfg):
log.info("Info level message")
log.debug("Debug level message")
实际上,您可以设置要显示的日志级别,并在文件级别(从命令行或通过配置文件)打开和关闭日志记录。
$ python my_app.py hydra.verbose=[__main__,hydra]
如前所述,Facebook计划利用其可插拔架构来发展Hydra功能。它可以在GitHub上获得MIT许可。
高端网站建设 APP设计
硬件开发
2019-10-08 20:53:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
最近TinyOS开源了,准备看看它的源码。暂时先把现有工程上的contiki给换了,有个直观的概念。过程主要参考 这里 。 要点一:tos_config.h 中增加stdlib,以及em_device 要点二:增加tos_clock.c,用于设置tos的时间基准,并在其中重写SysTick_Handler以及PendSV_Handler,参考github的移植文件。
硬件开发
2019-10-08 16:40:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
9月27日,2019杭州云栖大会上,贾扬清博士正式担任阿里巴巴开源技术委员会负责人。


阅读原文
本文为云栖社区原创内容,未经允许不得转载。
硬件开发
2019-09-29 13:50:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
众多嵌入式领域都选择加入硬件加密芯片(也称安全模块),目的多为安全防护、数据加解密、正版授权。而根据所处行业领域的不同,基于加密芯片设计的应用方案也不尽相同。其中,一个典型的应用方案就是实现云端与平台的鉴权。
对于云端来说,只有判定终端设备身份合法后,才可以进行敏感数据下发等操作,而目前基于PKI体系实现的鉴权方案,都要求私钥的绝对安全,故只能将其存储于硬件加密芯片中。签名验签和加解密等运算也要在加密芯片中完成。
而加密芯片的量产烧录密钥等操作,作为安全防护方案的重要一环,也是非常重要的。最基本的烧录操作,要求将一组公私钥数据写入到加密芯片中。基于以上加密方案,有些用户还要求在发行阶段将一些个性化信息,唯一标识、授权码等数据写入到加密芯片中。这就要求芯片供货方具备很强的个性化定制烧录能力。凌科芯安深耕嵌入式加密行业,迎合用户需求,最新研发的量产烧录工具LKT-CCloader可完成加密芯片的个性化烧录工作。包括密钥分散导出、唯一ID号特殊定制烧录,非对称算法密钥一芯一密等烧录功能,均可实现。除此之外,若用户还有其他特殊要求,也可基于LKT-CCloader完成二次定制开发,满足各行业用户的需求。
LKT-CCloader作为核心控制板,可与市面上常用的机械手品牌完成功能对接,控制机械手对加密芯片完成自动化量产烧录工作。
硬件开发
2019-09-27 10:18:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
长期以来CPU挖矿给挖矿行业带来持久的负面影响,因为CPU是电脑的核心设备,一挖矿就干不了别的了,大家是否可以达成共识拒绝CPU挖矿?
显卡挖矿刚好构建在不影响大众的日常工作生活对电脑的需求之上,家用和办公电脑99%的显卡达不到挖矿的最低需求,因为显卡挖矿构建在对基本需求之上所以可以促进相关行业的技术提升和进步,构建在人们的日常生活之上的CPU挖矿不仅人人喊打而且不能促进技术进步(除非限制让99%的cpu挖不了矿,只有高端顶级cpu才能挖矿才能消除cpu挖矿的坏处)所以我们应该达成共识拒绝CPU挖矿。
开源矿工,开源,共建
下载开源矿工
硬件开发
2019-09-23 12:11:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
经常有项目要求固件远程更新,通过串口、GPRS、4G等等方式。下面介绍下STM32远程固件更新的方法。
IAP是In Application Programming的首字母缩写,IAP是用户自己的程序在运行过程中对User Flash的部分区域进行烧写,目的是为了在产品发布后可以方便地通过预留的通信口对产品中的固件程序进行更新升级。
通常在用户需要实现IAP功能时,即用户程序运行中作自身的更新操作,需要在设计固件程序时编写两个项目代码,第一个项目程序不执行正常的功能操作,而只是通过某种通信管道(如USB、USART)接收程序或数据,执行对第二部分代码的更新;第二个项目代码才是真正的功能代码。这两部分项目代码都同时烧录在User Flash中,当芯片上电后,首先是第一个项目代码开始运行,它作如下操作:
1)检查是否需要对第二部分代码进行更新
2)如果不需要更新则转到4)
3)执行更新操作
4)跳转到第二部分代码执行
第一部分代码必须通过其它手段,如JTAG或ISP烧入;第二部分代码可以使用第一部分代码IAP功能烧入,也可以和第一部分代码一道烧入,以后需要程序更新是再通过第一部分IAP代码更新。
对于STM32来说,因为它的中断向量表位于程序存储器的最低地址区,为了使第一部分代码能够正确地响应中断,通常会安排第一部分代码处于Flash的开始区域,而第二部分代码紧随其后。
在第二部分代码开始执行时,首先需要把CPU的中断向量表映像到自己的向量表,然后再执行其他的操作。
如果IAP程序被破坏,产品必须返厂才能重新烧写程序,这是很麻烦并且非常耗费时间和金钱的。针对这样的需求,STM32在对Flash区域实行读保护的同时,自动地对用户Flash区的开始4页设置为写保护,这样可以有效地保证IAP程序(第一部分代码)区域不会被意外地破坏。
下面重点介绍这两个程序设计要点。
BootLoader程序
keil软件程序存储区正常设置如下
IAP程序主要做跳转,主循环如下

#define IOT_APP_Addr 0x8010000

int main(void)
{
IO_config();
usart_config();
Delay_ms(1000);
Spi_Init();
iap_load_app(IOT_APP_Addr);
while(1)
{

}
}
跳转函数如下,其中0x8010000是应用程序的起始地址。
void iap_load_app(u32 appxaddr)
{
if((appxaddr&0x8FC0000)==0x8000000)
{
jump2app=(iapfun)*(vu32*)(appxaddr+4);
MSR_MSP(*(vu32*)appxaddr);
jump2app();
}
}
user application程序要设置程序的起始地址,与IAP程序里的起始地址要一致,如下图
程序里要设置中断向量表的地址偏移量
int main(void)
{
NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x10000);


... ...
烧录程序时先烧录BootLoader程序,再烧入user application程序即可实现程序的固件升级

————————————————
更多精彩内容关注我的博客
https://blog.csdn.net/gd1984812/article/details/101060127
硬件开发
2019-09-20 16:27:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
SI522(超低功耗13.56M芯片)替代RC522 完全兼容 PIN对PIN
SI522是应用于13.56MHz 非接触式通信中高集成度读写卡系列芯片中的一员。
Si522 主要优势点:
1. 直接PIN2PIN 兼容RC522,与FM17550/FM17520/RM522
2. 完全替换RC522,接收功耗下降10mA,相比新增了自动寻卡和定时唤醒,自动寻卡功耗为4.5uA,业界最低。
3.首创全新寻卡方式,读卡模组不再死机。
SI522的概述
Si522 是一个高度集成的,工作在13.56MHz 的非接触式读写器芯片,阅读器支持ISO/IEC 14443 A/MIFARE。无需外围其他电路,Si522 的内部发送器可驱动读写器天线与ISO/IEC 14443A/MIFARE 卡和应答机通信。接收器模块提供一个强大和高效的电路来解调译码ISO/IEC 144443 A/MIFARE 兼容卡和应答机的信号。数字模块处理完整的ISO/IEC14443 A 帧和错误检测功能(奇偶和CRC)。
Si522 支持MIFARE 产品。Si522 支持非接触式通信,与MIFARE 系列双向通信速率高达848kBd。
Si522 内部集成低功耗自动寻卡与定时唤醒功能,可编程寻卡时间间隔,寻卡过程无需MCU 操作,寻卡成功中断唤醒或定时唤醒MCU 实现低电流消耗的同时又保证了低功耗寻卡模式的稳定性。

提供以下主机接口:
1SPI(串行外设接口)
​2串行UART(类似RS232,电压电平值取决于引脚供电电压)
3标准双线串行接口
我们可以供SI522的原理图及PCB图纸,以及通信例程DEMO
硬件开发
2019-09-20 09:04:00