写出GD32F305VE芯片,采用USB-HOST-MSC模式,插入U盘上电升级,bootlooder代码
时间: 2023-12-31 09:04:08 浏览: 164
以下是可能的bootloader代码实现,仅供参考:
```c
#include "gd32f30x.h"
#include "usbh_core.h"
#include "usbh_msc_core.h"
/* 定义应用程序的起始地址 */
#define APP_ADDR (uint32_t)0x08004000
/* 定义跳转到应用程序的函数指针 */
typedef void (*pFunction)(void);
/* 定义USB主机句柄 */
USBH_HandleTypeDef hUSBHost;
/* 定义U盘中update.bin文件的名称 */
#define UPDATE_FILE_NAME "update.bin"
/* 定义标志位变量,用于判断是否需要进入bootloader或应用程序 */
uint8_t enter_bootloader = 1;
/* 定义USB主机事件回调函数,处理USB事件 */
void USBH_UserProcess(USBH_HandleTypeDef *phost, uint8_t id)
{
switch (id)
{
case HOST_USER_SELECT_CONFIGURATION:
break;
case HOST_USER_DISCONNECTION:
/* U盘拔出,设置标志位,准备跳转到应用程序 */
enter_bootloader = 0;
break;
case HOST_USER_CLASS_ACTIVE:
/* U盘插入,检查是否存在update.bin文件 */
if (USBH_MSC_IsReady(&hUSBHost))
{
FIL file;
FRESULT res;
UINT bytesRead;
uint8_t buf[512];
char filename[13];
/* 遍历U盘根目录下的所有文件 */
DIR dir;
FILINFO fno;
res = f_opendir(&dir, "/");
if (res == FR_OK)
{
while (f_readdir(&dir, &fno) == FR_OK && fno.fname[0] != 0)
{
/* 如果文件名为update.bin,则进行升级 */
if (strcmp(fno.fname, UPDATE_FILE_NAME) == 0)
{
/* 打开update.bin文件 */
snprintf(filename, sizeof(filename), "/%s", UPDATE_FILE_NAME);
res = f_open(&file, filename, FA_READ);
if (res == FR_OK)
{
/* 擦除应用程序区域 */
FLASH_Unlock();
FLASH_ErasePage(APP_ADDR);
FLASH_Lock();
/* 从U盘中读取update.bin文件,写入应用程序区域 */
uint32_t addr = APP_ADDR;
while (f_read(&file, buf, sizeof(buf), &bytesRead) == FR_OK && bytesRead > 0)
{
FLASH_Unlock();
for (uint32_t i = 0; i < bytesRead; i += 4)
{
uint32_t data = (buf[i+3] << 24) | (buf[i+2] << 16) | (buf[i+1] << 8) | buf[i];
FLASH_ProgramWord(addr, data);
addr += 4;
}
FLASH_Lock();
}
/* 关闭update.bin文件 */
f_close(&file);
/* 升级完成,设置标志位,准备跳转到应用程序 */
enter_bootloader = 0;
break;
}
}
}
f_closedir(&dir);
}
}
break;
default:
break;
}
}
/* main函数 */
int main(void)
{
/* 初始化系统时钟和GPIO */
SystemInit();
rcu_periph_clock_enable(RCU_GPIOA);
gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_8);
gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_8);
/* 判断是否需要进入bootloader */
if (enter_bootloader)
{
/* 初始化USB主机 */
USBH_Init(&hUSBHost, USBH_UserProcess, 0);
USBH_RegisterClass(&hUSBHost, USBH_MSC_CLASS);
USBH_Start(&hUSBHost);
/* 等待USB主机初始化完成 */
while (USBH_GetState(&hUSBHost) != HOST_CLASS)
{
/* 按照需要实现LED闪烁等提示操作 */
gpio_bit_toggle(GPIOA, GPIO_PIN_8);
delay_ms(100);
}
/* 进入USB主机事件处理循环 */
while (1)
{
USBH_Process(&hUSBHost);
}
}
else
{
/* 跳转到应用程序 */
pFunction app = (pFunction)APP_ADDR;
__set_MSP(*(volatile uint32_t*)APP_ADDR);
app();
}
return 0;
}
```
需要注意的是,以上代码仅为示例,具体实现需要根据实际情况进行调整和优化。同时需要注意安全性问题,避免因为错误的升级操作导致系统损坏。
阅读全文
相关推荐
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![can](https://img-home.csdnimg.cn/images/20250102104920.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![-](https://img-home.csdnimg.cn/images/20241231044955.png)
![-](https://img-home.csdnimg.cn/images/20241231044955.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![7z](https://img-home.csdnimg.cn/images/20241231044736.png)