ARTICLE DETAIL

资讯详情

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

STM32F103寄存器方式流水灯

STM32F103寄存器方式流水灯 STM32F103寄存器方式流水灯实验报告实验名称STM32F103寄存器直接操作实现流水灯一、实验目的1.熟悉STM32F103C8T6最小系统板硬件了解GPIO端口功能。2.掌握寄存器直接操作方式理解外设时钟、GPIO配置寄存器作用。3.分别控制GPIOA‑PA0、GPIOB‑PB0、GPIOB‑PB1外接LED实现三个外接LED间隔1秒轮流点亮。4.调用板载PC13LED修改程序完成四路流水灯效果。5.熟练Keil‑MDK工程创建、代码编译、程序下载操作。6.学习Git工具将项目上传至Gitee仓库撰写实验博客。二、实验器材1.STM32F103C8T6最小系统板2.ST‑Link仿真下载器3.面包板红、黄、蓝3只LED220Ω限流电阻若干杜邦线4.笔记本电脑Keil uVision5开发软件三、实验原理STM32的GPIO外设工作前必须开启对应端口时钟由RCC_APB2ENR寄存器控制。本次实验外接三个LED分别接到PA0、PB0、PB1引脚板载LED为PC13。- GPIOx‑CRL控制引脚0‑7的工作模式PA0、PB0、PB1都由CRL寄存器配置设置为通用推挽输出。- GPIOx‑CRH控制引脚8‑15PC13属于CRH寄存器管理。- BSRR置位寄存器写1引脚输出高电平。- BRR复位寄存器写1引脚输出低电平。硬件电路PA0、PB0、PB1引脚串联220Ω限流电阻后接LED阳极LED阴极接GND。引脚输出高电平时外接LED点亮。板载PC13LED电路相反低电平点亮高电平熄灭编程的时候需要注意电平逻辑。延时采用软件空循环实现粗略达到1秒延时缺点延时精度不高。寄存器关键地址表格寄存器 基地址 偏移RCC 0x40021000 0x18(RCC_APB2ENR)GPIOA 0x40010800 0x00(CRL)GPIOB 0x40010C00 0x00(CRL)GPIOC 0x40011000 0x04(CRH)四、程序设计思路1.宏定义各个寄存器地址将地址强制转换为volatile无符号整数指针直接读写寄存器。2.初始化函数中打开GPIOA、GPIOB、GPIOC时钟。3.配置PA0、PB0、PB1推挽输出配置PC13推挽输出。4.初始化所有LED处于熄灭状态。5.编写软件延时函数双层循环空操作实现延时。6.main主循环依次点亮PA0→PB0→PB1→PC13每次延时1s然后熄灭切换下一盏灯无限循环。五、实验代码带注释引脚PA0 PB0 PB1#include stm32f10x.h// ????,??t1000 ????1?void Delay(uint32_t t){uint32_t i,j;for(i0;it;i)for(j0;j7200;j);}int main(void){// ??GPIOA?GPIOB??RCC-APB2ENR | (1U 2) | (1U 3);// PA0 ???? 50MHzGPIOA-CRL ~(0x0FU 0);GPIOA-CRL | (0x03U 0);// PB0 ???? 50MHzGPIOB-CRL ~(0x0FU 0);GPIOB-CRL | (0x03U 0);// PB1 ???? 50MHzGPIOB-CRL ~(0x0FU 4);GPIOB-CRL | (0x03U 4);// ??????GPIOA-ODR ~(1U 0);GPIOB-ODR ~((1U 0)|(1U 1));while(1){//PA0?GPIOA-ODR | (1U 0);GPIOB-ODR ~((1U 0)|(1U 1));Delay(1000); // ??1?//PB0?GPIOA-ODR ~(1U 0);GPIOB-ODR | (1U 0);GPIOB-ODR ~(1U 1);Delay(1000); // ??1?//PB1?GPIOA-ODR ~(1U 0);GPIOB-ODR ~(1U 0);GPIOB-ODR | (1U 1);Delay(1000); // ??1?}}六、实验步骤1.硬件接线PA0 →220Ω电阻→LED正极LED负极接GNDPB0 →220Ω电阻→LED正极LED负极接GNDPB1 →220Ω电阻→LED正极LED负极接GNDST‑Link连接开发板SWDIO、SWCLK、GND、3.3V。实物接线效果如图插入你三张实拍图片。2.打开Keil‑MDK新建工程选择STM32F103C8芯片。3.新建main.c文件粘贴上面寄存器代码。4.配置调试器为ST‑Link勾选下载后复位运行。5.编译工程无报错后下载程序到最小系统板。6.上电观察现象外接PA0、PB0、PB1三个LED和板子上面PC13自带LED按照顺序轮流点亮每一盏灯点亮大约保持1秒不断循环流水。7.记录现象截图Keil编译界面、硬件点灯实物图。七、实验现象程序下载完成之后外接在PA0、PB0、PB1的三个LED与板载PC13LED依次点亮流水顺序PA0 → PB0 → PB1 → PC13每个灯点亮约1秒循环往复。因为采用软件延时间隔时间不是特别精准。八、遇到的问题与解决学生真实感1.一开始代码编译报错 uint32_t 未定义。后面改用unsigned int宏定义寄存器解决报错。2.刚写完程序灯没有任何反应排查很久才想起来STM32GPIO使用前必须开启时钟补上时钟开启语句之后引脚才有输出。3.这次用到PB0与PB1两个引脚同在GPIOB端口CRL寄存器一开始移位位置写错PB1控制失效对照寄存器手册PB1对应第4‑7位修改移位数值后正常。4.板载PC13LED电平逻辑相反一开始直接套用外接LED高电平点亮的写法结果PC13状态反了修改BSRR、BRR控制语句之后正常。5.软件延时误差比较大实物上面1秒间隔看着有点快之后想要精准定时需要学习定时器。九、实验总结本次实验没有调用库函数直接操作寄存器地址控制GPIO。外接LED引脚选用PA0、PB0、PB1加上板载PC13实现四路流水灯。通过本次实验我弄明白了寄存器每一位配置的含义同一端口多个引脚配置时不能互相干扰修改CRL寄存器前先对应位清零再赋值。同时记住了PC13属于CRH寄存器不能操作CRL。软件延时只能粗略定时缺点很多。之后想要做好STM32开发还要深入学习定时器、中断。本次作业同时需要把工程上传Gitee练习Git基础命令发布实验博客完成全部提交任务。
返回列表