ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

STM32F103C8T6 流水灯实验报告

STM32F103C8T6 流水灯实验报告 文章目录实验目的实验环境一、实验任务 1寄存器直接操作方式实现流水灯1.1 程序设计思路1.2 关键寄存器地址与参数1.3 寄存器版完整代码二、实验任务 2标准外设库SPL方式实现流水灯2.1 工程创建与库文件添加详细过程2.2 标准库完整代码包含 PC13 板载 LED2.3 软件延时周期分析2.4 Keil 逻辑分析仪仿真结果分析三、实验任务 3拓展HAL 库 外部中断按键控制流水灯暂停恢复实验现象实验问题与分析实验总结实验目的掌握 STM32F103C8T6 GPIO 寄存器底层编程理解 GPIO 相关寄存器功能与地址。掌握 STM32 标准外设库SPL工程搭建流程学会添加 CMSIS、标准库源文件。实现 GPIO 端口控制 LED 流水闪烁将板载 PC13 指示灯加入流水灯序列。掌握软件循环延时原理使用 Keil 逻辑分析仪软件仿真观察 GPIO 输出波形分析时序。理解寄存器编程与标准库编程两种开发方式的区别。实验环境硬件STM32F103C8T6 最小系统板、LED 若干、ST‑Link 下载器软件Keil MDK‑ARM5STM32F10x_StdPeriph_Lib_V3.5.0 标准固件库仿真Keil Logic Analyzer 逻辑分析仪软件仿真一、实验任务 1寄存器直接操作方式实现流水灯1.1 程序设计思路开启 APB2 外设时钟GPIOA、GPIOC 挂载在 APB2 总线上开启 RCC APB2 使能位给端口提供工作时钟。GPIO 配置寄存器CRL端口低八位模式配置寄存器配置推挽输出模式0011最大输出速度 50MHz。ODR端口输出数据寄存器写 0 输出低电平写 1 输出高电平控制 LED 亮灭。板载 LED 为PC13C8T6 最小系统板 PC13LED 一般是低电平点亮。写软件循环延时函数空循环消耗 CPU 时间实现毫秒延时。循环遍历 PA0‑PA4、PC13依次拉低点亮 LED延时 1s拉高熄灭实现轮询流水闪烁。1.2 关键寄存器地址与参数STM32F103 寄存器基地址表格寄存器基地址说明RCC 基地址0x40021000复位时钟控制单元RCC‑APB2ENR0x40021018APB2 外设时钟使能寄存器Bit2:GPIOA 时钟Bit4:GPIOC 时钟GPIOA 基地址0x40010800GPIOA 寄存器起始地址GPIOA‑CRL0x40010800PA0‑PA7 模式配置寄存器GPIOA‑ODR0x4001080CGPIOA 输出寄存器GPIOC 基地址0x40011000GPIOC 寄存器起始地址GPIOC‑CRH0x40011004PC8‑PC15 模式配置寄存器PC13 在此寄存器GPIOC‑ODR0x4001100CGPIOC 输出寄存器模式说明通用推挽输出MODE11(50MHz) CNF00配置值0x3。1.3 寄存器版完整代码#include stm32f10x.h /** * brief 软件ms延时72MHz主频 */ void Delay_ms(uint32_t ms) { uint32_t i,j; for(i 0; i ms; i) for(j 0; j 12000; j); } int main(void) { //1.开启GPIOA、GPIOC时钟 RCC_APB2ENR *(volatile unsigned int *)0x40021018 | (12); //开启GPIOA时钟 *(volatile unsigned int *)0x40021018 | (14); //开启GPIOC时钟 //2.配置PA0‑PA4为推挽输出50MHz CRL寄存器 *(volatile unsigned int *)0x40010800 ~0x000FFFFF; *(volatile unsigned int *)0x40010800 | 0x00033333; //3.配置PC13推挽输出50MHzCRH寄存器 PC13对应bit20‑23 *(volatile unsigned int *)0x40011004 ~(0xF 20); *(volatile unsigned int *)0x40011004 | (0x3 20); //全部LED初始熄灭PA0‑PA4置1PC13置1(板载LED高电平熄灭) *(volatile unsigned int *)0x4001080C | (0x1F); *(volatile unsigned int *)0x4001100C | (113); //LED引脚掩码数组PA0,PA1,PA2,PA3,PA4,PC13 uint32_t led_mask[] {10,11,12,13,14, 1U13}; while(1) { for(uint8_t i 0; i 6; i) { if(i 5) { //PA口LED置0点亮 *(volatile unsigned int *)0x4001080C ~led_mask[i]; Delay_ms(1000); *(volatile unsigned int *)0x4001080C | led_mask[i]; } else { //PC13板载LED置0点亮 *(volatile unsigned int *)0x4001100C ~led_mask[i]; Delay_ms(1000); *(volatile unsigned int *)0x4001100C | led_mask[i]; } } } }二、实验任务 2标准外设库SPL方式实现流水灯2.1 工程创建与库文件添加详细过程新建工程目录在桌面英文路径新建总工程文件夹内部新建子文件夹Project存放 keil 工程文件.uvprojxCMSIS存放内核启动文件StdPeriph_Driver标准外设库源码 inc、srcUsermain.c、stm32f10x_it.c、stm32f10x_conf.hOutput输出 hex、编译中间文件复制 CMSIS 内核文件从官方库Libraries\CMSIS\CM3\CoreSupport复制core_cm3.c core_cm3.h从DeviceSupport\ST\STM32F10x复制system_stm32f10x.c/h启动文件Libraries\CMSIS\startup\arm\startup_stm32f10x_md.sC8T6 Flash64K 中等密度 md 版本复制进 CMSIS。复制标准外设库驱动Libraries\STM32F10x_StdPeriph_Driver下inc、src整个拷贝添加misc.c/h。复制模板配置文件官方模板Project\STM32F10x_StdPeriph_Template复制stm32f10x_conf.h、stm32f10x_it.c/h放入 User 文件夹。Keil 工程分组创建CMSIS组core_cm3.c、system_stm32f10x.c、startup_stm32f10x_md.sStdPeriph组各个外设.c源文件gpio、rcc、miscUser组main.c、stm32f10x_it.c配置头文件包含路径魔术棒→C/C添加 include 搜索路径./CMSIS./StdPeriph_Driver/inc./User预定义宏STM32F10X_MD,USE_STDPERIPH_DRIVER芯片选型STM32F103C8Output 勾选生成.hex文件。2.2 标准库完整代码包含 PC13 板载 LED2.3 软件延时周期分析软件延时依靠 CPU 空循环实现延时精度受编译器优化等级影响。实验设置‑O0零优化72MHz 下内层循环 12000 次大致消耗 1ms开启优化后循环会被编译器优化删除延时失效。缺点软件延时占用 CPU无法做别的任务不精准是粗略延时。2.4 Keil 逻辑分析仪仿真结果分析Debug 设置选择Use Simulator软件仿真逻辑分析仪添加信号PORTA.0~PORTA.4设置显示类型Bit位模式。全速运行仿真采集 GPIO 端口方波波形。仿真现象波形高低电平变化顺序与流水灯逻辑完全符合引脚依次拉低、延时、拉高。⚠️受精简版 Keil 仿真 DLL 缺失影响软件仿真内部时钟和真实 72MHz 不一致仿真工具显示的时间轴周期不等于实物 1s。实物下载到开发板72MHz 系统时钟下闪烁周期为 1 秒。仿真价值不需要硬件电路板提前验证 GPIO 输出逻辑是否正确排查代码逻辑错误。三、实验任务 3拓展HAL 库 外部中断按键控制流水灯暂停恢复简要写进报告可直接编译功能按键触发外部中断翻转运行状态控制流水灯暂停 / 继续#include stm32f1xx_hal.h GPIO_InitTypeDef GPIO_InitStruct; EXTI_HandleTypeDef hexti; uint8_t run_flag 1; //1运行0暂停 //中断回调函数 void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if(GPIO_Pin GPIO_PIN_0) { run_flag !run_flag; } } int main(void) { HAL_Init(); SystemClock_Config(); //LED初始化省略 //PA0按键下降沿外部中断 __HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitStruct.Pin GPIO_PIN_0; GPIO_InitStruct.Mode GPIO_MODE_IT_FALLING; GPIO_InitStruct.Pull GPIO_PULLUP; HAL_GPIO_Init(GPIOA, GPIO_InitStruct); HAL_NVIC_EnableIRQ(EXTI0_IRQn); HAL_NVIC_SetPriority(EXTI0_IRQn,2,2); while(1) { if(run_flag 1) { //流水灯执行代码 } } }实验现象寄存器版本下载到 STM32 最小系统板PA0‑PA4 外接 LED、PC13 板载 LED依次点亮每个灯亮 1s循环往复。标准库版本现象和寄存器版本完全一致。逻辑分析仪仿真软件仿真可以看到对应 GPIO 引脚周期性高低电平方波电平变换顺序符合流水灯逻辑。拓展 HAL 中断实验按下按键流水灯暂停再次按下恢复流水闪烁。实验问题与分析上电 LED 全亮原因GPIO 复位默认电平初始化完成之后需要手动 SetBits把 LED 全部置为熄灭状态。解决初始化结束后执行GPIO_SetBits全部引脚输出高电平。软件仿真时间和实物时间不一致原因Keil 精简版缺少 STM32 仿真外设 DLL无法设置 72M 仿真时钟。解决仿真只看逻辑顺序时间以实物开发板为准。PC13 板载 LED 电平相反最小系统板 PC13LED 是共阳极输出低电平点亮高电平熄灭和普通 PA 口 LED 逻辑保持一致。软件延时函数失效编译器优化等级调高空 for 循环会被直接优化删除。解决调试保持‑O0 优化或者使用 HAL 库 HAL_DelaySysTick 定时器硬件延时。实验总结寄存器编程直接操作内存地址执行效率高但可读性差标准库对寄存器封装代码可读性强开发效率高。GPIO 使用前必须开启对应总线时钟否则端口不工作。PC13 板载 LED 可以当作普通 GPIO 使用注意硬件点亮电平。软件循环延时属于阻塞延时精度有限适合简单实验实际产品建议定时器中断延时。Keil 逻辑分析仪软件仿真不用硬件即可验证 IO 输出逻辑可以快速定位代码逻辑 bug。
返回列表