Archive for the ‘STM32’ Category

STM8 读取 UID

STM32 | Posted by 老沙
9月 07 2016

UID

UID即Unique ID,STM8S105提供了96BIT的全球唯一ID,可以用于加密,也可以用于板子的ID,像我的应用,就是用在了给箱子一个全球唯一的ID,这样就便于联网了。

用UID的时候,请参考英文手册,不知道为什么,中文版的是没有UID这方面的介绍的。那么我们就来学习一下UID把,官方给的应用如下:

•For use as serial numbers

•For use as security keys to increase the code security in the program memory while using and combining this unique ID with software cryptograhic primitives and protocols before programming the internal memory.

•To activate secure boot processes

其地址如下:

 1473251352-3985-30

1-2 byte为晶圆上x轴位置
3-4 byte为晶圆上y轴位置
5   byte为晶圆号码
6-12 byte是Lot number.

实际上一开始的时候,我也对UID的读取是相当的疑惑,但是看了这个地址后,其实就是直接读取地址上的数据就可以了。程序如下:

void get_id(void)

{

u8 i;

u16 addr;

u8 uid1[12];

addr=0x48CD;

for(i=0;i<12;i++)

{

uid1[i]=*(u8*)addr++;

putchar(uid1[i]);

}

}

怎么样,简单把,还有另外一个方法,在网上搜到的,也分享给大家把,

__no_init const union { //either the struct or a string

struct { //nameless struct

unsigned short X_coordinate; //X-coordinate on the wafter

unsigned short Y_coordinate; //Y-coordinate on the wafer

unsigned char Wafer_Number; //wafer number

unsigned char Lot_Number[7]; //lot number

} ;

unsigned char str[12]; //or the string

} U_ID @ 0x48cd; //u_id typ

J-link V8固件升级记

STM32, 硬件相关 | Posted by 老沙
4月 11 2016

好久没为电子工程事业尽份力了!今天也稍微努把力!写写我是如何升级J-link的固件的吧!

111

 

 

 

 

 

 

J-link是什么?晕,不是电子工程师的退散吧!这是现在比较流行的arm调试工具!我手上是那个大家都比较喜闻乐见的V8版本!盗版吗!大家懂的!50元入手的!没有软件升级与维护的!说不准哪天!升级软件就封杀了!如果固件没法更新就基本一块砖!砸人防身都可以哦!
222

 

 

 

 

 

首先在通电情况下,短接a!然后拔下usb 接着短接b,然后插入usb 10秒,然后拔下usb。最后从新上电插入usb!于是你的电脑里面就有了一个无法识别新设备!

333

 

 

 

 

 

 

 

 

去atmel官网下载最新版本的SAM-BA v2.12软件,你就可以正确识别硬件为一个usb转串口设备了!

http://ishare.iask.sina.com.cn/f/34214872.html

双击运行SAM-BA v2.12

444

 

 

 

 
设置你的设备端口号,还有芯片型号!之后点击连接!

666

 

 

 

 

 

 

 

进入固件刷写窗口!选择好新固件的文件地址!然后点send file

http://ishare.iask.sina.com.cn/f/34231756.html

777

 

 

 

 

 

 
提示是否加密!选择yes!

888

 

 

 

 

 

 
烧录进行中~~~~

999

 

 

 

 

 

 
再次提示是否要加密,选择no!之后退出程序!

拔掉J-link,然后从新插入usb!

1111

 

 

 

 

 

 

 

 

又会有新设备,这个时候要去下载安装J-Link ARM V4.40驱动就有了!

注意一定要是J-Link ARM V4.40 之后的版本都会封杀你的破解!

http://download.csdn.net/detail/wm20031015/3926860  

2222

 

 

 

 

 
运行J-Link ARM V4.40提示升级,选择yes

5555

 

 

 

 

 

 

6666

 

 

 

 
提示升级成功!

从新插拔一下J-link!好了你的J-link V8又复活了!

双击J-Link ARM V4.40 程序正常运行了!

8888

 

 

 

 

 

 

^_^,我能给的也就这么多了!如果还有什么问题,或者说新的4.5.0之后的版本需要破解的话,估计就又得等等了!不过至少现在J-link V8 又可以欢快的陪我们工作一阵子了!

 

install_at91-isp

jlnk_bin_烧录

STM32 的加密实现

STM32 | Posted by 老沙
4月 07 2016

目的:对运行于STM32的嵌入式代码程序进行加密

编译环境:IAR Embedded System for ARM5.5

一.STM32Flash组织

1460007975-5260-

STM32的Flash包括主存储器(HD版本,512KB)+信息块。信息块包括2KB的系统存储器(用于系统自举启动代码)和16字节的选项字节(8个字节数据+8个字节数据的反码)。

二、STM32读保护

STM32读保护是通过设置RDP选项字节,然后在系统重新复位加载了新的RDP选项字节后启动的。当保护字节被写入相应的值以后:

●通过从内置SRAM或FSMC执行代码访问主闪存存储器的操作,通过DMA1、DMA2、JTAG、SWV(串行线观察器)、SWD(串行线调试)、ETM和边界扫描方式对闪存的访问都将被禁止。

●只允许从用户代码中对主闪存存储器的读操作(以非调试方式从主闪存存储器启动)。

●第0~3页(小容量和中容量产品),或第0~1页(大容量和互联型产品)被自动加上了写保护,其它部分的存储器可以通过在主闪存存储器中执行的代码进行编程(实现IAP或数据存储等功能),但不允许在调试模式下或在从内部SRAM启动后执行写或擦除操作(整片擦除除外)。

●所有通过JTAG/SWD向内置SRAM装载代码并执行代码的功能依然有效,亦可以通过JTAG/SWD从内置SRAM启动,这个功能可以用来解除读保护。当读保护的选项字节转变为存储器未保护的数值时,将会执行整片擦除过程。

●可以使用系统启动程序解除读保护(此时只需执行系统复位即可重新加载选项字节),芯片自动擦除Flash所有内容。

三.STM32的加密

1.使用系统启动程序STM32 Flash Loader demonstrator将Flash设置为读保护。

所有以调试工具、内置SRAM或FSMC执行代码等方式对主存储器访问的操作将被禁止,只允许用户代码对主Flash存储器的读操作和编程操作(除了Flash开始的4KB区域不能编程)。用户代码允许自主编程可以实现IAP或者数据存储等功能。

这样破解者将不能用调试工具、内置SRAM或者FSMC执行代码等方式读出Flash中的代码。破解者也不能使用系统启动程序读取代码,因为要解除读保护,将执行整个芯片的擦除操作。

2.主程序中使用设备ID保护

即使将Flash设置为读保护,破解者也可以通过IAP下载自己的一段小程序,从而读出Flash中的内容。因此,还需要利用设备的唯一ID进行加密保护。在主程序中,加入对设备唯一ID的检测,这样即使破解者读出了芯片中的二进制码,也不能用这个二进制码去复制新的器件。具体实现方法:

(1)在应用程序中定义1个(32位甚至更多)const变量,变量值全为0xFF。每次启动程序时,检查const变量值如果全为0xFF,就读器件的唯一ID,通过Flash编程写入该const变量中(因为全是0xFF,所以可以编程写入)。

(2)在程序中多个地方检查const变量,如果变量值不为0xFF并且与设备ID不一致,就执行与功能无关代码(比如自擦除)。

这样,即使破解者读出了芯片中的二进制码,因为这份二进制码包含了设备唯一ID,具有唯一性,所以不能复制到其他芯片中。

为了避免破解者利用反汇编,根据芯片ID数据在二进制文件中查找对应相同数据的位置从而破解,可以将ID拆散成不同的组合,并且写到不同且不连续的地方。更进一步,可在程序中检测多份这样的分散ID,以增加反汇编的难度。或者将CPUID进行加密,Flash中存储加密后的结果。

四.程序加密的实现

 

[cpp] view plaincopy
01.//加密后的CPUID
02.volatile const static uint32 CPUIDEncrypt = 0xFFFFFFFF;
03.
04.//写入加密数据
05.void WriteEncrypt(void)
06.{
07.    //第一次烧写:将UID写入到Flash中
08.    if(CPUIDEncrypt==0xFFFFFFFF)
09.   {
10.        uint32_t CpuID[3];
11.        //获取CPU唯一的ID
12.        CpuID[0]=*(vu32*)(UID_BASE);
13.        CpuID[1]=*(vu32*)(UID_BASE+4);
14.        CpuID[2]=*(vu32*)(UID_BASE+8);
15.
16.        //加密算法,很简单的加密算法
17.        uint32_t EncryptCode=(CpuID[0]>>3)+(CpuID[1]>>1)+(CpuID[2]>>2);
18.        FLASH_Unlock();
19.        FLASH_ClearFlag(FLASH_FLAG_BSY|FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);
20.        FLASH_ProgramWord((uint32_t)&CPUIDEncrypt, EncryptCode);
21.        FLASH_Lock();
22.    }
23.}
24.//判断加密
25.bool JudgeEncrypt(void)
26.{
27.    uint32_t CpuID[4];
28.    //获取CPU唯一的ID
29.    CpuID[0]=*(vu32*)(UID_BASE);
30.    CpuID[1]=*(vu32*)(UID_BASE+4);
31.    CpuID[2]=*(vu32*)(UID_BASE+8);
32.    //加密算法,很简单的加密算法
33.    CpuID[3]=(CpuID[0]>>3)+(CpuID[1]>>1)+(CpuID[2]>>2);
34.    //检查Flash中的UID是否合法
35.    return (CPUIDEncrypt == CpuID[3]);
36.}
1、将写入加密数据和判断加密两个功能分开。写入加密在PrsCtrlTask开始的地方;而判断加密分布到程序的各个角落。

2、非常重要的是CPUID加密值的定义一定要加“volatile”类型:

volatile const static uint32 CPUIDEncrypt = 0xFFFFFFFF;

否则按速度优化编译,在判断加密值,不会重新读取加密值,导致判断出错。

3、在工程选项Options->Debugger->Download中选择: use flash loader

否则主程序中对Flash编程将不成功。

参考资料:

STM32F10x微控制器参考手册(2009年12月第10版).pdf

STM32单片机 如何选择

STM32 | Posted by 老沙
4月 06 2016

自从ARM公司2007年首推出Cortex内核,ST凭借基于ARM CORTEX-M3内核的STM32F1,无疑成为了最大的赢家之一。特别是STM32F103系列,更是成为市场上最通用的MCU系列之一。

不过在Cortex-M3内核出来了7年之际,在我看来Cortex-M3内核已经不能算是性价比最高的MCU内核了。反而Cortex-M0+和Cortex-M4优化越来越好。鉴于我个人对ST MCU比较熟悉,我在这里介绍几款比STM32F103系列性价比更高的MCU系列。

STM32F030—-ARM Cortex-M0内核。最高主频48MHZ,特别是STM32F030F4,16K FLASH,4K RAM , TSSOP20封装。价格在3块钱左右。

STM32F042—-同样Cortex-M0内核 。14年初推出的芯片,号称带USB,CAN总线的最便宜的MCU。可以和STM32F103系列 完全 PIN TO PIN 。适用于需要USB功能的小型电脑周边产品。

STM32L053—-Cortex-M0+内核,14年推出。STM32L152系列的芯片我测过功耗,并没有我想象中的如意,比STM32F103略低,但比起市场上其他的低功耗MCU,并没有太明显的优势。但L053确实做得更好,可以详见我的实测笔记http://bbs.21ic.com/icview-835590-1-1.html 。主频32MHZ,最大FLASH 64kb.适用于低功耗要求苛刻的小型产品应用。跟STM32F103 PIN TO PIN

STM32F411–STM32系列中Cortex-M4内核中比较通用还是STM32F407系列,最高主频180MHZ。但这块STM32F401的特点在于其低功耗。运行功耗100uA/mhz,比32L053还略低。但由于是Cortex-M4内核,更方面功能会更强(最高主频84MHZ , FLASH 512kb),十分适用于智能手环等可穿戴类产品。

STM32F303—-各方面跟STM32F103一模一样,除了多了一个浮点运算,对于运算较多,很多Sensor数据处理的产品,可以考虑。