16、程序加密
1.禁止读出Flash存储器内容
直接在串口烧写软件中设置即可
2.STM32用ID加密程序
(1)ID加密例程代码:
1 /************************************************************************************************************************************* 2 * 3 * 文件名称:main.c 4 * 文件功能:主函数文件 5 * 6 ***************************************************************************************************************************************/ 7 8 #include "pbdata.h"//调用自定义公共函数库 9 10 11 /********************************************************************************* 12 * 13 * 初始化操作 14 * 15 *********************************************************************************/ 16 void RCC_Configuration(void);//系统时钟初始化函数声明 17 void GPIO_Configuration(void);//GPIO初始化函数声明 18 void NVIC_Configuration(void);//中断优先级配置函数声明 19 void USART_Configuration(void);//串口配置函数声明 20 21 22 23 24 /******************************************************************************** 25 * 26 * 函数名称:main(void) 27 * 函数功能:主函数 28 * 函数说明:不能用void定义主函数 29 * 30 ********************************************************************************/ 31 int main(void)//void不能void定义主函数 32 { 33 u8 Sys_ID[12],i; 34 35 RCC_Configuration(); //系统时钟初始化 36 37 GPIO_Configuration();//端口初始化 38 39 USART_Configuration();//串口配置 40 41 NVIC_Configuration();//中断优先级配置 42 43 for(i=0;i<12;i++) 44 { 45 Sys_ID[i]=*(u8*)(0x1FFFF7E8+i);//读取ID 46 printf(" %0.2X",Sys_ID[i]);//打印出ID 47 } 48 49 50 51 /*设备号31 FF D8 05 43 46 36 37 25 58 09 43*/ 52 if(Sys_ID[0]==0x31 &&Sys_ID[1]==0xff &&Sys_ID[2]==0xd8 && 53 Sys_ID[3]==0x05 &&Sys_ID[4]==0x43 &&Sys_ID[5]==0x46 && 54 Sys_ID[6]==0x36 &&Sys_ID[7]==0x37 &&Sys_ID[8]==0x25 && 55 Sys_ID[9]==0x58 &&Sys_ID[10]==0x09 &&Sys_ID[11]==0x43) 56 printf("\nsuccess\n");//如果ID正确 57 else 58 printf("\nfail\n");//如果ID错误 59 60 61 62 while(1); 63 64 } 65 66 67 68 69 /******************************************************************************** 70 * 71 * 函数名称:RCC_Configuration(void) 72 * 函数功能:系统时钟高初始化函数 73 * 74 ********************************************************************************/ 75 void RCC_Configuration(void)//系统时钟高初始化函数 76 { 77 78 SystemInit();//系统初始化 79 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//串口对应GPIO时钟使能 80 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//串口时钟使能 81 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//引脚复用 82 83 } 84 85 86 87 /******************************************************************************* 88 * 89 * 函数名称:GPIO_Configuration(void) 90 * 函数功能:GPIO初始化函数 91 * 92 ********************************************************************************/ 93 94 void GPIO_Configuration(void)//GPIO初始化函数 95 { 96 97 98 /*串口引脚配置*/ 99 GPIO_InitTypeDef GPIO_InitStructure;//定义一个GPIO设置的结构体变量 100 101 /*输出引脚配置*/ 102 /*结构体变量赋值*/ 103 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;////引脚配置TX 104 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//配置频率 105 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//发送要配置成复用推挽输出 106 /*对应的GPIO初始化*/ 107 GPIO_Init(GPIOA,&GPIO_InitStructure); 108 109 110 /*输入引脚配置*/ 111 /*结构体变量赋值*/ 112 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;////引脚配置RX 113 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//接收引脚配置成浮空输入 114 /*对应的GPIO初始化*/ 115 GPIO_Init(GPIOA,&GPIO_InitStructure); 116 117 118 } 119 120 121 /**************************************************************************** 122 * 123 * 函数名称:NVIC_Configuration(void) 124 * 函数功能:配置中断优先级 125 * 126 ****************************************************************************/ 127 128 void NVIC_Configuration(void) 129 { 130 NVIC_InitTypeDef NVIC_InitStructure; //定义一个优先级配置结构体变量 131 132 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//分组 133 134 NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; 135 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//抢断优先级 136 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//响应优先级 137 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能 138 139 NVIC_Init(&NVIC_InitStructure);//初始化 140 } 141 142 143 /********************************************************************************* 144 * 145 * 函数名称: 146 * 函数功能:串口配置函数 147 * 148 *********************************************************************************/ 149 void USART_Configuration(void) 150 { 151 /*定义串口配置结构体变量*/ 152 USART_InitTypeDef USART_InitStructure;//定义一个串口配置结构体变量 153 154 155 /*结构体变量赋值*/ 156 USART_InitStructure.USART_BaudRate = 9600;//波特率9600 157 USART_InitStructure.USART_WordLength = USART_WordLength_8b;//位宽,8位 158 USART_InitStructure.USART_StopBits = USART_StopBits_1;//停止位1 159 USART_InitStructure.USART_Parity = USART_Parity_No;//不奇偶校验 160 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//流控禁止 161 USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;//发送使能 162 163 164 /*发送串口配置初始化*/ 165 USART_Init(USART1, &USART_InitStructure); 166 167 168 /*打开串口接收中断*/ 169 USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//当接收到数据时,会产生中断 170 171 172 /*打开串口*/ 173 USART_Cmd(USART1,ENABLE);//串口使能,打开 174 175 /*清空中断标志位*/ 176 USART_ClearFlag(USART1,USART_FLAG_TC); 177 } 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213
1 /*pbdata.h*/ 2 /*************************************************************************************************** 3 * 4 * 文件名称:pbdata.h 5 * 文件功能:自定义的函数和全局变量的声明头文件 6 * 7 ***************************************************************************************************/ 8 9 #ifndef _pbdata_H 10 #define _pbdata_H 11 12 13 14 15 16 /******************************************************************** 17 * 18 * 调用的头文件放在这里 19 * 20 ********************************************************************/ 21 #include "stm32f10x.h" 22 #include "misc.h" 23 #include "stm32f10x_exti.h" 24 #include "stm32f10x_tim.h" 25 #include "stm32f10x_usart.h" 26 #include "stdio.h" 27 28 29 30 31 /******************************************************************** 32 * 33 * 自定义全局变量声明 34 * 35 ********************************************************************/ 36 extern u8 dt; 37 38 39 40 41 42 /******************************************************************** 43 * 44 * 自定义全函数声明 45 * 46 ********************************************************************/ 47 void delay(u32 nCount); 48 void delay_us(u32 nus); 49 void delay_ms(u16 nms); 50 int fputc(int ch,FILE *F); 51 52 53 54 #endif
1 /**************************************************************************************************************** 2 * 3 * 文件名称:pbdata.c 4 * 文件功能:自定义函数或者全局变量的初始化 5 * 6 ****************************************************************************************************************/ 7 8 /*头文件声明*/ 9 #include "pbdata.h" 10 11 12 13 14 /******************************************************************************************** 15 * 16 * 自定义全局变量 17 * 18 ********************************************************************************************/ 19 u8 dt=0; 20 21 22 23 24 25 /****************************************************************************************** 26 * 27 * 自定义函数 28 * 29 ******************************************************************************************/ 30 31 32 33 /************************************************** 34 * 35 * 函数名称:delay_us(u32 nus) 36 * 函数功能:微秒延时函数 37 * 输入参数:输入值为延时us 38 * 39 ***************************************************/ 40 void delay_us(u32 nus) 41 { 42 u32 temp; 43 SysTick->LOAD = 9*nus;//载入初值,72M/8=9M,也就是1/9us,9*1/9us,所以是执行9次 44 SysTick->VAL=0X00;//清空计数器,清空后,就自动设置自己设定的计数器的值 45 SysTick->CTRL=0X01;//使能,减到零动作(不发生中断),采用外部时钟 46 47 do 48 { 49 temp=SysTick->CTRL;//标志位,等到一直减到0 50 }while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达 51 52 SysTick->CTRL=0x00; //关闭计数器 53 SysTick->VAL =0X00; //清空计数器 54 } 55 56 57 58 59 60 61 62 /*************************************************** 63 * 64 * 函数名称:delay_ms(u16 nms) 65 * 函数功能:毫秒级延时 66 * 输入参数:输入值位延时ms 67 * 68 ****************************************************/ 69 void delay_ms(u16 nms) 70 { 71 u32 temp; 72 SysTick->LOAD = 9000*nms;//载入初值,72M/8=9M,也就是1/9us,9*1/9us,所以是执行9000次 73 SysTick->VAL=0X00;//清空计数器,清空后,就自动设置自己设定的计数器的值 74 SysTick->CTRL=0X01;//使能,减到零动作(不发生中断),采用外部时钟 75 76 do 77 { 78 temp=SysTick->CTRL;//标志位,等到一直减到0 79 }while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达 80 81 SysTick->CTRL=0x00; //关闭计数器 82 SysTick->VAL =0X00; //清空计数器 83 } 84 85 86 87 /**************************************************** 88 * 89 * 重定义printf函数部分 90 * 91 ****************************************************/ 92 int fputc(int ch,FILE *F) 93 { 94 95 USART_SendData(USART1,(u8)ch); 96 97 while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//等待发送完成,判断标志位 98 99 return ch; 100 }
(2)ID加密工程下载:
http://download.csdn.net/detail/a1181803348/8766353