導航:首頁 > 源碼編譯 > stm32md5演算法

stm32md5演算法

發布時間:2022-12-21 17:16:58

『壹』 stm32的這句功能理解,但是C語言怎麼解釋 :RCC->CFGR|=1<<16

RCC->CFGR|=1<<16;相當於RCC->CFGR=(1<<16);或者r=1; r<<=16; RCC->CFGR=r;
而如果寫成RCC->CFGR<<16|=1;這個是個語法錯誤的語句,原因是賦值號左邊不能出現表達式。實際上你的字面意思是先將CFGR寄存器的值讀出來然後左移16位再在最低位或個1,這不是將第16位置一的演算法
將第16位置1就是用這個寄存器或上一個第16位是1的數,1<<16就是這樣一個數。

『貳』 使用TouchGFX開發STM32界面應用之入門篇(三)-- 多屏呈現與MVP框架(3)

【註:這是《TouchGFX入門篇(三)-- 多屏呈現與MVP框架》文章的第二部分的續篇,之前的部分請 看這里 】

之前我們已經完成了2個Screen的創建,以及他們之間的相互切換和數據交換。下面繼續實現時鍾的走時和圓弧的動畫。

為了讓時間顯示不斷變化,一個通常的想法是:利用STM32的定時器。而在touchgfx中,實現這個功能變得更加簡單:touchgfx直接提供了一個「滴答」函數(以及自動運行這個功能的機制)---- handleTickEvent()。限於文章篇幅,關於這個函數的具體解釋請見touchgfx的API說明手冊,這里直接展示如何應用他:

上圖中在Screen2View.hpp中添加了 handleTickEvent() 函數聲明和一個變數 tickCount (記錄tick的數值,逢60進位)。然後在Screen2View.cpp中實現handleTickEvent() :

模擬器運行效果如下:

還需要最後一步:處理圓弧,讓他動起來!圓弧動畫的原理:定時更新圓弧的起始位置和結束位置。增加2個變數addStart、addEnd,分別控制首末位置的「增量」,addStart==2、addEnd==1時,起始位置變得快、結束位置變得慢,看起來就是圓弧長度在縮短;反之,圓弧長度則不斷變長(不理解這個演算法沒關系,看下面圖示):

細心的你可能已經看到:設置頁面里設置的是分鍾,但運行頁面里分鍾卻是按秒變化的 ---- 這個bug留給你修改吧。

最後,燒寫到目標板上跑跑看!(本講完畢)

『叄』 如何stm32解決燒寫地址演算法重疊

1、 打開J_Flash ARM

出現如下工作界面:

2、選擇Options—Project settings

進入Project settings界面:,

3、點擊CPU,選擇合適的型號:
此時,我們在device裡面選擇好我們目標板上的晶元就可以了,然後點擊確認。
4、我們現在將JLINK和目標板進行連接:Target ——connect

沒有跳出錯誤,說明連接成功。
5、打開我們要燒錄的hex文件:

選擇需要燒錄的程序:

選擇HEX文件後如下圖所示:

7.燒錄程序:

如果有彈出窗口,選擇是或者確定。
8.重啟設備

『肆』 最近學習STM32,發現一個奇怪的問題,32位的系統,存儲器地址空間應該是2的32次方bit,怎麼計算,都是4Gbit

你的演算法沒問題,你的理解有問題!32位的操作系統理論上最多支持4GBytes是沒問題的。
1Bytes(位元組)=8bits(字位)也是沒問題的。你存在概念性錯誤,你的計算方案應該是以CUP的32位數來計算就只有2^32bits= 512MByte,然而2^32Byte=4GB。
首先你要區分32位操作系統和32位的處理器(cpu)的區別和聯系。
(一)32位CPU每次可以處理32個字位,即32bits=4Bytes。每一個位元組都有一個地址,其中包含了8個字位。32位CPU有32跟地址線,地址線決定了定址范圍的能力。每一根線都決定0和1兩個地址,那麼兩根線就會決定00,01,10,11這四個地址,依次類推,32根線總共會決定出2^32次方個位置。這樣計算是沒有問題的。每一個位置都是1Byte,這是內存的基本單位,所以32位操作系統配32位CPU,理論上可以尋找4GB的地址。由於硬體等原因,系統顯示會不到4G。
(二)32位操作系統與64位CPU的搭配。64位CPU有64根地址匯流排,理論支持2^32/1024^3 G的內存,這是一個很大的數字,但是實際上我們市場的電腦目前遠遠達不到這個理論內存的萬分之一。目前64位也就是能支持120G的內存。但是如果64位CPU和32位操作系統搭配,也僅僅會支持4G的內存。因為在32位系統下,僅有32根地址線工作。
(三)定址范圍是由地址線個數確定的,而不是CPU位數確定的。CPU的地址匯流排根數決定了能找到多少個位元組(Byte),數據匯流排的寬度決定了能夠一次傳送多少個二進制位(bit) 。希望你能明白其中的關系,不要把地址線直接和字位(bit)聯系在一起。

『伍』 STM32的加密庫在哪兒

關於STM32加密
摘要:
知識產權的保護,如何讓自已辛勤的勞動成果不被別人抄襲,採用有效的手段對IC加密是值得每一個設計者關注的問題。
當然,有人說,沒有解不了密的IC,的確,解密是一項技術,只要有人類在不斷的研究,它就有破解的一天;但是加密後的IC會增加破解的難度與破解成本,當破解的成本大於收益時,自然就會使破解者望而卻步。
STM32晶元這兩年銷量很好,它的性能和價格都很不錯,但如何對STM32進行加密呢,本人結合自已使用STM32 MCU一年多的經驗,總結一下我對它加密的理解與方法。
關鍵字: STM32 加密 讀保護
加密,最基本的方法是置讀保護,這樣可以防止外部工具非法訪問,在STM32官網發布的 串口ISP軟體中有置讀保護和加密選項,選擇一個就可以了,這樣外部工具就無法對FLASH進行讀寫操作,但我要重新燒寫FLASH怎麼辦?只能清讀保護,而清讀保護後,晶元內部會自動擦除FLASH全部內容。
還有人說,置讀保護還不夠安全,說要採用晶元內的唯一ID來加密,在程序里識別晶元的ID,如果ID不對,則程序不運行,當然,這樣安全性又要更高一些,但每個晶元的ID不一樣,因此對應的程序也應該不一樣,那如何處理呢?有網友說:采購的時候,產品同批生產的ID號應該是連續的,可以通過判別ID的范圍;還有網友說,在燒錄工具里做一個演算法,讀取晶元ID,再修改相應的二進制文件。當然還會有很多種方法,這里不展開討論。
以上介紹的只是一種情況,在實際的應用中還會發生第二種情況。
我們知道,STM32的內部FLASH是用戶可編程的,也就是說它支持IAP,而IAP中的APP代碼一般是需要開放的,那麼只有保證BOOT的代碼安全,才能確保不被破解。

前面提到,當IC置讀保護後,外部工具不能訪問內部FLASH,但CPU可以訪問,破解者完全可以自已編寫一段代碼通過BOOT下載到IC 運行,然後在程序中讀出你的BOOT代碼。
只能加以限制,使別人的代碼運行不了,才能保證BOOT不被讀出。
常用的方法是採用加密演算法,如AES;流程如下:
APP代碼加密,下載時,在BOOT中解密,這樣,只有通過正確加密的APP代碼才能正常的運行,因此加密的演算法就成了你的密鑰,而這個是你獨有的。

參考資料:《STM32F1x Flash Programming.pdf》作者:STMicroelectronics

『陸』 求生成MD5碼的c或c++代碼

自己用C語言寫的簡單的MD5演算法實現。

#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <math.h>

typedef unsigned char BYTE;
typedef unsigned int UINT;
typedef UINT MD5_SUB_ARRAY[16];
typedef UINT MD5_TRANSORM_FUNC(UINT,UINT,UINT);
typedef struct
{
UINT a;
UINT b;
UINT c;
UINT d;
MD5_SUB_ARRAY sub_array;
}MD5_TRANSFORM_PARAM;

const double MAX_INT = (double)0xFFFFFFFF + 1.0;

const UINT MD5_TRANSFORM_MATRIX[4][16][3] =
{

{
{ 0, 7, 1}, { 1,12, 2}, { 2,17, 3}, { 3,22, 4},
{ 4, 7, 5}, { 5,12, 6}, { 6,17, 7}, { 7,22, 8},
{ 8, 7, 9}, { 9,12,10}, {10,17,11}, {11,22,12},
{12, 7,13}, {13,12,14}, {14,17,15}, {15,22,16},
},

{
{ 1, 5,17}, { 6, 9,18}, {11,14,19}, { 0,20,20},
{ 5, 5,21}, {10, 9,22}, {15,14,23}, { 4,20,24},
{ 9, 5,25}, {14, 9,26}, { 3,14,27}, { 8,20,28},
{13, 5,29}, { 2, 9,30}, { 7,14,31}, {12,20,32},
},

{
{5, 4, 33}, { 8,11,34}, {11,16,35},{14, 23,36},
{1, 4, 37}, { 4,11,38}, { 7,16,39},{10, 23,40},
{13,4, 41}, { 0,11,42}, { 3,16,43},{ 6, 23,44},
{9, 4, 45}, {12,11,46}, {15,16,47},{ 2, 23,48},
},

{
{ 0,6,49}, { 7,10,50}, {14,15,51},{ 5, 21,52},
{12,6,53}, { 3,10,54}, {10,15,55},{ 1, 21,56},
{ 8,6,57}, {15,10,58}, { 6,15,59},{13, 21,60},
{ 4,6,61}, {11,10,62}, { 2,15,63},{ 9, 21,64},
},
};

static UINT MD5_TRANSFORM_ARRAY[65];

void MD5_Init()
{
int x;
for(x = 1; x <= 64; x++)
{
MD5_TRANSFORM_ARRAY[x] = (UINT)(MAX_INT * fabs(sin(x)));
}
}

UINT F(UINT x,UINT y,UINT z)
{
return ((x & y) | ((~x) & z));
}

UINT G(UINT x,UINT y,UINT z)
{
return ((x & z) | (y & (~z)));
}

UINT H(UINT x,UINT y,UINT z)
{
return (x ^ y ^ z);
}

UINT I(UINT x,UINT y,UINT z)
{
return (y ^ (x | (~z)));
}

BYTE* MD5_prepare_data(const BYTE* data,int len,int* new_len)
{
int rest,fill,size;
BYTE* new_data;
UINT bit_len;

// (1) 位元組補齊
rest = len % 56;
if (rest <= 56) fill = 56 - rest;
else fill = (64 - rest) + 56;

new_data = (BYTE*)malloc(len + fill + 8);
if (NULL == new_data) return NULL;

if (len > 0) memcpy(new_data,data,len);
if (fill > 0) memset(new_data + len,0x80,1);
if (fill > 1) memset(new_data + len + 1,0,fill - 1);

size = fill + len;

// (2) 附加數據的比特長度
bit_len = len * 8;
// (64位二進制數表示的)比特長度的低32位
memset(new_data + size + 0,(bit_len & 0x000000FF), 1);
memset(new_data + size + 1,(bit_len & 0x0000FF00) >> 8, 1);
memset(new_data + size + 2,(bit_len & 0x00FF0000) >> 16,1);
memset(new_data + size + 3,(bit_len & 0xFF000000) >> 24,1);
// 不考慮比特長度超出32位無符號數表示範圍,所以高32位總是0
memset(new_data + size + 4,0,4);

*new_len = size + 8;

return new_data;
}

void MD5_transform(MD5_TRANSFORM_PARAM* param,int ring,MD5_TRANSORM_FUNC func)
{
UINT a,b,c,d,s,k,i;
UINT abcd[4];
UINT *X,*T;
int index;

abcd[0] = param->a;
abcd[1] = param->b;
abcd[2] = param->c;
abcd[3] = param->d;
X = param->sub_array;
T = MD5_TRANSFORM_ARRAY;

for(index = 0; index < 16; index++)
{
a = abcd[(3 * index + 0) % 4];
b = abcd[(3 * index + 1) % 4];
c = abcd[(3 * index + 2) % 4];
d = abcd[(3 * index + 3) % 4];

k = MD5_TRANSFORM_MATRIX[ring][index][0];
s = MD5_TRANSFORM_MATRIX[ring][index][1];
i = MD5_TRANSFORM_MATRIX[ring][index][2];

a = a + func(b,c,d) + X[k] + T[i];
a = ( a << s) | ( a >> (32 - s)); // 循環左移
a = a + b;

abcd[(3 * index + 0) % 4] = a;
}

param->a = abcd[0];
param->b = abcd[1];
param->c = abcd[2];
param->d = abcd[3];
}

int MD5(const BYTE* data,int len)
{
int x,y,new_len;
MD5_TRANSFORM_PARAM param;
UINT AA,BB,CC,DD;
BYTE* buf;

MD5_Init();

buf = MD5_prepare_data(data,len,&new_len);
if (buf == NULL) return -1;

AA = 0x67452301;
BB = 0xefcdab89;
CC = 0x98badcfe;
DD = 0x10325476;

for(x = 0; x < new_len / 64; x++)
{
param.a = AA;
param.b = BB;
param.c = CC;
param.d = DD;

for(y = 0; y < 16; y++)
{
param.sub_array[y] = buf[64 * x + 4 * y + 0];
param.sub_array[y] += buf[64 * x + 4 * y + 1] << 8;
param.sub_array[y] += buf[64 * x + 4 * y + 2] << 16;
param.sub_array[y] += buf[64 * x + 4 * y + 3] << 24;
}
MD5_transform(¶m,0,F);
MD5_transform(¶m,1,G);
MD5_transform(¶m,2,H);
MD5_transform(¶m,3,I);

AA += param.a;
BB += param.b;
CC += param.c;
DD += param.d;
}

printf("MD5(\"%s\")=",data);

printf("%02X%02X%02X%02X",
(AA & 0x000000FF),
(AA & 0x0000FF00) >> 8,
(AA & 0x00FF0000) >> 16,
(AA & 0xFF000000) >> 24);

printf("%02X%02X%02X%02X",
(BB & 0x000000FF),
(BB & 0x0000FF00) >> 8,
(BB & 0x00FF0000) >> 16,
(BB & 0xFF000000) >> 24);

printf("%02X%02X%02X%02X",
(CC & 0x000000FF),
(CC & 0x0000FF00) >> 8,
(CC & 0x00FF0000) >> 16,
(CC & 0xFF000000) >> 24);

printf("%02X%02X%02X%02X",
(DD & 0x000000FF),
(DD & 0x0000FF00) >> 8,
(DD & 0x00FF0000) >> 16,
(DD & 0xFF000000) >> 24);

printf("\n");

return 0;
}

int main()
{
MD5("",0);
MD5("a",1);
MD5("abc",3);
MD5("message digest",14);
MD5("abcdefghijklmnopqrstuvwxyz",26);

return 0;
}

『柒』 stm32單片機能寫復雜控制演算法么

1.PID原理
1.1 P I D三個參數簡單理解
1.2 P I D
1.3 PI PD PID適用系統
2.串級PID原理
3.PID代碼
3.1 單級PID
3.1.1 初始化PID結構體
3.1.2 單級PID計算
3.1.3PID初始化
3.1.4 清空PID
3.2 串級PID
3.2.1 初始化串級PID結構體
3.2.2 串級PID計算
4.PID的使用
4.1 定義PID結構體並初始化
4.2 定義電機速度函數
4.3 在檢測霍爾碼盤時發送速度給電機
4.4 實驗效果
1.PID原理
PID是什麼,P,I,D的分別功能

你和PID調參大神之間,就差這篇文章!

1.1 P I D三個參數簡單理解
P(比例): 簡單來說,P就是涼了加熱水,熱了加涼水。比目標值小,我就增加一點,比目標值大,我就減小一點。(現在)
P可能出現的問題: 1.P太小,達到目標值需要花費很長的時間,而且會有穩態誤差。2.P太大,達到目標值時可能會一直震盪。

I(積分): 將一段時間內的誤差累積起來加到輸出上,可以消除歷史誤差對當前實際曲線的影響,提高系統的穩定性。 (過去)
I可能出現的問題: 1.I太小,可以消除穩態誤差,但太慢了,對於某些需要很快響應的系統,顯然不能滿足要求。2.I太大,累計誤差佔比過大,就會出現抖動現象,難以收斂。

D(微分): 減小最大超調量。(下圖中③就是最大超調量。) 可以有效減小震動的幅度。讓曲線收斂更快 (未來)
D可能出現的問題: 1.D太小,作用小,時間長。2.D太大,為了減小超調量,補償的過多,導致震盪很久。
在這里插入圖片描述

1.2 P I D
先調P,逐漸增加P直到系統出現震盪,將當前值乘0.7就是較為合適的值。
再調I,將穩態誤差逐漸降低。
後調D,將最大超調量降到最低。

1.3 PI PD PID適用系統
PI:響應速度要求不那麼高的系統。
PD:大慣性系統。超調量太大。
PID:都可以。

網上將PID原理太多太多了,我的理解也都是參見上面的內容。認真看肯定有收獲。

2.串級PID原理
【串級PID】淺談串級PID作用及意義——快速理解串級PID結構優勢

這里個人理解就是,單機PID就是穩定速度。而需要帶位置和角度的就要用串級PID了。常用於平衡車,板球系統等。
而轉速閉環稱為串級PID的內環,位置 (角度) 閉環稱為串級PID的外環。其實也很好理解,位移是速度的積分,只有速度慢慢穩定,位置才能確定。

3.PID代碼
3.1 單級PID
3.1.1 初始化PID結構體
typedef struct _PID
{
float kp,ki,kd;
float error,lastError;//誤差、上次誤差
float integral,maxIntegral;//積分、積分限幅
float output,maxOutput;//輸出、輸出限幅
}PID;
1
2
3
4
5
6
7
1
2
3
4
5
6
7
3.1.2 單級PID計算
#define LIMIT(x,min,max) (x)=(((x)<=(min))?(min):(((x)>=(max))?(max):(x)))

//單級pid計算
void PID_SingleCalc(PID *pid,float reference,float feedback)
{
//更新數據
pid->lastError=pid->error;
pid->error=reference-feedback;
//計算微分
pid->output=(pid->error-pid->lastError)*pid->kd;
//計算比例
pid->output+=pid->error*pid->kp;
//計算積分
pid->integral+=pid->error*pid->ki;
LIMIT(pid->integral,-pid->maxIntegral,pid->maxIntegral);//積分限幅
pid->output+=pid->integral;
//輸出限幅
LIMIT(pid->output,-pid->maxOutput,pid->maxOutput);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
3.1.3PID初始化
void PID_Init(PID *pid,float p,float i,float d,float maxI,float maxOut)
{
pid->kp=p;
pid->ki=i;
pid->kd=d;
pid->maxIntegral=maxI;
pid->maxOutput=maxOut;
}
1
2
3
4
5
6
7
8
1
2
3
4
5
6
7
8
3.1.4 清空PID
//清空一個pid的歷史數據
void PID_Clear(PID *pid)
{
pid->error=0;
pid->lastError=0;
pid->integral=0;
pid->output=0;
}
1
2
3
4
5
6
7
8
1
2
3
4
5
6
7
8
3.2 串級PID
3.2.1 初始化串級PID結構體
typedef struct _CascadePID
{
PID inner;//內環
PID outer;//外環
float output;//串級輸出,等於inner.output
}CascadePID;
1
2
3
4
5
6
1
2
3
4
5
6
3.2.2 串級PID計算
//串級pid計算
void PID_CascadeCalc(CascadePID *pid,float angleRef,float angleFdb,float speedFdb)
{
PID_SingleCalc(&pid->outer,angleRef,angleFdb);//計算外環(角度環)
PID_SingleCalc(&pid->inner,pid->outer.output,speedFdb);//計算內環(速度環)
pid->output=pid->inner.output;
}
1
2
3
4
5
6
7
1
2
3
4
5
6
7
4.PID的使用
STM32應用(九)編碼器及其測速原理、L298N電機驅動控制編碼器電機

在這篇博客的配置下,只需要修改部分代碼。以單級PID為例子。

4.1 定義PID結構體並初始化
PID pid;

void Motor_Init(void)
{
PID_Init(&pid,10,0,0,1000,1000);
HAL_TIM_Encoder_Start(&htim1, TIM_CHANNEL_ALL); //開啟編碼器定時器
__HAL_TIM_ENABLE_IT(&htim1,TIM_IT_UPDATE); //開啟編碼器定時器更新中斷,防溢出處理
HAL_TIM_Base_Start_IT(&htim6); //開啟10ms定時器中斷
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1); //開啟PWM
__HAL_TIM_SET_COUNTER(&htim1, 10000); //編碼器定時器初始值設定為10000
motor.loopNum = 0; //防溢出
}
1
2
3
4
5
6
7
8
9
10
11
12
1
2
3
4
5
6
7
8
9
10
11
12
4.2 定義電機速度函數
void Motor_Send()
{
float output = 0;
PID_SingleCalc(&pid, motor.targetSpeed, motor.speed);
output = pid.output;
if(output > 0) //正轉
{
__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1, (uint32_t)output);
IN1(1);
IN2(0);
}
else //反轉
{
__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1, (uint32_t)(-output));
IN1(0);
IN2(1);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
4.3 在檢測霍爾碼盤時發送速度給電機
if(htim->Instance==htim6.Instance) //10ms中斷
{
int16_t pluse = COUNTERNUM - RELOADVALUE/2;
motor.totalAngle = pluse + motor.loopNum * RELOADVALUE/2;
motor.speed = (float)(motor.totalAngle - motor.lastAngle)/(4*13*RR)*6000; //進行速度計算,根據前文所說的,4倍頻,編碼器13位,減速比30,再乘以6000即為每分鍾輸出軸多少轉
motor.lastAngle = motor.totalAngle; //更新轉過的圈數
Motor_Send();//發送速度
}

『捌』 怎樣對STM32加密,防止被讀出復制

1,如果板子上有外部存儲器,可以先編寫一個程序,利用演算法把id計算得到一些值存入外部存儲器,然後再燒寫真正的程序,真正的程序去校驗外部存儲器的數據是否合法即可

2,利用板子上按鍵組合,或是上電按住某些鍵,程序在這個時候利用演算法把id計算得到一些值存入程序區(stm8為EE區),程序運行時去驗證程序區數據是否正確

3,軒微編程器有軟體加密的功能,編程器會讀晶元id,根據演算法直接改寫緩沖區,達到軟體加密的作用

4,讀出的id通過一定演算法,例如異或加上一個數,得到的數據存入flash(只運行一次,運行後標志位也存入flash),下次讀到這個標志位,就不運行這個程序。

四、做軟體加密時注意
1,不要在程序中直接出現id地址,例如STM32:1FFFF7E8 1FFFF7EC 1FFFF7F0 STM8: 0x4865~0x4870
2, 利用校驗和或是crc對程序區進行校驗,防止改程序

『玖』 stm32求電流有效值演算法

電流的有效值應該從電流產生的熱效應來考慮,總的熱是 I^2*Rt,,R是電阻,t是產生這么多的熱所用的時間,公式裡面的I 就是電流的有效值

閱讀全文

與stm32md5演算法相關的資料

熱點內容
php開發客戶端 瀏覽:998
theisle測試服怎麼搜伺服器 瀏覽:447
廣播PDF 瀏覽:218
單片機編程300例匯編百度 瀏覽:35
騰訊雲連接不上伺服器 瀏覽:221
不能用來表示演算法的是 瀏覽:861
6軸機器人演算法 瀏覽:890
手機主題照片在哪個文件夾 瀏覽:294
安卓手機後期用什麼軟體調色 瀏覽:628
cad修改快捷鍵的命令 瀏覽:242
好錢包app怎麼登錄不了 瀏覽:859
樹莓派都用python不用c 瀏覽:757
access文件夾樹的構造 瀏覽:662
安卓多指操作怎麼設置 瀏覽:658
linux樹形目錄 瀏覽:727
平方根的簡單演算法 瀏覽:898
千牛訂單頁面信息加密取消 瀏覽:558
單片機自製紅外遙控燈 瀏覽:719
伺服器最小配置怎麼弄 瀏覽:853
ibm伺服器硬體如何升級 瀏覽:923