 Secure memory on zone. Le purpose est de tester le mécanisme de secure mémoire, mais sans utiliser les avices du système bootloader. C'est à dire que nous activons ou nous lockons la mémoire de secure juste par modifier le registre flash de la partie insecure de notre application. Donc pour faire ça, nous allons mettre une fonction Toggle LED dans l'arrière de la mémoire de secure. Et nous le appelons régulièrement de la mémoire de secure. Et quand je pousse sur le bouton, je serai locké la mémoire de secure. Alors qu'est-ce qui va arriver? Quand je vais essayer de coller ça, je vais voir que je ne peux pas faire mon Toggle LED. Donc je dirais que la fonction Toggle est dans la mémoire de secure. Nous sommes à l'extérieur, nous sommes collés et tout de suite, nous lockons la mémoire de secure. Nous ne pouvons pas l'accesser anymore. Donc pour faire ça, trois main-steps. La première est de créer le code et de mettre le lit bleu dans la mémoire de secure. Donc c'est juste une location d'une certaine fonction, mais ça prend un peu de temps. Nous allons configurer le secteur de secure sur l'option de la mémoire de secure. Ensuite, nous allons activer la mémoire de secure. Et ensuite, nous allons vérifier le statut pour apprécier le bouton. Nous allons switcher au code STM32 Cubido pour commencer à créer notre code. Donc pour ce qui s'occupe, je vais utiliser le code Nucleo GZO71 AirB. Et nous allons générer le code pour ça. Le nouveau projet. STM32. Mon selecteur de target. Je vais prendre le code. Pour le Nucleo, le secteur de secure. Nous allons l'utiliser avec le default. Alors, dans ma version, d'un coup, le lit et le bouton ne sont pas défis. Donc je vais le faire. En fait, le bouton est un PC13. Ce qui a été utilisé pour un autre code, mais c'est ce que je vais faire à l'input de la GPO. Vous pouvez trouver cette information dans la documentation du Nucleo. Donc le PC12 est utilisé pour le bouton, le bouton bleu. Et nous allons aussi utiliser le lit, ce qui est dans le PA5. Je ne me souviens pas d'où c'est. 5. C'est ici. Nous allons le mettre en GPO Output. Ok. Input. Output. C'est bon. Alors, je génére le code. Et maintenant, je suis prêt à implémenter ma fonction. Alors, la main sera exécutée à l'input. Donc, c'est un peu mon secteur de secure. Donc ce code de secure, je veux coller quelque chose de la memoire de la secure. Donc, on va coller un code de secure. Function. Un code de secure. C'était juste une fonction de bad. Ok. On va déclare cette fonction. Un code de secure. Et il n'y a pas de paramètres. Et quand nous avons booté ceci, nous serons, je dirais, dans un bloc wild. Donc, ce que nous allons faire ici, nous allons coller une fonction de la logite de la logite. Et celui-ci, nous l'avons placé dans l'arrière de la secure. Alors, nous allons le coller de la logite de la secure. Ok. Donc, je vais coller tout pour cette fonction. On va oublier le code. Et pour celui-ci, je vais juste faire une logite de GPIU. La logite de la logite. La logite de GPIU est 5, si vous le souvenez. Donc, après, je vais faire la modification pour trouver chaque fonction dans quelle partie je voudrais être. Donc, le principe de la logite de la logite, nous avons booté ici. Nous avons jumpé dans la code de secure et de la code de secure, nous collons la logite de la logite de la secure. Maintenant, je veux, quand je pousse sur le bouton, de serrer la memoire de la secure. Ok. Donc ici, je vais tester si le bouton a été touché par quelqu'un ou non. Tout d'abord, je vais ajouter juste un petit délai. Donc, on va faire un petit bloc de bas juste pour... 0. Sorry. Et en faisant rien. C'est juste pour togner. Je vais le faire régulièrement. Ok. Donc, maintenant, je vais tester le bouton si le bouton a été touché. Donc, la logite de GPIU a été touchée cette fois. Et si vous le souvenez, je dirais 13. Ok. Donc, si j'écoute ce bouton et si le niveau est equal à 0, cela veut dire que nous pousse le bouton bleu. Et cette fois, je veux serrer la memoire de la secure. Donc, pour cela, je dois écrire les registres contrôles dans le flash. Et pour pouvoir faire ça, d'abord, je dois serrer ce flash. Donc, j'ai un filet pour cela aussi. Donc, flash. Vous avez beaucoup, mais j'aimerais la fonction de lock. Pas d'argument. C'est assez facile. J'ai aussi des services pour lock ma memoire de secure. Ennemi la protection de la main et la banque. C'est la banque 1 pour nous. Puis, je vais lock le flash de nouveau. Ok. Donc, c'est un code Babic sans aucune location de fonction de ce genre. D'abord, let's check if it's bug. So, no error compilation. Perfect. So, now, what I will do. I want to configure this insecure code to be located, I would say, at the end of my flash. To do that, I will have to create a new section in my scatter files. And then, I will put this function at this location. So, I will switch to the file. Ok. And here we've got our flash. What I propose is to take the last 8K for my secure part. So, let's call this flash unsecure. Ok. So, it was with execute. The origin will be equal to compute ok 1 ok and the length it's 8K. Ok. So, I declare a new portion of memory where I will locate my unsecure functions. I will just declare it a new section. So, it will be my section, for example. And here, I will close it after. Let's respect alignment first. Ok. Then, I will say each wall. So, dot. Let's call it my section. Ok. Then, I will just realign the rest after. So, we will this. Ok. Ok. So, I think that's it. I've got my section and I put everything here at this location. So, now, I save was my only modification. Oh, sorry. I forget to put it in this flash unsecure. Ok. So, now I've got my new section and the name is every element which will be in my section. So, I keep this symbol because I will need it to declare to put my function after in one main. Ok. So, here it's not a simple syntax, frankly speaking, but you can find documentation on the web about it. So, you have to play with the attribute. The attribute. Then, scroll the score. Then, the attribute of oh. Sorry for this. Ok. Then, I will say underscore underscore section score underscore and see which section it will be in the my section dot my section. So, exactly the one we have put in the file before. And three. Ok. Doing this, we are putting this function on all element of this function the code and the data inside this section which have been defined here. Ok. I hope I haven't made any error typing. I double check. Let's try to build. So, let's compile. Now, let's download it to our target. Everything by default should be ok. Let's go to the success. I will put a break point here. Just to check where we are. Or first, what I can do is just starting the code. Now, let's check if my light is blinking. Yes. So, first it's functional. Now, I would like if my relocation of this function is still ok if I put a break point here. I can check the PC we are in the good range from the integer code. And if I put a break point here maybe here. Download break points. So, we about this. What is the problem here? Maybe optimization. Ok. If you spend operation time out. Let's do it again. Reloach. Terminate and reload. Ok. I put a point point by error. If I put my break point here. Neither. Remove all the break points. Sorry about this. Now this time I hope it works. I want break point here. This time it's ok. If I step in. Ok. And I want to see the register. And now we can see that we come back in the secure or what would be our secure area. So, for the moment everything is working. So, if I remove this break point and if I put a break point here. Ok. So, I launch my code again. Let's see what happens. I will push my blue button. If I push the blue button I shouldn't enter in this function. Ok. So, I am being stopped. Good. And what happens if I continue? I will say nothing will change. It's still working. So, it's still blinking. Yes. Because we have not activated the option byte. So, we are using the flash code register but the sex size is equal to zero. That means there is no secure memory. So, now we will configure this option byte. So, let's stop this debugging link. And now we connect with a Q programmer. I connect. I can see the flash. Ok. So, from the basic what is the secure one. And let's go to the option byte. And we've got the flash security. So, here we've got the sex size we have to put here. Ok. So, let me check which volume I need to put here. Let's see. The blue page. This is in line with our expectation. Ok. So, if I apply it. Ok. It's well programmed. And I will disconnect my debugging link. Now, if I check my board. So, I reset it. It was blinking. Now, if I push the blue button. It has stopped. That means we've got a while that's still working. But now, when you try to access the secure memory, it gets stuck. And we can check, or double check it. Thanks Q programmer. If I connect, but like a host plug. I mean not under reset. Because if I connect under reset, I will be exactly at the beginning so the secure memory will be open. So, let's do an odd plug. It's really important here. I connect. And in fact, I see an error. Y. I can't read. This portion of the flash. Now, if I go in my secure memory. I would say. Which is in one E. I was able to see this code. And this code is exactly. I would say my main loop would try to call this. Ok. So, we really see that it's completely disappeared. Just by writing in one flash register. I hope this help you to understand how this secure memory works. So, here, basically, we just write in the flash control registers, but it's not fully secure. It's better to use, I would say, the bootloader services that can do it for you from an atomic way and ensure that the switching from the secure part to the insecure part is done safely.