
CSDN专栏嵌入式程序开发实战嵌入式双范式AI编程嵌入式开发必掌握嵌入式求职面试技术资料第21讲裸机单片机Demo极速搭建——10分钟可运行一、极速搭建的意义裸机单片机Demo是验证硬件、测试功能、快速原型的最基础形式。能够在10分钟内搭建一个可运行的Demo是Vibe模式的核心能力。1.1 传统搭建方式传统流程创建工程5分钟配置时钟10分钟配置GPIO5分钟编写主循环5分钟编译调试10分钟总计35分钟问题步骤繁琐容易出错依赖经验1.2 Vibe极速搭建方式Vibe流程口语描述需求1分钟AI生成完整工程2分钟编译烧录5分钟验证运行2分钟总计10分钟优势步骤简单不易出错不依赖经验二、极速搭建流程2.1 流程步骤步骤一明确需求1分钟明确MCU型号基本功能外设需求步骤二AI生成2分钟Prompt 生成STM32F103的最小Demo工程 - LED闪烁PA5 - 串口输出USART1, PA9/PA10, 115200 - 使用HAL库 - 包含完整的main.c AI生成完整代码步骤三编译烧录5分钟创建Keil工程添加生成的代码配置工程选项编译烧录步骤四验证运行2分钟观察LED闪烁观察串口输出确认功能正常2.2 完整案例LED闪烁Demo需求STM32F103C8T6PA5 LED闪烁周期1秒Prompt生成STM32F103C8T6的最小Demo - LED闪烁PA5周期1秒 - 使用HAL库 - 包含完整的main.c、时钟配置AI生成#includestm32f1xx_hal.hvoidSystemClock_Config(void);voidError_Handler(void);intmain(void){HAL_Init();SystemClock_Config();__HAL_RCC_GPIOA_CLK_ENABLE();GPIO_InitTypeDef GPIO_InitStruct{0};GPIO_InitStruct.PinGPIO_PIN_5;GPIO_InitStruct.ModeGPIO_MODE_OUTPUT_PP;GPIO_InitStruct.PullGPIO_NOPULL;GPIO_InitStruct.SpeedGPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOA,GPIO_InitStruct);while(1){HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5);HAL_Delay(500);}}voidSystemClock_Config(void){RCC_OscInitTypeDef RCC_OscInitStruct{0};RCC_ClkInitTypeDef RCC_ClkInitStruct{0};RCC_OscInitStruct.OscillatorTypeRCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEStateRCC_HSE_ON;RCC_OscInitStruct.HSEPredivValueRCC_HSE_PREDIV_DIV1;RCC_OscInitStruct.PLL.PLLStateRCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSourceRCC_PLLSOURCE_HSE;RCC_OscInitStruct.PLL.PLLMULRCC_PLL_MUL9;HAL_RCC_OscConfig(RCC_OscInitStruct);RCC_ClkInitStruct.ClockTypeRCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSourceRCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.AHBCLKDividerRCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDividerRCC_HCLK_DIV2;RCC_ClkInitStruct.APB2CLKDividerRCC_HCLK_DIV1;HAL_RCC_ClockConfig(RCC_ClkInitStruct,FLASH_LATENCY_2);}voidError_Handler(void){while(1);}验证编译通过 烧录成功 运行LED闪烁周期1秒 结果Demo搭建成功耗时8分钟三、典型Demo模板3.1 LED串口Demo需求LED闪烁 串口输出Hello WorldPrompt生成STM32F103 Demo - LEDPA5闪烁周期500ms - 串口USART1, PA9(TX)/PA10(RX), 115200 - 功能LED闪烁串口输出Hello World - 使用HAL库AI生成#includestm32f1xx_hal.h#includestdio.hUART_HandleTypeDef huart1;voidSystemClock_Config(void);voidMX_GPIO_Init(void);voidMX_USART1_UART_Init(void);intfputc(intch,FILE*f){HAL_UART_Transmit(huart1,(uint8_t*)ch,1,100);returnch;}intmain(void){HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_USART1_UART_Init();printf(System Start\r\n);while(1){HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5);printf(LED Toggle, Tick: %d\r\n,HAL_GetTick());HAL_Delay(500);}}voidMX_GPIO_Init(void){__HAL_RCC_GPIOA_CLK_ENABLE();GPIO_InitTypeDef GPIO_InitStruct{0};GPIO_InitStruct.PinGPIO_PIN_5;GPIO_InitStruct.ModeGPIO_MODE_OUTPUT_PP;GPIO_InitStruct.PullGPIO_NOPULL;GPIO_InitStruct.SpeedGPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOA,GPIO_InitStruct);}voidMX_USART1_UART_Init(void){huart1.InstanceUSART1;huart1.Init.BaudRate115200;huart1.Init.WordLengthUART_WORDLENGTH_8B;huart1.Init.StopBitsUART_STOPBITS_1;huart1.Init.ParityUART_PARITY_NONE;huart1.Init.ModeUART_MODE_TX_RX;huart1.Init.HwFlowCtlUART_HWCONTROL_NONE;huart1.Init.OverSamplingUART_OVERSAMPLING_16;HAL_UART_Init(huart1);}// SystemClock_Config略3.2 按键LED Demo需求按键控制LED按下点亮松开熄灭Prompt生成STM32F103 Demo - LEDPA5 - 按键PC13按下为低电平 - 功能按键控制LED - 使用HAL库AI生成#includestm32f1xx_hal.hvoidSystemClock_Config(void);voidMX_GPIO_Init(void);intmain(void){HAL_Init();SystemClock_Config();MX_GPIO_Init();while(1){if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_13)GPIO_PIN_RESET){HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET);}else{HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET);}HAL_Delay(10);}}voidMX_GPIO_Init(void){__HAL_RCC_GPIOA_CLK_ENABLE();__HAL_RCC_GPIOC_CLK_ENABLE();GPIO_InitTypeDef GPIO_InitStruct{0};// LEDGPIO_InitStruct.PinGPIO_PIN_5;GPIO_InitStruct.ModeGPIO_MODE_OUTPUT_PP;GPIO_InitStruct.PullGPIO_NOPULL;GPIO_InitStruct.SpeedGPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOA,GPIO_InitStruct);// 按键GPIO_InitStruct.PinGPIO_PIN_13;GPIO_InitStruct.ModeGPIO_MODE_INPUT;GPIO_InitStruct.PullGPIO_PULLUP;HAL_GPIO_Init(GPIOC,GPIO_InitStruct);}3.3 定时器中断Demo需求定时器中断控制LED闪烁Prompt生成STM32F103 Demo - LEDPA5 - 定时器TIM2周期1秒 - 功能定时器中断控制LED闪烁 - 使用HAL库AI生成#includestm32f1xx_hal.hTIM_HandleTypeDef htim2;voidSystemClock_Config(void);voidMX_GPIO_Init(void);voidMX_TIM2_Init(void);intmain(void){HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_TIM2_Init();HAL_TIM_Base_Start_IT(htim2);while(1){}}voidHAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef*htim){if(htim-InstanceTIM2){HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5);}}voidMX_TIM2_Init(void){htim2.InstanceTIM2;htim2.Init.Prescaler7200-1;htim2.Init.CounterModeTIM_COUNTERMODE_UP;htim2.Init.Period10000-1;htim2.Init.ClockDivisionTIM_CLOCKDIVISION_DIV1;HAL_TIM_Base_Init(htim2);}// 其他函数略四、极速搭建技巧4.1 Prompt技巧技巧一明确MCU型号好的Prompt 生成STM32F103C8T6的Demo... 不好的Prompt 生成STM32的Demo...技巧二明确引脚定义好的Prompt LEDPA5按键PC13... 不好的Prompt LED和按键...技巧三明确功能需求好的Prompt LED闪烁周期500ms串口输出Hello World... 不好的Prompt LED闪烁串口输出...4.2 工程配置技巧技巧一使用模板工程准备 - 创建一个空白模板工程 - 配置好工程选项 - 包含HAL库 使用 - 复制模板工程 - 替换main.c - 编译烧录 耗时从5分钟降低到2分钟技巧二使用STM32CubeMX步骤 1. 打开STM32CubeMX 2. 选择MCU型号 3. 配置外设图形化 4. 生成代码 5. 编译烧录 优点配置直观 缺点需要学习CubeMX4.3 快速验证技巧技巧一LED指示使用LED指示程序运行 - LED闪烁程序正常运行 - LED常亮程序卡死 - LED熄灭程序未运行技巧二串口输出使用串口输出调试信息 - System Start程序启动 - Loop主循环运行 - Error错误发生技巧三逻辑分析仪使用逻辑分析仪快速验证 - 测量LED翻转频率 - 测量串口波特率 - 测量定时器周期五、常见问题快速解决5.1 编译错误错误找不到头文件错误信息fatal error: stm32f1xx_hal.h: No such file 解决 1. 添加HAL库到工程 2. 添加头文件路径 或使用Prompt 生成代码时包含完整的HAL库配置错误未定义的符号错误信息undefined symbol HAL_Init 解决 1. 添加HAL库源文件到工程 2. 或使用Prompt生成完整的工程包含所有必要的源文件5.2 烧录失败问题无法连接目标原因 - ST-Link未连接 - SWD引脚配置错误 - 芯片未供电 解决 1. 检查ST-Link连接 2. 检查供电 3. 检查SWD引脚PA13/PA14问题烧录后不运行原因 - 时钟配置错误 - 启动代码错误 - Flash配置错误 解决 使用Prompt生成完整的时钟配置和启动代码5.3 运行异常问题LED不闪烁排查 1. LED引脚是否正确 2. LED极性是否正确 3. 时钟是否配置正确 Prompt LED不闪烁请检查GPIO配置和时钟配置问题串口无输出排查 1. 串口引脚是否正确 2. 波特率是否匹配 3. 时钟是否正确 Prompt 串口无输出请检查USART配置和时钟配置六、本讲核心要点6.1 记住这三句话极速搭建流程明确需求→AI生成→编译烧录→验证运行10分钟完成Prompt技巧明确MCU型号、明确引脚定义、明确功能需求快速验证LED指示、串口输出、逻辑分析仪6.2 实践建议对于新手准备模板工程学习Prompt技巧练习快速搭建对于有经验工程师建立Demo模板库优化搭建流程提高验证效率6.3 下讲预告第22讲将深入讲解RTOS简易任务原型快速验证逻辑可行性如何在RTOS环境下快速验证任务逻辑的可行性下一讲将详细讲解RTOS任务原型的快速搭建方法。