stm32 To update the program , The general practice is to use j-link Or serial port download . Is it possible to realize unlimited communication , How about online update ?

In order to realize this function of online update , I wrote a simple analogy BootLoader Procedures for . The idea is to add a piece of code before the application executes , You can choose a communication method to receive the new application and compile the generated bin file , Then solidify to flash in , And jump to the application to execute the corresponding code . An interface is given in the application code , When executing the application, you can also jump to the beginning of the program and then perform the update operation . So you can update online .

First one STM32Flash Address bus diagram of

You can see , from 0x8000000 reach 0x807FFFF All of them flash Storage range of . And we put online updates on the flash start , So that it can be called when it is powered on .

therefore , This update we're going to write , Only one way of communication is needed , Receive new applications , Then cure it to flash Another section of the . So this program often takes up a small amount of memory space .

ad locum , We assigned it a certain size flash and RAM:

flash and RAM It can be selected according to the size and resources of your actual update program .

In the update program , You've chosen a way of communication , Received application's .bin file (.bin Files can be created by MDK Generated when the application is compiled , How to do it is not necessary to elaborate ). Then call flash Write operation , Cache received in RAM Inside .bin file copy To your flash in . It's very simple , Just call the library function .

The next step is to call your application . Application's main Function address ( That is, the reset operation corresponding to the interrupt vector table ) It's stored in MDK Generated .bin The fourth to eighth byte in the file ( Because the address is 32bit Of ) in ( The first four bytes hold the top pointer of the stack ). So we define a function pointer , Then assign a value to the pointer , You can call . Look at the code :

typedef void (*myFunction)(void);

The one defined here myFunction Function pointer with no parameter and no return type . This statement may be written as typedef myFunction void (*)(void);
Will be better understood , But we still have to comply C The grammar of language .

Then we define a function pointer variable :

myFunction junpMyAPP;

When we write our applications , We can also MDK Of the program RAM and flash Starting address and space used for , Just don't conflict with our previous updates . Let's assume that the starting address we selected for the application is myAPP_ADDR, At this point, the function pointer can be assigned :
junpMyAPP=(myFunction)*(volatile unsigned int*)(myAPP_ADDR+4);

Let's analyze this code . I've already mentioned that , Application's main The function address is stored in the .bin In the fourth to eighth byte of the file . therefore (myAPP_ADDR+4) It's pointing main Pointer to the address of the function , So we use it (volatile
unsigned int*) Indicates that it is a 32bit Pointer to , At the same time volatile Guaranteed not to be optimized by compiler .(volatile unsigned
int*) Former * Represents the value of this address , that is main The value of the pointer to the function , Last but not least (myFunction) hold main The value of the function pointer is cast to the previously defined function pointer type , It's done. Right junpMyAPP Assignment operation of function pointer .

next , Just call :junpMyAPP(); You can successfully jump to our application . In the app , You can also use this method to jump to our update program at an appropriate time , Realize online update .

Because this paper only describes the principle of simple online update , So a lot of details are ignored , In addition, my level is limited , deficiencies , Please correct it , thank you .

©2019-2020 Toolsou All rights reserved,
802.11 CCA and NAV mechanism docker Where is the image stored Software engineering career planning RISC-V_GD32VF103-TIMER0 timer interrupt Create a thread ——— Javaweb (3)MySQL The golden rule of :“ Do not use SELECT ”MYSQL database SQL Sentence practice experiment EXERCISES. 1 SIMPLE COMMANDSMySQL Basics Commonly used sentence ( Add / delete / modify query )pandas Multiply two columns in use Java Write a simple student management system