⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uautocode.pas

📁 这个程序的主要目的是为了提供一个具有通用性的 AVR Bootloader
💻 PAS
📖 第 1 页 / 共 3 页
字号:
        else
          Writeln(f, '  Project:       AVR Universal BootLoader');
        Writeln(f, '  File:          bootcfg.h');
        if b then
          Writeln(f, '                 用户配置参数,请根据你系统的实际情况进行设置')
        else
          Writeln(f, '                 user''s configuration.');
        Writeln(f, '  Version:       4.2');
        Writeln(f, '');
        Writeln(f, '  Compiler:      WinAVR20071221 + AVR Studio 4.14 b589');
        Writeln(f, '');
        Writeln(f, '  Author:        Shaoziyang');
        Writeln(f, '                 Shaoziyang@gmail.com');
        Writeln(f, '                 http://avrubd.googlepages.com');
        Writeln(f, '                 http://groups.google.com/group/avrub?hl=en');
        Writeln(f, '                 ');
        Writeln(f, '  Date:          2008.6');
        Writeln(f, '  Made by:       AVRUBD autocode, ' + DateTimeToStr(now));
        Writeln(f, '');
        Writeln(f, '  See readme.htm to get more information.');
        Writeln(f, '');
        Writeln(f, '*/');
        Writeln(f, '');
        Writeln(f, '#ifndef _BOOTCFG_H_');
        Writeln(f, '#define _BOOTCFG_H_        1');
        Writeln(f, '');
        if b then
          Writeln(f, '//定义串口接收缓冲区长度')
        else
          Writeln(f, '//define uart buffer''s length');
        Writeln(f, '#define BUFFERSIZE         ', cbbBufferSize.Text);
        Writeln(f, '');
        if b then
          Writeln(f, '//系统时钟(Hz)')
        else
          Writeln(f, '//system clock(Hz)');
        Writeln(f, '#ifndef F_CPU');
        Writeln(f, '#define F_CPU              ', cbbFCPU.Text, 'UL');
        Writeln(f, '#endif');
        Writeln(f, '');
        if b then
          Writeln(f, '//波特率')
        else
          Writeln(f, '//baudrate');
        Writeln(f, '#define BAUDRATE           ', cbbBaudRate.Text);
        Writeln(f, '');
        if b then
        begin
          Writeln(f, '//Boot区起始地址: 按字节计算');
          Writeln(f, '//如果定义为0或不定义BootStart,可以节约空间');
        end
        else
        begin
          Writeln(f, '//Boot section start address(byte)');
          Writeln(f, '//define BootStart to 0 will disable this function');
        end;
        if cbbByteWord.ItemIndex = 0 then
          Writeln(f, '#define BootStart          ', cbbBootStart.Text + 'UL')
        else
          Writeln(f, '#define BootStart          ', '2 * ' + cbbBootStart.Text + 'UL');
        Writeln(f, '');
        if b then
        begin
          Writeln(f, '//下载过程中进行数据校验');
          Writeln(f, '//ChipCheck和BootStart必须联合使用,校验才有效');
        end
        else
        begin
          Writeln(f, '//verify flash''s data while write');
          Writeln(f, '//ChipCheck will only take effect while BootStart enable also');
        end;
        if chkChipCheck.Checked then
          i := 1
        else
          i := 0;
        Writeln(f, '#define ChipCheck          ', i);
        Writeln(f, '');
        if b then
          Writeln(f, '//Bootloader触发模式  0:串口  1:电平')
        else
          Writeln(f, '//Bootloader launch  0:comport password  1:port level');
        Writeln(f, '#define LEVELMODE          ', cbbBootMode.ItemIndex);
        Writeln(f, '');
        Writeln(f, '#define LEVELPORT          ', cbbPortLevel.Text);
        Writeln(f, '#define LEVELPIN           P', cbbPortLevel.Text, cbbPINLevel.Text);
        if b then
          Writeln(f, '//触发电平 1:高  0:低')
        else
          Writeln(f, '//port level  1:High  0:Low');
        Writeln(f, '#define PINLEVEL           ', cbbBootLevel.ItemIndex);
        Writeln(f, '');
        if b then
        begin
          Writeln(f, '//等待密码的超时时间 = TimeOutCnt * timeclk');
          Writeln(f, '//超时次数');
        end
        else
        begin
          Writeln(f, '//max wait password time = TimeOutCnt * timeclk');
          Writeln(f, '//timeout count');
        end;
        Writeln(f, '#define TimeOutCnt         ', cbbBootCnt.Text);
        Writeln(f, '');
        if CompareText(cfg.language, 'CHINESE') = 0 then
          Writeln(f, '//同步时间间隔(ms)')
        else
          Writeln(f, '//basic timer interval(ms)');
        Writeln(f, '#define timeclk            ', cbbTimeClk.Text);
        Writeln(f, '');
        if b then
        begin
          Writeln(f, '//等待文件的超时时间 = TimeOutCntC * timeclk');
          Writeln(f, '//发送''C''的最大次数');
        end
        else
        begin
          Writeln(f, '//max wait data time = TimeOutCntC * timeclk');
          Writeln(f, '//send ''C'' command count');
        end;
        Writeln(f, '#define TimeOutCntC        ', cbbFileCnt.Text);
        Writeln(f, '');
        if b then
          Writeln(f, '//同步密码长度')
        else
          Writeln(f, '//password length');
        edtKeyHEX.Text := FormatHexStr(edtKeyHEX.Text, buf);
        Writeln(f, '#define CONNECTCNT         ', (Length(edtKeyHEX.Text) + 2) div 3);
        Writeln(f, '');
        if b then
          Writeln(f, '//同步密码')
        else
          Writeln(f, '//password');
        Writeln(f, '#if LEVELMODE == 0');
        Write(f, 'unsigned char ConnectKey[] = {');
        for i := 1 to ((Length(edtKeyHEX.Text) + 2) div 3) - 1 do
          Write(f, '0x', edtKeyHEX.Text[i * 3 - 2], edtKeyHEX.Text[i * 3 - 1], ', ');
        i := (Length(edtKeyHEX.Text) + 2) div 3;
        Write(f, '0x', edtKeyHEX.Text[i * 3 - 2], edtKeyHEX.Text[i * 3 - 1], '};');
        Writeln(f, '');
        Writeln(f, '#endif');
        Writeln(f, '');
        if b then
          Writeln(f, '//串口号: 0/1/2..')
        else
          Writeln(f, '//comport number: 0/1/2..');
        Writeln(f, '#define COMPORTNo          ', cbbComPortNo.Text);
        Writeln(f, '');
        if b then
          Writeln(f, '//看门狗使能')
        else
          Writeln(f, '//enable watchdog');
        if chkWDG.Checked then
          i := 1
        else
          i := 0;
        Writeln(f, '#define WDG_En             ', i);
        Writeln(f, '');
        if b then
          Writeln(f, '//使用RS485模式')
        else
          Writeln(f, '//enable RS485/RS422 mode');
        if chkRS485En.Checked then
          i := 1
        else
          i := 0;
        Writeln(f, '#define RS485              ', i);
        if b then
          Writeln(f, '//RS485/RS422控制端口和引脚')
        else
          Writeln(f, '//RS485/RS422 send control port');
        Writeln(f, '#define RS485PORT          ', cbbPortRS485.Text);
        Writeln(f, '#define RS485TXEn          P', cbbPortRS485.Text, cbbPINRS485.Text);
        Writeln(f, '');
        if b then
          Writeln(f, '//使用LED指示状态')
        else
          Writeln(f, '//enable LED indication');
        if chkLED.Checked then
          i := 1
        else
          i := 0;
        Writeln(f, '#define LED_En             ', i);
        if b then
          Writeln(f, '//LED控制端口和引脚')
        else
          Writeln(f, '//LED control port');
        Writeln(f, '#define LEDPORT            ', cbbPortLED.Text);
        Writeln(f, '#define LEDPORTNo          P', cbbPortLED.Text, cbbPINLED.Text);
        Writeln(f, '');
        if b then
          Writeln(f, '//某些旧型号的单片机在初始化后需要延时')
        else
          Writeln(f, '//some old kind of AVR need special delay after comport initialization');
        Writeln(f, '#define InitDelay          ', cbbInitDelay.Text);
        Writeln(f, '');
        if b then
          Writeln(f, '//校验方法  0:CRC16  1:累加和')
        else
          Writeln(f, '//communication checksum method   0:CRC16  1:add up');
        Writeln(f, '#define CRCMODE            ', cbbCRC.ItemIndex);
        Writeln(f, '');
        if b then
          Writeln(f, '//提示模式: 显示更多交互提示信息,不用可以节省空间')
        else
          Writeln(f, '//Verbose mode: display more prompt message');
        if chkVerbose.Checked then
          i := 1
        else
          i := 0;
        Writeln(f, '#define VERBOSE            ', i);
        Writeln(f, '');
        if b then
        begin
          Writeln(f, '//提示信息');
          Writeln(f, '#if VERBOSE');
          Writeln(f, '#if LEVELMODE');
          Writeln(f, 'const char msg6[] = "升级模式.";');
          Writeln(f, 'const char msg7[] = "正常启动.";');
          Writeln(f, '#else');
          Writeln(f, '//等待密码');
          Writeln(f, 'const char msg1[] = "等待接收密码.";');
          Writeln(f, '#endif');
          Writeln(f, '//超时');
          Writeln(f, 'const char msg2[] = "超时.";');
          Writeln(f, '//等待接收数据');
          Writeln(f, 'const char msg3[] = "等待接收数据.";');
          Writeln(f, '//升级成功');
          Writeln(f, 'const char msg4[] = "升级成功.";');
          Writeln(f, '//升级失败');
          Writeln(f, 'const char msg5[] = "升级失败.";');
          Writeln(f, '#endif');
        end
        else
        begin
          Writeln(f, '//prompt messages');
          Writeln(f, '#if VERBOSE');
          Writeln(f, '#if LEVELMODE');
          Writeln(f, 'const char msg6[] = "bootloader mode.";');
          Writeln(f, 'const char msg7[] = "application mode.";');
          Writeln(f, '#else');
          Writeln(f, '//waiting for password');
          Writeln(f, 'const char msg1[] = "waiting for password.";');
          Writeln(f, '#endif');
          Writeln(f, '//timeout');
          Writeln(f, 'const char msg2[] = "timeout.";');
          Writeln(f, '//waiting for data');
          Writeln(f, 'const char msg3[] = "waiting for data.";');
          Writeln(f, '//update success');
          Writeln(f, 'const char msg4[] = "update success.";');
          Writeln(f, '//update fail');
          Writeln(f, 'const char msg5[] = "update fail.";');
          Writeln(f, '#endif');
        end;
        Writeln(f, '');
        if b then
          Writeln(f, '//允许解密')
        else
          Writeln(f, '//enable decrypt buffer');
        if chkDecrypt.Checked then
          i := 1
        else
          i := 0;
        Writeln(f, '#define Decrypt            ', i);
        Writeln(f, '');
        if b then
        begin
          Writeln(f, '//加密算法');
          Writeln(f, '//PC1_128, 128位 PC1 加密算法');
          Writeln(f, '#define PC1_128            1');
          Writeln(f, '//PC1_256, 256位 PC1 加密算法');
          Writeln(f, '#define PC1_256            2');
          Writeln(f, '//AES_128, 128位 AES 加密算法');
          Writeln(f, '#define AES_128            3');
          Writeln(f, '//AES_256, 256位 AED 加密算法');
          Writeln(f, '#define AES_256            4');
        end
        else
        begin
          Writeln(f, '//crypt algorithm');
          Writeln(f, '//PC1_128, PC1 Cipher Algorithm with 128 bits key');
          Writeln(f, '#define PC1_128            1');
          Writeln(f, '//PC1_256, PC1 Cipher Algorithm with 256 bits key');
          Writeln(f, '#define PC1_256            2');
          Writeln(f, '//AES_128, AES Cipher Algorithm with 128 bits key');
          Writeln(f, '#define AES_128            3');
          Writeln(f, '//AES_256, AES Cipher Algorithm with 256 bits key');
          Writeln(f, '#define AES_256            4');
        end;
        Writeln(f, '');
        Writeln(f, '#define Algorithm          ', cbbAlgorithm.Text);
        Writeln(f, '');
        Writeln(f, '#if Decrypt');
        Writeln(f, '');
        Writeln(f, '#if (Algorithm == PC1_128) || (Algorithm == AES_128)');
        if b then
          Writeln(f, '//定义解密密钥: 128位')
        else
          Writeln(f, '//Define decrypt key: 128b');
        Writeln(f, 'unsigned char DecryptKey[16] ={');
        for i := 0 to 16 do
          buf[i] := 0;
        s := edtDecryptKey.Text;
        if Length(s) > 16 * 3 then
          SetLength(s, 16 * 3);
        for i := 0 to (Length(s) + 2) div 3 do
          buf[i] := CharToByte(s[i * 3 + 1], s[i * 3 + 2]);
        for i := 0 to 15 do
        begin
          if (i mod 8) = 0 then
            Write(f, ' ');
          Write(f, ' 0x', IntToHex(buf[i], 2));
          if i <> 15 then
            Write(f, ',');
          if (i mod 8) = 7 then
            Writeln(f);
        end;
        Writeln(f, '};');
        Writeln(f, '#elif (Algorithm == PC1_256) || (Algorithm == AES_256)');
        if b then
          Writeln(f, '//定义解密密钥: 256位')
        else
          Writeln(f, '//Define decrypt key: 256b');
        Writeln(f, 'unsigned char DecryptKey[32] ={');
        for i := 0 to 31 do
          buf[i] := 0;
        s := edtDecryptKey.Text;
        if Length(s) > 32 * 3 then
          SetLength(s, 32 * 3);
        for i := 0 to (Length(s) + 2) div 3 do
          buf[i] := CharToByte(s[i * 3 + 1], s[i * 3 + 2]);
        for i := 0 to 31 do
        begin
          if (i mod 8) = 0 then
            Write(f, ' ');
          Write(f, ' 0x', IntToHex(buf[i], 2));
          if i <> 31 then
            Write(f, ',');
          if (i mod 8) = 7 then
            Writeln(f);
        end;
        Writeln(f, '};');
        Writeln(f, '');
        Writeln(f, '#endif');
        Writeln(f, '');
        Writeln(f, '#endif');
        Writeln(f, '');
        Writeln(f, '#endif');
        Writeln(f, '');
        Writeln(f, '//End of file: bootcfg.h');
      finally
        CloseFile(f);
      end;

      try
        AssignFile(f, ExtractFilePath(dlgSave.FileName) + 'avrub.bat');
        Rewrite(f);
        Writeln(f, '@rem auto create by AVRUBD at ' + DateTimeToStr(now));
        Writeln(f, 'avr-gcc.exe  -mmcu=' + lowercase(cbbMCU.Text) + ' -Wall -gdwarf-2  -Os -fsigned-char -MD -MP  -c  bootldr.c');
        if cbbByteWord.ItemIndex = 0 then
          i := StrToInt(cbbBootStart.Text)
        else
          i := StrToInt(cbbBootStart.Text) * 2;
        Writeln(f, 'avr-gcc.exe -mmcu=' + lowercase(cbbMCU.Text) + '  -Wl,-section-start=.text=0x' + IntToHex(i, 4) + ' bootldr.o     -o Bootldr.elf');
        Writeln(f, 'avr-objcopy -O ihex -R .eeprom  Bootldr.elf Bootldr.hex');
        Writeln(f, '@pause');
      finally
        CloseFile(f);
      end;

      if b then
        msg := '成功创建参数配置文件. 立即编译 bootloader 吗?   ' + #13#10#13#10 + '你可以在任何时候运行 "avrub.bat" 进行编译.' + #13#10
      else
        msg := 'Create configuration file success. Compile bootloader right now?   ' + #13#10#13#10 + 'You may run "avrub.bat" to complie bootloader at any time.' + #13#10;
      if Application.MessageBox(PChar(msg), '?', MB_YESNO + MB_ICONQUESTION) = IDYES then
      begin
        ShellExecute(handle, nil, PChar('"' + ExtractFilePath(dlgSave.FileName) + 'avrub.bat"'), nil, nil, SW_SHOW);
      end;

    end;
    Close;
  finally
    Idle := True;
    HWD := handle;
  end;
end;

procedure TfrmAutoCode.tmrErrTimer(Sender: TObject);
begin
  if tmrErr.Tag > 0 then
  begin
    if (tmrErr.Tag mod 2) = 0 then
    begin
      if edtErr <> nil then
        edtErr.Color := clWindow;
      if cbbErr <> nil then

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -