ESP32-S3 V5.0.2 flash 手动生成密钥加密 _By星年(已验证)

环境 ESP32-S3 ESP_IDF V5.0.2 手动生成密钥加密

官方参考资料:
https://docs.espressif.com/projects/esp-idf/zh_CN/v5.0.2/esp32s3/search.html?q=generate_flash_encryption_key&check_keywords=yes&area=default

一、加密
(1)生成密钥

espsecure.py generate_flash_encryption_key my_flash_encryption_key.bin

(2)工程加密配置及串口配置安全模式

idf.py menuconfig

menuconfig加密配置在这里插入图片描述

(3)烧录密钥到设备(修改端口号)(只能烧录一次)

espefuse.py --port COM7 burn_key BLOCK_KEY1 my_flash_encryption_key.bin XTS_AES_128_KEY

(4)加密镜像并烧录(根据idf.py build编译后信息,修改文件路径、文件名、烧录地址及生成文件名)

idf.py build flash monitor
espsecure.py encrypt_flash_data --aes_xts --keyfile my_flash_encryption_key.bin --address 0x10000 --output esp32-bauer-ciphertext.bin build/esp32-bauer.bin
espsecure.py encrypt_flash_data --aes_xts --keyfile my_flash_encryption_key.bin --address 0x90000 --output ota_data_initial-ciphertext.bin build/ota_data_initial.bin

(5)烧录加密bin

esptool.py -p COM7 -b 460800 --before default_reset --after no_reset --chip esp32s3  write_flash --flash_mode dio --flash_size 16MB --flash_freq 80m 0x9000 ota_data_initial-ciphertext.bin 0x10000 esp32-bauer-ciphertext.bin

二、代码更新后烧录
编译

idf.py build

加密

espsecure.py encrypt_flash_data --aes_xts --keyfile my_flash_encryption_key.bin --address 0x10000 --output esp32-bauer-ciphertext.bin build/esp32-bauer.bin
espsecure.py encrypt_flash_data --aes_xts --keyfile my_flash_encryption_key.bin --address 0x90000 --output ota_data_initial-ciphertext.bin build/ota_data_initial.bin

烧录

esptool.py -p COM7 -b 460800 --before default_reset --after no_reset --chip esp32s3  write_flash --flash_mode dio --flash_size 16MB --flash_freq 80m 0x9000 ota_data_initial-ciphertext.bin 0x10000 esp32-bauer-ciphertext.bin --force

三、关闭加密和解密已加密镜像(关闭解密只有1次机会)

关闭加密

espefuse.py burn_efuse SPI_BOOT_CRYPT_CNT

常用命令:
1.查看是否加密:(修改端口号)

espefuse.py summary -p COM7

2.生成密钥:
(1)AES-128(256 位密钥)

espsecure.py generate_flash_encryption_key my_flash_encryption_key.bin

(2)AES-256(512 位密钥)

espsecure.py generate_flash_encryption_key --keylen 512 my_flash_encryption_key.bin

3.关闭加密:

espefuse.py --port COM7 burn_efuse SPI_BOOT_CRYPT_CNT

4.已加密代码烧录

idf.py encrypted-flash monitor
首先,需要在代码中包含 "driver/spi_master.h" 头文件。 接下来,需要使用 spi_bus_config_t 结构体来配置 SPI 总线,如下所示: ```c spi_bus_config_t bus_cfg={ .mosi_io_num=..., // MOSI引脚编号 .miso_io_num=..., // MISO引脚编号 .sclk_io_num=..., // SCLK引脚编号 .quadwp_io_num=-1, // WP引脚编号(如果没有则设置为-1) .quadhd_io_num=-1, // HD引脚编号(如果没有则设置为-1) .max_transfer_sz=..., // 最大传输大小 .flags=..., // SPI总线的标志 .intr_flags=... // SPI总线中断标志 }; spi_bus_initialize(SPI1_HOST, &bus_cfg, DMA_CHAN); ``` 其中,SPI1_HOST 是 SPI 总线的主机编号,可以设置为 SPI1_HOST 或 SPI2_HOST。 DMA_CHAN 是 DMA 通道的编号,如果不需要 DMA,则设置为 -1。 接下来,需要使用 spi_device_interface_config_t 结构体来配置 SPI 设备,如下所示: ```c spi_device_interface_config_t dev_cfg={ .command_bits=..., // 命令位数 .address_bits=..., // 地址位数 .dummy_bits=..., // 哑位数 .mode=..., // SPI模式 .duty_cycle_pos=..., // 时钟极性 .cs_ena_pretrans=..., // 传输前片选延迟时间 .cs_ena_posttrans=..., // 传输后片选延迟时间 .clock_speed_hz=..., // 时钟频率 .input_delay_ns=..., // 输入延迟时间 .spics_io_num=..., // 片选引脚编号 .flags=..., // SPI设备的标志 .queue_size=..., // SPI设备队列的大小 .pre_cb=..., // 传输前回调函数 .post_cb=... // 传输后回调函数 }; spi_device_handle_t spi; spi_bus_add_device(SPI1_HOST, &dev_cfg, &spi); ``` 其中,spi_device_handle_t 是 SPI 设备的句柄,可以通过它来控制 SPI 设备。 spi_bus_add_device 函数会返回一个 SPI 设备的句柄。 最后,就可以使用 spi_device_transmit 函数来传输数据了,如下所示: ```c spi_transaction_t trans={ .flags=..., // 传输标志 .cmd=..., // 命令 .addr=..., // 地址 .length=..., // 数据长度 .rxlength=..., // 接收数据长度 .tx_buffer=..., // 发送缓冲区 .rx_buffer=..., // 接收缓冲区 .user=... // 用户数据 }; spi_device_transmit(spi, &trans); ``` 其中,spi_transaction_t 结构体用来描述一个 SPI 传输,可以设置传输标志、命令、地址、数据长度、接收数据长度、发送缓冲区、接收缓冲区和用户数据等。 以上就是控制外部 SPI 设备的基本步骤,具体实现可以根据实际情况进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值