zoukankan      html  css  js  c++  java
  • 2019-2020-1 20175204 20175202 20175216 《信息安全系统设计基础》实验二 固件程序设计

    2019-2020-1 20175204 20175202 20175216 《信息安全系统设计基础》实验二 固件程序设计

    组员 20175204 张湲祯 20175202 葛旭阳 20175216 张雪原

    任务一【MDK】

    一、实验任务:

    1. 不经老师允许不准烧写自己修改的代码
    2. 参考云班课资源中“信息安全系统实验箱指导书.pdf “第一章,1.1-1.5安装MDK,JLink驱动,注意,要用系统管理员身分运行uVision4,破解MDK(破解程序中target一定选ARM)
    3. 提交破解程序中产生LIC的截图
    4. 提交破解成功的截图

    二、实验步骤:
    1.用管理员身份运行uVision4
    2.点击FileLicense Management,将CID复制下来;
    3.运行keil-MDK注册机;
    4.在CMRK4-FJN5H中粘贴入CID选择ARM

    三、实验结果截图:

    任务二 【LED】

    一、实验任务:

    1. 不经老师允许不准烧写自己修改的代码
      2.参考云班课资源中“信息安全系统实验箱指导书.pdf “第一章,1.4” KEIL-MDK 中添加 Z32 SC-000 芯片库,提交安装截图
      3.参考云班课资源中“信息安全系统实验箱指导书.pdf “第一章,1.9”完成LED实验,注意“打开Z32的电源开关前,按住Reboot按键不放,两次打开电源开关,Z32即可被电脑识别,进行下载调试。提交运行结果截图
      4.实验报告中分析代码

    二、实验步骤:
    1.以管理员身份打开uVision4 MDK
    2.依次选择ProjectNew uVision Project来新建工程;
    3.为新工程命名,并在芯片库中选择Generic SC000 Device Database
    4.打开ARM结构目录,选择SC000,完成搭建,如下图;

    5.打开Main.c,代码如下;

    int main(void)
    {
    /*********************此段代码勿动***********************/
    //系统中断向量设置,使能所有中断
      SystemInit ();
    // 返回 boot 条件
      if(0 == GPIO_GetVal(0))
      {
          BtApiBack(0x55555555, 0xAAAAAAAA);
      }
    /*********************此段代码勿动***********************/
      GPIO_PuPdSel(0,0); //设置 GPIO0 为上拉
      GPIO_InOutSet(0,0); //设置 GPIO0 为输出
      while(1)
      {
          delay(100);
          GPIO_SetVal(0,0); //输出低电平,点亮 LED
          delay(100);
          GPIO_SetVal(0,1); //输出高电平,熄灭 LED 
      }
    }
      //延时函数,当系统时钟为内部 OSC 时钟时,延时 1ms
    void delay(int ms)
    {
      int i;
      while(ms--)
      {
          for(i=0;i<950;i++) ;
      }
    }
    

    6.打开老师所给资源中的实验1-LED闪烁工程文件,完成编译后即可产生xxx.bin可执行代码;
    7.将实验箱接入电源,用USB公对公线将实验箱的USB接口连接到电脑的USB接口上,打开调试工具NZDownloadTool.exe。打开Z32的电源开关前,按住Reboot按键不放,两次打开电源开关,Z32即可被电脑识别,随后下载调试;
    8.当左边框出现1设备已连接时,设备选择中显示芯片型号,此时就可以下载程序了。点击窗口右下方的浏览,选择程序路径为(Z32开发指南实验 1-LED闪烁in32HUA.bin)打开,点击下载。

    三、实验结果截图:


    四、对代码的分析:
    1.系统初始化,中断设置,使能所有中断;
    2.判断按键,返回 boot 条件,确认是否进行程序下载;
    3.设置 GPIO0 状态为上拉输出;
    4.进入循环程序,LED 灯间隔 100ms 闪烁。

    任务三 【UART】

    一、实验任务:
    1.注意不经老师允许不准烧写自己修改的代码;
    2.参考云班课资源中“信息安全系统实验箱指导书.pdf “第一章,1.4” KEIL-MDK 中添加 Z32 SC-000 芯片库,提交安装截图;
    3.参考云班课资源中“信息安全系统实验箱指导书.pdf “第一章,1.0”完成UART发送与中断接收实验,注意“打开Z32的电源开关前,按住Reboot按键不放,两次打开电源开关,Z32即可被电脑识别,进行下载调试。提交运行结果截图;
    4.实验报告中分析代码

    二、实验步骤:
    1.在KEIL-MDK中添加Z32 SC-000芯片库,步骤同实验二;
    2.在user组和driver组下分别打开Main.cUart.cUart.c代码如下;

    **Uart.c**
    extern UINT8 shuju_lens; 
    extern UINT8 uart_rx_num; 
    extern UINT8 uart_rx_end; 
    
    void UART_Irq Service(void) 
    { 
      //*****your code*****/ 
      UARTCR &= ~TRS_EN; 
      { 
       do 
          { 
           shuju[uart_rx_num] = UARTDR; 
         if(shuju[uart_rx_num]=='
    '||shuju[uart_rx_num]=='
    ') 
         { 
            shuju_lens = uart_rx_num; 
          uart_rx_num=0; 
          uart_rx_end=1; 
         } 
         else uart_rx_num++; 
          } 
          while(FIFO_NE & UARTISR);     
      } 
      UARTCR |= TRS_EN; 
    } 
    
    /**  
      * @
    函数:波特率设置
    
      * @set
    :
      0-
    默认波特率 
    115200
    ,其他:需根据时钟源和分频计算出 
    set =  
    时
    钟
    (hz)/
    波特率
    
      * @
    返回
    : none 
      */ 
    void UART_Brp Set(UINT16 set) 
    { 
      UINT16 brp=0; 
         UINT8 fd=0;  
         if(0 == set) 
         { 
          //uartband@115200bps 
           fd = SCU->UARTCLKCR & 0x80;  
           switch(fd) 
             { 
             case 0x80:     /*
    外部时钟 
    12M 
    晶振
    */ 
                  brp = 0x0068; 
                  break; 
                 case 0x00:     /*
    内部时钟
    */ 
         brp = 0x00AD;   
                     break;     
                 default: 
                    brp = 0x00AD; 
                    break; 
             } 
        fd = SCU->UARTCLKCR & 0x7f ;  
         brp =  brp/(fd+1); 
         } 
         else 
         { 
          brp = set; 
         } 
      UARTBRPH = (UINT8)((brp >> 8) & 0x FF); 
         UARTBRPL = (UINT8)((brp) & 0x FF); 
    } 
    
    
    
    /**  
      * @
    函数:初始化
    
      * @
    返回:
    none 
      */ 
    void UART_Init(void) 
    { 
      IOM->CRA |= (1<<0);  //
    使能 
    Uart 
    接口
    
      SCU->MCGR2 |= (1<<3); //
    使能 
    Uart 
    总线时钟
    
    
      /******
    配置 
    Uart 
    时钟(建议使用外部晶振)
    ******/ 
      SCU->SCFGOR |= (1<<6);//  
    使能外部晶振
    
      SCU->UARTCLKCR |= (1<<7);//
    使用外部时钟
    
    // SCU->UARTCLKCR &= ~(1<<7);//
    使用内部 
    OSC 
    时钟
    
    
      UART_Brp Set(0);   //
    设置波特率为默认 
    115200 
      UARTISR = 0x FF;   //
    状态寄存器全部清除
    
      UARTCR |= FLUSH; //
    清除接收 
    fifo 
      UARTCR = 0;    //
    偶校验
    
    
      /******
    配置中断使能
    ******/ 
      UARTIER |= FIFO_NE; 
    // UARTIER |= FIFO_HF; 
    // UARTIER |= FIFO_FU; 
    // UARTIER |= FIFO_OV; 
    // UARTIER |= TXEND; 
    // UARTIER |= TRE;  
      Module Irq Register(Uart_Exception, UART_Irq Service); //
    挂载中断号
    
    }     
    
    
    /**  
      * @
    函数:
    Uart 
    发送一个字节
    
      * @dat:   
    要发送的数据字节
    
      * @
    返回:
    None 
      */ 
    void UART_Send Byte(UINT8 dat) 
    {   
      UARTCR |= TRS_EN; 
      UARTDR = dat; 
         do 
         { 
         if(UARTISR & TXEND) 
             {             
                 UARTISR |= TXEND;//
    清除发送完成标志,写 
    1 
    清除
    
                 break; 
             } 
         } 
         while (1); 
         UARTCR &= (~TRS_EN); 
    } 
    
    /**  
      * @
    函数:
    Uart 
    发送一个字符串
    
      * @str:   
    要发送的字符串
    
    - 76 - 
          shuju_lens = uart_rx_num; 
          uart_rx_num=0; 
          uart_rx_end=1; 
         } 
         else uart_rx_num++; 
          } 
          while(FIFO_NE & UARTISR);     
      } 
      UARTCR |= TRS_EN; 
    } 
    
    /**  
      * @
    函数:波特率设置
    
      * @set
    :
      0-
    默认波特率 
    115200
    ,其他:需根据时钟源和分频计算出 
    set =  
    时
    钟
    (hz)/
    波特率
    
      * @
    返回
    : none 
      */ 
    void UART_Brp Set(UINT16 set) 
    { 
      UINT16 brp=0; 
         UINT8 fd=0;  
         if(0 == set) 
         { 
          //uartband@115200bps 
           fd = SCU->UARTCLKCR & 0x80;  
           switch(fd) 
             { 
             case 0x80:     /*
    外部时钟 
    12M 
    晶振
    */ 
                  brp = 0x0068; 
                  break; 
                 case 0x00:     /*
    内部时钟
    */ 
         brp = 0x00AD;   
                     break;     
                 default: 
                    brp = 0x00AD; extern UINT8 shuju[64]; 
    extern UINT8 shuju_lens; 
    extern UINT8 uart_rx_num; 
    extern UINT8 uart_rx_end; 
    
    void UART_Irq Service(void) 
    { 
      //*****your code*****/ 
      UARTCR &= ~TRS_EN; 
      { 
       do 
          { 
           shuju[uart_rx_num] = UARTDR; 
         if(shuju[uart_rx_num]=='
    '||shuju[uart_rx_num]=='
    ') 
         {  
    - 80 - 
      * @
    返回:
    None 
      */ 
    void UART_Send Num(INT32 num) 
    { 
      INT32 cnt = num,k; 
      UINT8 i,j; 
      if(num<0) {UART_Send Byte('-');num=-num;} 
      //
    计算出 
    i 
    为所发数据的位数
    
      for(i=1;;i++) 
      { 
       cnt = cnt/10; 
       if(cnt == 0) break; 
      } 
      //
    算出最大被除数从高位分离
    
      k = 1; 
      for(j=0;j<i-1;j++) 
      { 
       k = k*10; 
      } 
      //
    分离并发送各个位
    
      cnt = num; 
      for(j=0;j<i;j++) 
      { 
       cnt = num/k; 
       num = num%k; 
       UART_Send Byte(0x30+cnt); 
       k /= 10; 
      } 
    } 
    
    
    /**  
      * @
    函数:
    Uart 
    发送一个 
    16 
    进制整数
    
      * @dat:   
    要发送的 
    16 
    进制数
    
      * @
    返回:
    None  
    - 79 - 
      * @
    返回:
    None 
      */ 
    void UART_Send String(UINT8 * str) 
    { 
      UINT8 *p ; 
      p=str; 
      while(*p!=0) 
      { 
       UART_Send Byte(*p++); 
      } 
    } 
    
    
    /**  
      * @
    函数:
    Uart 
    发送某一长度的字符串
    
      * @buf:   
    要发送的字符串
    
      * @length:   
    要发送的长度
    
      * @
    返回:
    None 
      */ 
    
    void uart_Send String(UINT8 buf[],UINT8 length) 
    { 
      UINT8 i=0; 
      while(length>i) 
      { 
    
       UART_Send Byte(buf[i]); 
       i=i+1; 
      } 
    } 
    
    
    /**  
      * @
    函数:
    Uart 
    发送一个十进制整数
    
      * @num:   
    要发送的整数
                     break; 
             } 
        fd = SCU->UARTCLKCR & 0x7f ;  
         brp =  brp/(fd+1); 
         } 
         else 
         { 
          brp = set; 
         } 
      UARTBRPH = (UINT8)((brp >> 8) & 0x FF); 
         UARTBRPL = (UINT8)((brp) & 0x FF); 
    } 
    
    
    
    /**  
      * @
    函数:初始化
    
      * @
    返回:
    none 
      */ 
    void UART_Init(void) 
    { 
      IOM->CRA |= (1<<0);  //使能Uart接口
    
      SCU->MCGR2 |= (1<<3); //
    使能 
    Uart 
    总线时钟
    
    
      /******
    配置 
    Uart 
    时钟(建议使用外部晶振)
    ******/ 
      SCU->SCFGOR |= (1<<6);//  
    使能外部晶振
    
      SCU->UARTCLKCR |= (1<<7);//
    使用外部时钟
    
    // SCU->UARTCLKCR &= ~(1<<7);//
    使用内部 
    OSC 
    时钟
    
    
      UART_Brp Set(0);   //
    设置波特率为默认 
    115200 
      UARTISR = 0x FF;   //
    状态寄存器全部清除
    
      UARTCR |= FLUSH; //
    清除接收 
    fifo 
      UARTCR = 0;    //
    偶校验
    
      */ 
    void UART_Send Hex(UINT8 dat) 
    { 
      UINT8 ge,shi; 
      UART_Send Byte('0'); 
      UART_Send Byte('x'); 
      ge = dat%16; 
      shi = dat/16; 
      if(ge>9) ge+=7;     //
    转换成大写字母
    
      if(shi>9) shi+=7; 
      UART_Send Byte(0x30+shi); 
      UART_Send Byte(0x30+ge); 
      UART_Send Byte(' '); 
    } 
    
    
    /**  
      * @
    函数:
    Uart 
    接收一个字节
    
      * @param receive addsress 
      * @
    返回:
      flag 
      */ 
    UINT8 UART_Get Byte(UINT8 *data) 
    { 
    
         UINT8 ret= 0;  
         if(0 != (UARTISR & FIFO_NE)) 
         { 
             *data = UARTDR; 
             ret = 1; 
         }  
         return ret; 
    } 
    
    /**  
      * @
    函数:
    Uart  
    接收多个字节
       * @param receive addsress 
      * @len
    :
    
    长度
    
      * @
    返回:
    none 
      */ 
    void UART_Receive(UINT8 *receive, UINT8 len) 
    {   
      while(len != 0) 
      { 
       if(len >= 4) 
       { 
        while (!(UARTISR & FIFO_FU)); 
        *receive++ = UARTDR; 
            *receive++ = UARTDR; 
        *receive++ = UARTDR; 
            *receive++ = UARTDR;     
            len -= 4; 
    
       }  
       else if(len >= 2) 
       { 
        while (!(UARTISR & FIFO_HF));              
         *receive++ = UARTDR; 
          *receive++ = UARTDR;     
          len -= 2; 
       }        
       else 
       { 
         while (!(UARTISR & FIFO_NE)); 
           *receive++ = UARTDR; 
         len--; 
       } 
      } 
    } 
    
    -------------
    **main.c**
    
    UINT8 shuju_lens; 
    UINT8 shuju[64]; 
    UINT8 uart_rx_num; 
    UINT8 uart_rx_end; 
    
    int main(void) 
    { 
    /*********************
    此段代码勿动
    ***********************/ 
      //
    系统中断向量设置,使能所有中断
    
      System Init (); 
         //  
    返回 
    boot 
    条件
    
      if(0 == GPIO_Get Val(0)) 
      { 
       Bt Api Back(0x55555555, 0x AAAAAAAA); 
      }
      /*********************
    此段代码勿动
    ***********************/ 
    
      UART_Init();     //
    初始化 
    Uart 
    
      UART_Send Byte('A');                   //Uart 
    发送一个字符 
    A 
      UART_Send Byte('
    ');UART_Send Byte('
    ');//
    换行
    
    
      UART_Send String("Welcome to Z32HUA!");   //Uart 
    发送字符串
    
      UART_Send Byte('
    ');UART_Send Byte('
    ');//
    换行
    
    
      UART_Send Num(1234567890);                //Uart 
    发送一个十进制数
    
      UART_Send Byte('
    ');UART_Send Byte('
    ');//
    换行
    
    
      UART_Send Hex(0x AA);                   //Uart 
    发送一个十六进制数
    
      UART_Send Byte('
    ');UART_Send Byte('
    ');//
    换行
    
    
      while(1) 
      { 
       if(uart_rx_end) 
       { 
        uart_rx_end=0; 
        uart_Send String(shuju,shuju_lens); 
       } 
      }   //
    等待接收中断。
    
    } 
    
    //
    延时函数,当系统时钟为内部 
    OSC 
    时钟时,延时 
    1ms 
    void delay(int ms) 
    { 
      int i; 
      while(ms--) 
      { 
      for(i=0;i<950;i++) ; 
      } 
    }  
    

    3.打开实验8-SM1工程文件。编译工程,产生xxx.bin 可执行代码;
    4.将实验箱接入电源,用USB公对公线将实验箱的USB接口连接到电脑的USB接口上,随后打开Z32下载调试工具 NZDownloadTool.exe。打开Z32的电源开关前,按住Reboot按键不放,两次打开电源开关,Z32 即可被电脑识别,随后进行下载调试;
    5.当左边框出现1设备已连接,设备选择中显示芯片型号,此时就可以下载程序了。此时点击窗口右下浏览,选择程序路径为Z32开发指南实验 8-SM1in32HUA.bin并打开,最后点击下载。

    三、实验结果截图:

    四、对代码的分析:
    串口相关函数:
    1.包括串口中断服务、波特率设置、串口初始化、发送/接收单字节、发送字符串、发送单个十进制整数、发送单个十六进制整数、发送某一长度的字符串、接收多字节函数;
    2.void UART_IrqService(void)是串口中断服务函数,本实验中实现串口中断执行子程序,从PC端串口调试助手发送数据至Z32,Z32再经串口发送PC机;
    3.void UART_BrpSet(UINT16set)是波特率设置函数,串口实验波特率设置为 115200;
    4.void UART_Init(void)是串口初始化函数,实现配置串口时钟、使能中断;
    5.void UART_SendByte(UINT8 dat)是发送单字节函数,使用此函数一次发送一个字节数据;
    6.void UART_SendString(UINT8 *str)是发送字符串函数,使用此函数发送字符串数据;
    7.void uart_Send String(UINT8 buf[],UINT8length)是发送某一长度的字符串函数,实现发送一定长度的字符串数据;
    8.void UART_Send Num(INT32 num)是发送单个十进制整数函数,使用此函数发送一个十进制整数;
    9.void UART_Send Hex(UINT8 dat)是发送单个十六进制整数函数,使用此函数发送一个十六进制整数;
    10.UINT8 UART_Get Byte(UINT8 *data)是接收单字节函数,使用此函数接收单字节数据;
    11.void UART_Receive(UINT8 *receive, UINT8 len)是接收多字节函数,使用此函数接收多个字节数据。
    主函数:
    1.系统初始化,中断设置,使能所有中断;
    2.判断按键,返回 boot 条件,确认是否进行程序下载;
    3.初始化Uart,使能Uart接口,配置Uart中断并使能;
    4.先发送单个字符“A”,换行,再发送字符串“Welcome to Z32HUA!”,换行,发送数字串“1234567890”,换行,再发送 16位数“0x AA”,换行;
    5.进入while循环程序,等待串口中断到来并判断数据是否接收完毕,若中断到来,转入执行串口中断服务程序,待接收数据完毕,Z32将数据发回串口助手。

    任务四 【国密算法】

    一、实验任务:

    1. 网上搜集国密算法标准SM1,SM2,SM3,SM4;
    2. 网上找一下相应的代码和标准测试代码,在Ubuntu中分别用gcc和gcc-arm编译;
    3. 四个算法的用途?;
      4.《密码学》课程中分别有哪些对应的算法?;
      5.提交2,3两个问题的答案;
      6.提交在Ubuntu中运行国密算法测试程序的截图。
      二、实验步骤:
      SM1
      1.类型:对称分组算法;
      2.用途:芯片、智能IC卡、智能密码钥匙、加密卡、加密机等安全产品,广泛应用于电子政务、电子商务及国民经济的各个应用领域;
      3.《密码学》课程对应算法:DES,AES;
      4.该算法不公开,所以无法获得源码。
      SM2
      1.类型:椭圆曲线公钥密码算法;
      2.用途:密钥管理,数字签名,电子商务,PKI,信息及身份认证等信息安全应用领域;
      3.《密码学》课程对应算法:ECC椭圆曲线算法;
      4.测试结果截图;

    SM3
    1.类型:杂凑算法;
    2.用途:商用密码应用中的数字签名和验证,消息认证码的生成与验证以及随机数的生成;
    3.《密码学》课程对应算法::SHA系列算法,MD系列算法、MAC;
    4.测试结果截图:

    SM4
    1.类型:对称分组算法
    2.用途:无线局域网产品, 用于实现数据的加密/解密运算,以保证数据和信息的机密性。
    3.密码学对应算法:DES,AES
    4.测试结果截图:

    任务五 【SM1】

    一、实验任务:
    1.注意不经老师允许不准烧写自己修改的代码;
    2.参考云班课资源中“信息安全系统实验箱指导书.pdf “第一章,1.4” KEIL-MDK 中添加 Z32 SC-000 芯片库,提交安装截图;
    3.参考云班课资源中“信息安全系统实验箱指导书.pdf”“第一章,1.16”完成SM1加密实验,注意“打开Z32的电源开关前,按住Reboot按键不放,两次打开电源开关,Z32即可被电脑识别,进行下载调试”提交运行结果截图;
    4.实验报告中分析代码。

    二、实验步骤:
    1.打开Z32 开发指南实验8-SM1目录的工程文件。编译工程,产生后缀名为xxx.bin 可执行代码;
    2.在 user 组下分别打开Main.cSLE4428.c,可以得到主函数代码和SLE4428程序的源代码。其中工程文件目录的 algorithm 文件夹包含了Z32HUA_ALG.ALG函数库,其中包含了国密的加解密算法相关函数库,SM1加解密函数的调用需要这个库的支持;
    3.将实验箱接入电源,用USB公对公线将实验箱的USB接口连接到电脑的USB接口上,在电脑上找到Z32 开发指南2.软件资料32 下载调试工具目录打开 Z32 下载调试工具 NZDownloadTool.exe。打开Z32的电源开关前,按住Reboot 按键不放,两次打开电源开关,Z32 即可被电脑识别,随后进行下载调试,并进行加解密;
    三、实验结果截图:





    任务六 【清理】

    一、实验任务:
    1.实验结束后,把实验室原来的网线插回,否则以后做实验的同学无法开机。

    二、实验结果截图:

    实验总结

    本次实验我们小组首先遇到了很多问题,首先是实验箱的问题:一、在做LED实验时,代码显示的颜色不正确,识别不出来;后来经过多次尝试后发现文件命名必须为全英文,不能存在中文字符,在更改后,成功完成了该实验。二、在编译代码时报错,原来我们课上所讲的编译指令都是基于Linux系统的,在这里并不适用,在更换方法后,问题得到解决。

  • 相关阅读:
    VisualStudioCode网页开发常用插件
    java项目报错 :A class file was not written. The project may be inconsistent...
    java抽象类及接口
    博客园首页美化----js添加分割线
    WordPress安全/速度优化(此篇持续更新)
    wordpress宝塔lnmp下安装以及调优(此篇持续更新)
    wordpress之avada安装全过程(此篇持续更新)
    Wordpress之使用阿里云Oss存储
    Linux基础学习(一)虚拟机安装&CentOS8.1安装
    docker安装配置使用
  • 原文地址:https://www.cnblogs.com/zyzgl/p/11835213.html
Copyright © 2011-2022 走看看