Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

RQ: Ext(App) Бутлодер за ST32F(1) - помогнете с опит
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=15431
Страница 1 от 1

Автор:  NikB [ Сря Авг 23, 2017 2:59 pm ]
Заглавие:  RQ: Ext(App) Бутлодер за ST32F(1) - помогнете с опит

Като далечна переспектива ми предстои разработването на бутлодер за ST32F10x.

Код:
След ресет трябва
1. да провери дали във програмната памет - областта за приложна програма има валидна програма (чексума)
1.1. Ако има, да й вземе версията, ако няма, версията е 0.0.0 :)
1.2. Да проверява един флаш дали има валидна (и по-нова от 1.1.) програма
1.2.1. Ако има:
          - да изтрие програмната памет - всичко, освен бутлодера;
          - да я програмира;
          - да се ресетне.
1.2.2. Ако няма :
1.2.2.1. Ако версията в 1.1. не е 0.0.0.- да предаде управлението на приложната програма
1.2.2.2. Ако версията в 1.1. е 0.0.0. да прави каквото реши :)


Това, вероятно ще се прави на CooCox с GNU (или, ако остане време ще мигрираме на Atolic)

Автор:  miro_atc [ Чет Авг 24, 2017 9:31 pm ]
Заглавие:  Re: RQ: Ext(App) Бутлодер за ST32F(1) - помогнете с опит

F1 серията е кофти избор, но това между другото...
Принципно STM са с големи страници на флаша, т.е. ще имаш едни 16К и в тях може да напъхаш доста повече от това дето си описал.
Обикновено фърмуера сам си тегли по-прясна версия през по-сложни интерфейси и/или протоколи. Но винаги е добре да има и резервен вариант, примерно и буутлоадера да може да дърпа от каквито прости локални итерфейчета имаш. Ако имаш да кажем UART може да го пускаш да слухти за 5-50mS докато ти си чекваш другите работи. Друг вариант за резервиране е ако имаш място във външия флаш да си пазиш производствената версия и да сложиш софтуерен или хардуерен механизъм за "restore factory...".
Може да помислиш и за защити като криптиране и подписване на фърмуера така че да не може да се клонира или подправя фърмуера ти. Май бях гледал такива проектчета, ама не помня дали бяха за STM. При всички случаи първо потърси примерни и ако не 1:1 то поне да минеш с леки модификации.

Автор:  nikolovs [ Съб Сеп 22, 2018 9:00 pm ]
Заглавие:  Re: RQ: Ext(App) Бутлодер за ST32F(1) - помогнете с опит

Къде може да се види подобно изпълнение за криптиране и подписване на фърмуера с цел да не се подправя ?

Автор:  relsys [ Нед Сеп 23, 2018 12:15 pm ]
Заглавие:  Re: RQ: Ext(App) Бутлодер за ST32F(1) - помогнете с опит

nikolovs написа:
Къде може да се види подобно изпълнение за криптиране и подписване на фърмуера с цел да не се подправя ?


Ето ти нещо просто:

Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace WindowsFormsApplication1
{   
    public partial class Form1 : Form
    {
        long x = 0, y, btn2 = 0;
        byte[] buffer = new byte[1000000];
        UInt32 fsize;

        static FileStream fsr = new FileStream("D:\\project_name.bin", FileMode.Open, FileAccess.Read);
        static FileStream fsw = new FileStream("D:\\update.bin", FileMode.Create, FileAccess.Write);
        BinaryWriter bw = new BinaryWriter(fsw);
        BinaryReader br = new BinaryReader(fsr);

       
   
        public Form1()
        {         
            InitializeComponent();
        }

        private UInt16 crc16(byte[] data_p, UInt32 length)
        {
            byte i;
            UInt16 data_;
            UInt16 crc = 0xffff;
            UInt32 idx = 0;

            if (length == 0)
                return ((UInt16)~crc);

            do
            {
                for (i = 0, data_ = (UInt16)((UInt16)0xff & (byte)data_p[idx]);
                    i < 8;
                    i++, data_ >>= 1)
                {
                    if (((crc & 0x0001) ^ (data_ & 0x0001)) != 0)
                        crc = (UInt16)((crc >> 1) ^ 0x8408);
                    else
                        crc = (UInt16)(crc >> 1);
                }
                idx++;
            }
            while (--length != 0);

            crc = (UInt16)~crc;
            data_ = crc;
            crc = (UInt16)((crc << 8) | (data_ >> 8 & 0xff));

            return (crc);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            fsize = (UInt32)fsr.Length;
            UInt16 crc;

            button1.Enabled = false;
            button1.Update();

            buffer[0] = (byte)'S';
            buffer[1] = (byte)'e';
            buffer[2] = (byte)'C';
            buffer[3] = (byte)'r';
            buffer[4] = (byte)'E';
            buffer[5] = (byte)'t';
            br.Read(buffer, 6, (Int32)fsize);
            for (x = 6; x < fsize + 6; x++)
            {
                buffer[x] += (byte)(x-6);
                buffer[x] = (byte)~buffer[x];
                buffer[x] = (byte)((byte)(buffer[x] << 4) | (byte)(buffer[x] >> 4));
                buffer[x] += (byte)(x-6);
                if (x >= 6)
                  bw.Write(buffer[x]);
            }

            crc = crc16(buffer, fsize+6);
            buffer[fsize + 6] = (byte)(crc);
            bw.Write(buffer[fsize + 6]);
            buffer[fsize + 6 + 1] = (byte)(crc >> 8);
            bw.Write(buffer[fsize + 6 + 1]);

            //MessageBox.Show("FILE WRITTEN", "[update.bin]");
            br.Close();
            bw.Close();

            fsr.Close();
            fsw.Close();

            button1.Text = "FILE [update.bin] WRITTEN!";
            button1.Update();

            System.Threading.Thread.Sleep(1000);

            Form1.ActiveForm.Close();
           
        }

       
           
    }
}

Автор:  TheWizard [ Нед Сеп 23, 2018 1:42 pm ]
Заглавие:  Re: RQ: Ext(App) Бутлодер за ST32F(1) - помогнете с опит

Ако желязото може да флаши word, чексума не ти трябва... проверяваш дали в началото има маджик кей...
Има: get version
Няма: триеш, update...ок? Кей в началото

magic може да ти е версията, -1 грешка

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/