📄 main.c
字号:
/****************************************Copyright (c)**************************************************
** Guangzou ZLG-MCU Development Co.,LTD.
** graduate school
** http://www.zlgmcu.com
**
**--------------File Info-------------------------------------------------------------------------------
** File name: main.c
** Last modified Date: 2004-09-16
** Last Version: 1.0
** Descriptions: The main() function example template
**
**------------------------------------------------------------------------------------------------------
** Created by: Chenmingji
** Created date: 2004-09-16
** Version: 1.0
** Descriptions: The original version
**
**------------------------------------------------------------------------------------------------------
** Modified by: Chenxibing
** Modified date: 2005-01-17
** Version:
** Descriptions: UART0通讯实验,中断方式,使用FIFO。
**
********************************************************************************************************/
#include "config.h"
uint8 num=0;
#define w 32 // 自定义32位4字节的类型 、 WORD的位数,也是明文块长的位数
#define r 12 // 每次进行12轮
#define b 16 // 密钥中的字节数
#define c 4 // 以WORD为单位将16字节密钥按序划为4份
/*c=max(1,ceil(8*b/w)) */
#define t 26 // 生成子密钥的个数为包含2*(r+1)元素的WORD数组
uint32 S[t]; // 子密钥数组
uint32 l_ct[2];
uint32 l_pt[2];
uint8 ki;
uint32 output[2];
uint32 P=0xb7e15163,Q=0x9e3779b9; /*两个固定16进制魔术常量 */
//uint32 pt1[2],pt2[2],ct[2]={0,0};
/*Rotation operators.x must be unsigned,to get logical right shift*/
#define ROTL(x,y) (((x)<<(y&(w-1)))|((x)>>(w-(y&(w-1)))))
#define ROTR(x,y) (((x)>>(y&(w-1)))|((x)<<(w-(y&(w-1)))))
/* 定义串口模式设置数据结构 */
typedef struct UartMode
{
uint8 datab; // 字长度,5/6/7/8可选
uint8 stopb; // 停止位,1/2可选
uint8 parity; // 奇偶校验位,0-无校验,1-奇校验,2-偶校验
}UARTMODE;
uint32 plantest[8];
uint8 rcv_buf; // UART0数据接收缓冲区
volatile uint8 rcv_new; // 接收新数据标志
/*
*********************************************************************************************************
** 函数名称 :RC5_ENCRYPT
** 函数功能 :加密程序
** 入口参数 :*pt1 输入明文
*ct 输出密文
** 出口参数 :无
*********************************************************************************************************
*/
void RC5_ENCRYPT(uint32*pt,uint32*ct) /*2WORD input pt/output ct */
{uint32 i,A=pt[0]+S[0],B=pt[1]+S[1];
for(i=1;i<=r;i++) //初始操作
{A=ROTL(A^B,B)+S[2*i]; //进行r轮异或和移位操作实现加密
B=ROTL(B^A,A)+S[2*i+1];
}
ct[0]=A;ct[1]=B; //赋以密文结果
l_ct[0]=A;
l_ct[1]=B;
}
/*
*********************************************************************************************************
** 函数名称 :RC5_ENCRYPT
** 函数功能 :解密程序
** 入口参数 :*ct 输入密文
*pt2输出明文
** 出口参数 :无
*********************************************************************************************************
*/
void RC5_DECRYPT(uint32*ct,uint32*pt) /*2WORDinputct/outputpt */
{
uint32 i,B=ct[1],A=ct[0]; //初始操作
for(i=r;i>0;i--) //进行r轮移位和异或操作实现解密
{
B=ROTR(B-S[2*i+1],A)^A;
A=ROTR(A-S[2*i],B)^B;
}
pt[1]=B-S[1];
pt[0]=A-S[0]; //赋以明文结果
l_pt[0]=pt[0];
l_pt[0]=pt[1];
}
/*
*********************************************************************************************************
** 函数名称 :RC5_SETUP
** 函数功能 :生成子密钥
** 入口参数 :密钥数组
** 出口参数 :无
*********************************************************************************************************
*/
void RC5_SETUP(unsigned char *K) /* secret input key K[0...b-1] */
{ uint32 i,j,k,u=w/8,A,B,L[c];
/* Initialize L, then S, then mix key into S */
for (i=b-1,L[c-1]=0; i!=-1; i--) //原密钥L自变形,L和K是同一密钥数组的不同划分形式
L[i/u] = (L[i/u]<<8)+K[i];
for (S[0]=P,i=1; i<t; i++) //生成2*(r+1)个初始子密钥
S[i] = S[i-1]+Q;
for (A=B=i=j=k=0; k<3*t; k++,i=(i+1)%t,j=(j+1)%c) //子密钥S和原密钥L混合,进行3*t轮/* 3*t > 3*c */
{ A = S[i] = ROTL(S[i]+(A+B),3);
B = L[j] = ROTL(L[j]+(A+B),(A+B));
}
}
/*
*********************************************************************************************************
** 函数名称 :UART0_SendByte()
** 函数功能 :向串口0发送1字节数据
** 入口参数 :dat 要发送的数据
** 出口参数 :无
*********************************************************************************************************
*/
void UART0_SendByte (uint8 dat)
{
U0THR = dat; // 要发送的数据
}
/*
*********************************************************************************************************
** 函数名称 :IRQ_UART0()
** 函数功能 :串口0接收中断服务程序
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************
*/
void __irq IRQ_UART0 (void)
{
uint8 i;
uint32 j;
uint32 ppt[2];
uint32 pt1[2],pt2[2],ct[2]={0x12345678,0x12345678};
unsigned char key[b];
if ((U0IIR & 0x0F) == 0x04)
rcv_new = 1; // 设置接收到新的数据标志
rcv_buf=U0RBR; // 读取FIFO的数据,并清除中断
plantest[ki] = rcv_buf; // 读取FIFO的数据,并清除中断
ki++;
if(ki==8)
{
ki=0;
ppt[0]=(plantest[0]<<24)+(plantest[1]<<16)+(plantest[2]<<8)+plantest[3]; //实现移位相加
ppt[1]=(plantest[4]<<24)+(plantest[5]<<16)+(plantest[6]<<8)+plantest[7];
pt1[0]=ppt[0];
pt1[1]=ppt[1];
for(j=0;j<b;j++)
key[j]=ct[0]%(255-j);
RC5_SETUP(key);
RC5_ENCRYPT(pt1,ct);
/////////////////////////
output[0]=ct[0];
for(i=4;i>=1;i--)
{
UART0_SendByte(output[0]>>8*(i-1));
//output[0]=(output[0]<<8);
}
output[0]=ct[1];
for(i=4;i>=1;i--)
{
UART0_SendByte(output[0]>>8*(i-1));
//output[0]=(output[0]<<8);
}
/*
for(i=0;i<16;i++)
UART0_SendByte(ct[i]);
*/
RC5_DECRYPT(ct,pt2);
output[0]=pt2[0];
for(i=4;i>=1;i--)
{
UART0_SendByte(output[0]>>8*(i-1));
//output[0]=(output[0]<<8);
}
output[1]=pt2[1];
for(i=4;i>=1;i--)
{
UART0_SendByte(output[1]>>8*(i-1));
//output[0]=(output[0]<<8);
}
}
/* UART0_SendByte(output[0]>>24);
output[0]=output[0]<<8;
UART0_SendByte(output[0]>>16);
output[0]=output[0]<<8;
UART0_SendByte(output[0]>>8);
output[0]=output[0]<<8;
UART0_SendByte(pt2[0]);
*/
VICVectAddr = 0x00; // 中断处理结束
}
/*
*********************************************************************************************************
** 函数名称 :UART0_SendBuf()
** 函数功能 :向串口发送8字节数据
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************
*/
void UART0_SendBuf (void)
{
//uint8 i;
UART0_SendByte(rcv_buf);
while ((U0LSR & 0x20) == 0); // 等待数据发送完毕
}
/*
*********************************************************************************************************
** 函数名称 :UART0_Init()
** 函数功能 :串口初始化,设置工作模式和波特率。
** 入口参数 :baud 波特率
** set 模式设置(UARTMODE数据结构)
** 出口参数 :1-初始化成功, 0-初始化失败
*********************************************************************************************************
*/
int8 UART0_Init (uint32 baud, UARTMODE set)
{
uint32 bak;
/* 参数过滤 */
if ((baud ==0 ) || (baud > 115200)) return (0);
if ((set.datab <5) || (set.datab > 8)) return (0);
if ((set.stopb == 0) || (set.stopb > 2)) return (0);
if (set.parity > 4) return (0);
/* 设置串口波特率 */
U0LCR = 0x80; // DLAB = 1
bak = (Fpclk >> 4) / baud;
U0DLM = bak >> 8;
U0DLL = bak & 0xFF;
/* 设置串口模式 */
bak = set.datab - 5; // 设置字长
if (set.stopb == 2) bak |= 0x04; // 判断是否为2位停止位
if (set.parity != 0)
{
set.parity = set.parity - 1;
bak |= 0x08;
}
bak |= set.parity << 4; // 设置奇偶校验
U0LCR = bak;
return (1);
}
/*
*********************************************************************************************************
** 函数名称 :main()
** 函数功能 :从串口UART0接收字符串"ABCDEFGH",并发送回上位机显示。
** 调试说明 :需要PC串口显示终端软件如EasyARM.exe。
*********************************************************************************************************
*/
int main (void)
{
UARTMODE set;
set.datab = 8;
set.stopb = 1;
set.parity = 0;
rcv_new = 0;
PINSEL0 = 0x00000005; // 设置I/O连接到UART0
UART0_Init(115200, set); // 串口初始化
U0FCR = 0x01; // 使能FIFO,并设置触发点为8字节
U0IER = 0x01; // 允许RBR中断,即接收中断
IRQEnable(); // 使能IRQ中断
/* 使能UART0中断 */
VICIntSelect = 0x00000000; // 设置所有的通道为IRQ中断
VICVectCntl0 = 0x20 | 0x06; // UART0分配到IRQ slot0,即最高优先级
VICVectAddr0 = (uint32)IRQ_UART0; // 设置UART0向量地址
VICIntEnable = 1 << 0x06; // 使能UART0中断
/*if(num==7)
num=0;*/
while (1)
{
/*if (rcv_new == 1)
{
rcv_new =0;
UART0_SendBuf();
}*/
}
return 0;
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
/*uint32 i,j,k,pt1[2],pt2[2],ct[2]={0,0};
unsigned char key[b];
for(i=1;i<6;i++) //Initialize pt1 and key pseudorandomly based on previous ct
pt1[0]=ct[0];pt1[1]=ct[1];
for(j=0;j<b;j++) key[j]=ct[0]%(255-j);
RC5_SETUP(key);
RC5_ENCRYPT(pt1,ct); //加密
RC5_DECRYPT(ct,pt2); //解密
*/
//差一个读入数据
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -