STM32F103

本文介绍ARM系列STM32F103芯片的解密方法,其内核是Cortex-M3,内存从16K-512K都有。

该芯片主要应用非常广泛,日常消费类电子产品,工控设备,电机驱动,变频器,打印机等等。

“破解STM32F103芯片的方法"

一般来说,攻克芯片解密的方法,都是采用物理破解的方法,即重新改变芯片内部线路的方法,这种方法所读取出来的程序正确率为100%。针对此款STM32F103我们也是采用此方法。

在芯片解密行业中,最正确的解密方法就是采取硬件解密的方法,即用特定的溶脂溶解开芯片,让其晶片裸露出来,在操作这一步的时候,也是需要有一定的技巧,当然,在操作这一步的时候,有时候,也可能会把芯片溶解坏,就是把线溶解断了,这样芯片就完全用不了了,这就是为什么在解密的时候,最好可以提供2颗母片,就是防止一颗失败无法进行。

当然,如果只有一个母片的时候,就可以拿去绑定厂重新绑定,但这样的话,就会产生一定的费用,时间上也大大加长了,一般绑定一次的话需要一周的时间,如果绑定测试不通过的话,那么就要再次拿去绑定,如果是这么一种情况的话,技术人员就会重新再开一个芯片,争取在最短的时间内将程序提取出来。以下就是开完片后的芯片:

“破解STM32F103芯片的方法"

当晶片裸露出来后,我们就要用到高倍显微镜和FIB(聚焦离子束设备),用这两种设备,查找芯片的加密位置,通过改变其线路的方法,将加密芯片变为不加密的一个状态,然后再用编程器,将芯片内部的程序读取出来。

“破解STM32F103芯片的方法"

像这种读取芯片程序的方法,其正确性是100%。为什么呢?因为我们知道,芯片的程序一般是首先写了C语言,在写入芯片之前,要将C语言反汇编成汇编语言,当汇编语言通过编程器写入芯片内部后,就成了机器码,而我们解密的方法,就是把最终的程序读取出来,所以,一般解密出来的程序的格式都是机器码。

“破解STM32F103芯片的方法"

读取出来的二进制代码,如果没有软加密(UID绑定加密),那烧录到新的芯片中是完全可以正常工作的,如果存在软加密,那就需要去除软加密。

来源:网络
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:
cathy@eetrend.com)。

围观 87

问题:

该问题由某客户提出,发生在STM32F103VDT6器件上。据其工程师讲述:在其产品的设计中,STM32的HSE外接8MHz的晶体产生振荡,然后通过STM32内部的PLL倍频到72MHz,作为STM32的系统时钟,驱动芯片工作。在STM32片外有专用的看门狗芯片,监控STM32的运行。STM32内部的软件会在STM32的某个管脚上产生脉冲来复位看门狗。一旦STM32没有及时的产生脉冲来复位门狗,则看门狗会认为STM32运行不正常,从而复位STM32。在对该产品做可靠性测试时,进行了对看门狗监控时钟失效能力的测试。

测试的方法是:将HSE外接的晶体的两个端子接地,使其停止振荡,从而验证看门狗能否做出对STM32的做出复位动作。试验结果表明,看门狗没有产生复位动作。进一步测试发现,STM32在失效情况下仍在向看门狗发送复位脉冲。详解STM32时钟的文章:详解STM32的时钟系统,收藏了。

调研:

重复测试,确认其所述现象属实。检查软件代码,确认其软件没有开启STM32的CSS功能。修改代码,将PLL的二分频从STM32的MCO管脚送出,以方便用示波器观察。通过控制晶体的管脚是否接地来控制HSE是否振荡。当HSE正常振荡时,MCO送出的信号频率为36MHz,当HSE停止振荡时,MCO送出的信号的频率在1.7MHz附近,如图(一)所示:

“晶振损坏了,STM32还能正常运行?"

“晶振损坏了,STM32还能正常运行?"

通过调试器观察寄存器 RCC_CFGR 中的 SWS 控制控制位,其值为[10],说明此时的系统时钟确实来自PLL的输出。

从STM32F103VD的数据手册中查找PLL相关的参数如表(一):

“晶振损坏了,STM32还能正常运行?"

其中,PLL的输出频率范围是16MHz–72MHz。也就是说,PLL 在处于相位锁定的状态下,可以输出16MHz–72MHz的时钟信号。而当输入信号频率过低而导致输出信号频率低于16MHz时,将可能处于失锁的状态。在这状态下,它的输出信号的频率与输入信号的频率之间,不一定符合所设定的倍频与分频关系。更确切的说,不能通过公式:

“晶振损坏了,STM32还能正常运行?"

得出“输入信号频率为零时,输出信号频率也为零”这样的结论。这一点与实测的结果相吻合。

结论:

STM32的PLL在没有输入信号的情况下,仍能维持在最低的频点处振荡,产生输出。以至,CPU及其它外设仍能在PLL送出的时钟的驱动下运行。所以,通过判断有无时钟来驱动CPU执行指令的方式来判断HSE是否失效是行不通的。

处理:

对软件做如下修改:

1、在软件的初始化部分,开启STM32的CSS功能;

2、修改NMI中断服务程序,加入 while(1)陷阱语句;

开启CSS功能后,当HSE失效时,STM32会自动开启HSI,并将系统时钟的来源切换到HSI的输出,同时产生NMI中断。这样,程序的流程将停留在NMI中而不能产生复位片外的看门狗的脉冲。当片外看门狗溢出后,就会复位STM32,使其恢复到正常驻的状。

建议:

STM32中的CSS功能是专门为检测和处理HSE失效而设计的。但该功能在STM32复位后是被禁止的,需要软件对其使能才会发挥作用。当CSS单元检测到HSE失效时,它会使能HSI,并将系统时钟切换到HSI。同时,它会关闭HSE,如果PLL的输入信号来自HSE的输出,它也会关闭PLL。CSS单元在做时钟调整的同时,也会产生一个NMI中断请求,和一个送给高级定时器的刹车信号。NMI中断请求会产生一个NMI中断,以便用户程序可以在中断服务程序中做紧急处理,而刹车信号则是使高级定时器进入刹车状态,以防止由其控制的电机驱动桥臂由于失去控制而过流。用户程序可以在NMI中断服务程序中尝试恢复HSE及PLL的功能,也可以使用陷阱让程序的流程停留在服务程序中,从而等待看门狗复位整个系统。

“晶振损坏了,STM32还能正常运行?"

来源:玩转单片机与嵌入式
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 82

作者:Vanilla.044

前言

最近一周多的时间开始学习并自己动手制作了一个循迹小车,主要运用的就是tb6612芯片以及红外避障模块,这篇博客主要就是总结一下在制作小车过程中学习到的知识以及问题。

一、有关IO输出输入的总结

在这次小车制作中,我使用到的有tb6612电机驱动芯片和MH-Sensor-Series红外循迹避障模块,两者的使用方法都不是很复杂,只需要在对应的引脚上接高低电平或者接输入引脚即可,但正是这么基础的引脚操作中也发现了很多小细节,有同学在制作小车的过程中就遇到了写完代码根本没达到预期效果,后来才发现是一些引脚的模式或者使能问题,因此我也更详细学习了一下IO口的八种输入输出模式。

下面就是我个人对这几种模式的理解

一、输入模式

1. 浮空输入(GPIO_Mode_IN_FLOATING)

该模式主要针对芯片本身,以及其他的逻辑器件(即由大量逻辑开关组成的元器件),在该模式下,引脚既不表现为高电平也不表现为低电平,如果用电压表测量测得的可能也有所不同。

浮空输入大多数情况就是代表该引脚什么都不接,但是在网上也有说可以用于ADC传输数据使用,但我并不了解。

这个模式基本用不上,如果以后我有使用会在这里记录。

2. 上拉输入(GPIO_Mode_IPU)

在上拉输入模式下,引脚什么都不接的情况下表现为高电平,当连接到TTL(高电平低电平)信号时,会发生改变。

在没有输入或者是输入为高电平时,其电压为高;输入为低电平时,电压为低。

这里要注意的是没有输入的时候就处于高电平,适用于那些平常状态输出高,特殊状态输出低的模块。

3. 下拉输入(GPIO_Mode_IPD)

和上拉输入类似

在下拉输入模式下,引脚什么都不接的情况下表现为低电平,当连接到TTL(高电平低电平)信号时,会发生改变。

在没有输入或者是输入为低电平时,其电压为低;输入为高电平时,电压为高。

这里要注意的是没有输入的时候就处于低电平,适用于那些平常状态输出低,特殊状态输出高的模块。

4. 模拟输入(GPIO_Mode_AIN)

模拟输入不同于以上三种输入模式,前面三种模式都是数字信号的输入也就是非高即低的信号,而模拟输入就是输入未经处理的信号,可以是一段连续的电压不固定的信号。

往往在数模转换中需要用到,比如读取某个引脚的电压值,这个电压值就可能是PWM波形,使用模拟输入就可以讲信号不经处理的传给ADC模块进行分析。

二、输出模式

1. 开漏输出(GPIO_Mode_Out_OD)

在开漏模式下,控制IO输出低时IO口输出低,控制IO口输出高时IO口既不输出高也不输出低,电压不确定。(由外部驱动,降低芯片的驱动压力)

在使用该模式时,通常外接一个电阻,通过这个电阻来给予高电平。“推挽输出模式一般应用在输出电平为0和3.3伏而且需要高速切换开关状态的场合”

或者在推挽输出模式下我们输出的电平是3.3V,但是我们想要达到一个5V的输出,就可以采用开漏输出,通过外接一个上拉电阻来控制我们的电压能够达到5V。

再或者可以用一个IO口进行双向的数据传输。

首先从引脚往外这个指向来说,引脚输出低时IO为低,引脚输出高时外部可以由上拉电阻将IO上拉为高。

其次从外往引脚这个指向来说,由于IO的高低电平与外部上拉电阻有关,也就可以通过外部上拉电阻的有无来 反向控制IO的高低,之后可以运用寄存器读取IO状态从而获得外部的电平信号。这样就可以达到IO口的双向功能。(仅个人理解)

上拉电阻的阻值不仅影响输出的电平高低,还影响着信号的延迟,阻值越大信号也就越延迟但是功耗小。

2. 推挽输出(GPIO_Mode_Out_PP)

引脚输出低时IO为低,引脚输出高时IO输出高。

3. 推挽复用输出(GPIO_Mode_AF_PP)

可以使用IO口的第二功能,例如定时器、串口等。相当于是输出信号更多样的推挽输出。

输出PWM信号时需要使用该输出模式。

4. 开漏复用输出(GPIO_Mode_AF_OD)

可以使用IO口的第二功能,例如定时器、串口等。相当于是输出信号更多样的开漏输出。

二、PWM输出的一些总结

1.引脚与定时器和通道的对应关系




STM32的定时器除了定时器6和定时器7都可以用来产生PWM,定时器1和定时器8是高级定时器,都可可以同时产生7路PWM,需要注意的是在配置高级定时器时需要多加这样的一行代码。

TIM_CtrlPWMOutputs(TIM1,ENABLE);

这一行代码可以追根源头发现是控制的是 刹车和死区寄存器(TIMx_BDTR)

2. 一些结构体成员的介绍

①TIM_OCInitStructure.TIM_OCMode
该元素设置的是PWM的模式,可以指定两种模式

TIM_OCMode_PWM1
在向上计数时,一旦装载值小于占空比时通道为无效电平,否则为有效电平
在向下计数时,一旦装载值大于占空比时通道为有效电平,否则为无效电平。

TIM_OCMode_PWM2
向上计数时,一旦装载值小于占空比时通道1为有效电平,否则为无效电平
向下计数时,一旦转载值大于占空比时通道1为无效电平,否则为有效电平。

②PWM初始化函数的两个入口参数
TIM_TimeBaseStructure.TIM_Period
该元素设置的是计数值,通常是PWM初始化函数的第一个入口参数arr,这个值影响一次PWM周期的时间长短。

TIM_TimeBaseStructure.TIM_Prescaler
该元素设置的是预分频值,通常是PWM初始化函数的第二个入口参数psc,这个值也影响一次PWM周期的时间长短。

由公式

Fpwm = TCLK / ((arr+1)*(psc+1)) (单位:Hz)

可计算一次PWM的周期时长

其中TCLK的具体频率可以到时钟树中查找,不同定时器的最高频率是不同的
TIM1、TIM8、TIM15、TIM16、TIM17、TIM9、TIM10、TIM11属APB2总线,最高频率为72M
TIM2、TIM3、TIM4、TIM5、TIM6、TIM7、TIM12、TIM13、TIM14属APB1总线,最高频率为36M
具体可以查数据手册

③TIM_TimeBaseStructure.TIM_CounterMode
该元素设置的是PWM的计数模式,常用的有以下两种。

TIM_CounterMode_Up
向上计数

TIM_CounterMode_Down
向下计数

还有几种不常用的


④TIM_OCInitStructure.TIM_OCPolarity
该元素设置输出极性,这个元素要配合PWM模式来说,在PWM模式中有无效电平和有效电平的区别,而具体的有效电平是什么呢?

就是在这个元素设置的,这里的元素如果设置成为TIM_OCPolarity_High则有效电平就是高电平,如果元素设置为TIM_OCPolarity_Low,则有效电平就是低电平。

总结

这篇博客主要介绍了一些输入输出函数的小细节,以及PWM的一些重要结构体元素代表什么。
输入输出与PWM可以说是STM32的基础操作,只有加强对基础的了解才可能在后面的学习中更加顺利。

写在最后

本人小白一枚,这些仅仅是我个人的经验与认知,也许含有多处错误,希望读者给我指正。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:
https://blog.csdn.net/m0_50882712/article/details/109448203

围观 291
订阅 RSS - STM32F103