
提示文章写完后目录可以自动生成如何生成可参考右边的帮助文档文章目录前言实验2工程项目创建、添加标准外设库文件完整步骤及其仿真步骤 1新建 Keil 工程步骤 2准备工程文件夹结构复制标准库文件到本地工程目录步骤 3Keil 工程里添加文件点击左侧 Target1魔术棒旁边的Add Files代码仿真测试实验3HAL库 按键中断方式控制 流水灯运行的暂停、恢复原理说明CubeMX 快速配置步骤代码main.c总结前言实验2工程项目创建、添加标准外设库文件完整步骤及其仿真前提已经下载好 STM32F10x 标准外设库STM32F10x_StdPeriph_Lib_V3.5.0步骤 1新建 Keil 工程打开 Keil5 →Project → New μVision Project选择工程存放目录新建文件夹命名led2工程名led2保存。芯片选择STMicroelectronics → STM32F1 Series → STM32F103C8选中STM32F103C8T6OK。弹出Manage Run-Time Environment全部取消勾选直接点 OK手动添加库文件不用 RTE。步骤 2准备工程文件夹结构复制标准库文件到本地工程目录在led2工程文件夹内新建下面文件夹结构保持一致CMSIS存放启动文件、core 内核头文件LibrarySTM32 标准外设库驱动文件Library/inc库头文件*.hLibrary/src库源文件*.cUser存放 main.c、stm32f10x_conf.h、stm32f10x_it.c/h 用户代码Listings、Objects编译输出文件从标准库压缩包里复制文件到对应目录CMSIS 目录复制STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSupport全部文件复制STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x全部文件✅ 启动文件startup_stm32f10x_md.s放到 CMSIS 文件夹。Library 目录外设库源文件 (.c)STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver\src→ 复制到Library/src头文件 (.h)STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver\inc→复制到Library/incUser 目录复制标准库模板文件STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template下面这 4 个文件放到 Usermain.cstm32f10x_conf.hstm32f10x_it.cstm32f10x_it.h步骤 3Keil 工程里添加文件点击左侧 Target1魔术棒旁边的Add Files依次添加下面文件分组Group1CMSIS添加CMSIS/startup_stm32f10x_md.s启动文件找到system_stm32f10x.c添加到 CMSIS 分组Group2Library外设库只添加需要用到的.c文件节省编译时间stm32f10x_gpio.c //GPIO 驱动控制 LEDstm32f10x_rcc.c //RCC 时钟使能misc.c//SysTick 延时Group3User添加 User 文件夹下main.c 、stm32f10x_it.c代码配置#include “stm32f10x.h”// ???,???#define LED_RED_PIN GPIO_Pin_0 //PA0 ?LED#define LED_RED_PORT GPIOA#define LED_RED_RCC RCC_APB2Periph_GPIOA#define LED_BLUE_PIN GPIO_Pin_1 //PB1 ?LED#define LED_BLUE_PORT GPIOB#define LED_BLUE_RCC RCC_APB2Periph_GPIOB#define LED_BOARD_PIN GPIO_Pin_13 //PC13 ??LED#define LED_BOARD_PORT GPIOC#define LED_BOARD_RCC RCC_APB2Periph_GPIOC#define LED_GREEN_PIN GPIO_Pin_14 //PC14 ?LED#define LED_GREEN_PORT GPIOC#define LED_GREEN_RCC RCC_APB2Periph_GPIOC// ???,SysTick,72M???void Delay_ms(uint32_t ms){SysTick_Config(72000); //72M,72000???1msuint32_t i;for(i0; ims; i){while( !((SysTick-CTRL)(116)) ); //???0}SysTick-CTRL ~SysTick_CTRL_ENABLE_Msk; //??systick}//LED??? ???void LED_Init(void){GPIO_InitTypeDef GPIO_InitStruct; //GPIO???,???//1. ??GPIOA GPIOB GPIOC?? RCC_APB2PeriphClockCmd(LED_RED_RCC | LED_BLUE_RCC | LED_BOARD_RCC, ENABLE); // PA0 ???? 50Mhz GPIO_InitStruct.GPIO_Pin LED_RED_PIN; GPIO_InitStruct.GPIO_Mode GPIO_Mode_Out_PP; //???? GPIO_InitStruct.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(LED_RED_PORT, GPIO_InitStruct); GPIO_SetBits(LED_RED_PORT,LED_RED_PIN); //?????,LED?? // PB1 ???? 50Mhz GPIO_InitStruct.GPIO_Pin LED_BLUE_PIN; GPIO_Init(LED_BLUE_PORT, GPIO_InitStruct); GPIO_SetBits(LED_BLUE_PORT,LED_BLUE_PIN); // PC13 ???? 50Mhz GPIO_InitStruct.GPIO_Pin LED_BOARD_PIN; GPIO_Init(LED_BOARD_PORT, GPIO_InitStruct); GPIO_SetBits(LED_BOARD_PORT,LED_BOARD_PIN); // PC14 ???? 50Mhz GPIO_InitStruct.GPIO_Pin LED_GREEN_PIN; GPIO_Init(LED_GREEN_PORT, GPIO_InitStruct); GPIO_SetBits(LED_GREEN_PORT,LED_GREEN_PIN);}//???LED,???void LED_On(uint8_t ledNo){//??LED???GPIO_SetBits(GPIOA,LED_RED_PIN);GPIO_SetBits(GPIOB,LED_BLUE_PIN);GPIO_SetBits(GPIOC,LED_BOARD_PIN | LED_GREEN_PIN);switch(ledNo) { case 0: GPIO_ResetBits(GPIOA,LED_RED_PIN); break; //PA0? case 1: GPIO_ResetBits(GPIOB,LED_BLUE_PIN); break; //PB1? case 2: GPIO_ResetBits(GPIOC,LED_BOARD_PIN); break; //PC13??? case 3: GPIO_ResetBits(GPIOC,LED_GREEN_PIN); break;//PC14? default: break; }}主函数int main(void){LED_Init();while(1){LED_On(0); //???Delay_ms(1000);LED_On(1); //???Delay_ms(1000);LED_On(2); //??PC13?Delay_ms(1000);LED_On(3); //???Delay_ms(1000);}}仿真测试1. 读取周期从图中横坐标4.603387s、11.60339s、18.60339s相邻两个相同跳变点时间差11.60339-4.60387≈7s一个完整方波周期高电平 低电平LED亮 灭一次≈7 秒高电平持续约 3.5s低电平持续约 3.5s占空比接近 50%。2. 时序状态是否正确波形是稳定、规则的方波每个通道高低电平翻转间隔一致没有出现抖动、毛刺、随机跳变每次电平翻转之后保持时间稳定说明软件循环延时代码可以稳定控制 GPIO 引脚翻转✅时序状态正确GPIO 可以正常输出高低电平LED 可以稳定周期性闪烁。3. 高低电平转换周期LED 闪烁周期完整闪烁周期亮一次 灭一次≈7s半周期单独亮 / 单独灭≈3.5s4. 补充这个周期由软件循环延时函数决定。软件延时是靠 CPU 空循环计数会受代码中其他指令开销影响所以不是精确等于写在延时函数里的理论值但波形仿真中周期稳定说明延时程序可以稳定工作。图中4路 GPIO 波形都为同频率方波只是相位有偏移四路 LED 会按固定相位依次翻转各自的闪烁周期都约 7 秒。实验3HAL库 按键中断方式控制 流水灯运行的暂停、恢复原理说明使用 HAL 库开发保留实验 2 的 4 个 LED 引脚逻辑不变流水灯依次点亮间隔 1sPA9 配置为外部中断上升沿触发定义全局volatile变量run_flag作为运行标志run_flag1主循环执行流水灯代码run_flag0主循环卡在空循环LED 保持当前状态暂停流水灯中断回调函数HAL_GPIO_EXTI_Callback在 PA9 中断触发时将run_flag取反切换启停状态中断服务函数中不做延时、不做复杂操作只修改标志主循环负责业务逻辑符合嵌入式中断编程规范。CubeMX 快速配置步骤打开 STM32CubeMX芯片选择STM32F103C8T6RCCHSE 选择 Crystal/Ceramic Resonator外部晶振SYSDebug 选 Serial Wire下载调试引脚配置PA0、PB1、PC13、PC14 →GPIO_Output推挽输出PA9 →GPIO_EXTI9触发模式Rising edge上升沿Pull-down 下拉时钟树HSE 8MPLL×9系统时钟 72MHz生成工程选择 MDK-ARM生成代码在生成工程的main.c编译代码替换 LED 逻辑。代码main.c/* USER CODE BEGIN PV */volatile uint8_t run_flag 1;#define LED_RED_PIN GPIO_PIN_0#define LED_RED_PORT GPIOA#define LED_BLUE_PIN GPIO_PIN_1#define LED_BLUE_PORT GPIOB#define LED_BOARD_PIN GPIO_PIN_13#define LED_BOARD_PORT GPIOC#define LED_GREEN_PIN GPIO_PIN_14#define LED_GREEN_PORT GPIOC/* USER CODE END PV */void LED_On(uint8_t ledNo){HAL_GPIO_WritePin(LED_RED_PORT,LED_RED_PIN,GPIO_PIN_SET);HAL_GPIO_WritePin(LED_BLUE_PORT,LED_BLUE_PIN,GPIO_PIN_SET);HAL_GPIO_WritePin(LED_BOARD_PORT,LED_BOARD_PIN,GPIO_PIN_SET);HAL_GPIO_WritePin(LED_GREEN_PORT,LED_GREEN_PIN,GPIO_PIN_SET);switch(ledNo) { case 0: HAL_GPIO_WritePin(LED_RED_PORT,LED_RED_PIN,GPIO_PIN_RESET); break; case 1: HAL_GPIO_WritePin(LED_BLUE_PORT,LED_BLUE_PIN,GPIO_PIN_RESET); break; case 2: HAL_GPIO_WritePin(LED_BOARD_PORT,LED_BOARD_PIN,GPIO_PIN_RESET); break; case 3: HAL_GPIO_WritePin(LED_GREEN_PORT,LED_GREEN_PIN,GPIO_PIN_RESET); break; default: break; }}/* USER CODE BEGIN 4/void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){if(GPIO_Pin GPIO_PIN_9){run_flag !run_flag;}}/USER CODE END 4 */![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](https://img-home.csdnimg.cn/images/20230724024159.png?origin_urlttps%3A%2F%2Fi-blog.csdnimg.cn%2Fdirect%2F05d457c615f94d92a9d6bb68ec60793b.png%23pic_centerpos_idimg-cR07Dg8Q7c615f94d92a9d6bb68ec60793b.png#pic_center实验效果视频https://live.csdn.net/v/546512hal中断总结1.本次STM32外部中断流水灯实验我学会了使用STM32CubeMX配置GPIO引脚、外部中断以及NVIC完成PC13、PC14等LED的引脚修改实现按键控制流水灯启停。调试过程中遇到PA9中断不触发的问题通过排查NVIC配置、引脚模式与硬件接线逐步找到故障原因。让我认识到嵌入式开发软硬件密不可分配置、代码、接线任一环节出错都会导致实验失败培养了我排查问题、严谨调试的工程思维。2.标准外设库直接操作寄存器封装的函数底层更贴近硬件执行效率高需要手动配置时钟、中断、寄存器代码量大上手难度高不同芯片移植麻烦。HAL库ST官方推出的硬件抽象层高度封装依托CubeMX图形化配置自动生成初始化代码开发速度快跨芯片移植方便代码可读性好但封装层级多运行效率略低于标准外设库。综上外设库偏向底层、手动写配置HAL库简化开发图形化生成代码更适合快速开发但抽象程度更高。