由于普冉官方给的例程没有明确的进入USB程序的方式,于是我根据需求修改了官方的IAP升级程序。这里有两个程序,要先烧录IAP升级程序,然后才能用USB升级的方式烧写用户程序。
根据原理图,PB12是一个按键,我们需要按下Triangle按键再上电进入升级模式
首先我们在keil中设置用户程序的地址为0x800400
然后在system_py32f07x.c中设置程序偏移地址
#define VECT_TAB_OFFSET 0x4000 /*!< Vector Table base offset field.
This value must be a multiple of 0x100. */
然后回到IAP程序中定义一个用户程序的地址
/* Private define ------------------------------------------------------------*/
#define APP_ADDR 0x08004000
然后在IAP程序中写进入升级的方式
/**
* @brief 应用程序入口函数.
* @retval int
*/
int main(void)
{
/* 初始化IWDG和WWDG */
APP_WDG_Init();
/* 初始化所有外设,Flash接口,SysTick */
HAL_Init();
/* 系统时钟配置 */
APP_SystemClockConfig();
/* Configure user Button */
GPIO_InitTypeDef GPIO_InitStruct;
__HAL_RCC_GPIOB_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_12;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/* Check if the USER Button is pressed */
if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_12) == 0) //按住Y键再上电,进入USB升级
{
/* 初始化USART1外设 */
APP_USART_InitRx(USART1);
/* 初始化USART2外设 */
APP_USART_InitRx(USART2);
/* 初始化USART3外设 */
APP_USART_InitRx(USART3);
/* 初始化USART4外设 */
APP_USART_InitRx(USART4);
/* 初始化I2C外设 */
APP_I2C_Init();
/* 初始化USB外设 */
APP_USBInit();
APP_Bootloader_Init();
/* 无限循环 */
while (1)
{
APP_Bootloader_ProtocolDetection();
}
}
APP_Bootloader_Go(APP_ADDR);
}
/**
* @brief USB外设初始化函数
* @param 无
* @retval 无
*/
static void APP_USBInit(void)
{
__HAL_RCC_SYSCFG_CLK_ENABLE();
__HAL_RCC_USB_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
hid_custom_dfu_init();
/* 使能USB中断 */
NVIC_EnableIRQ(USBD_IRQn);
}
如果没有按下按键,直接跳转到用户程序的地址,开始跑用户程序,如果按住按键再插USB,电脑端显示进入升级模式
然后在keil中设置使用外部工具,添加工具路径,就可以在keil中直接点击下载