1.基于寄存器地址LED流水灯
实验前仔细学习视频并下载相关资源库https://www.bilibili.com/video/BV1th411z7sn
寄存器的地址和GPIO口的地址使用需要自行查阅stm32的使用手册这里就不赘述。
实验使用keil5所创建项目和启动文件在视频链接里都有很详细的说明包括简单的接线。所以直接看到代码部分。
代码实现
启用GPIO时钟
*(unsigned int *)0x40021018 |= (1 << 2); // 打开 GPIO A 端口的时钟
*(unsigned int *)0x40021018 |= (1 << 3); // 打开 GPIO B 端口的时钟
*(unsigned int *)0x40021018 |= (1 << 4); // 打开 GPIO C 端口的时钟
配置GPIO引脚
*(unsigned int *)0x40010800 &= 0xFFFFFFF0; // 设置位清零
*(unsigned int *)0x40010800 |= 0x00000030; // PA1 推挽输出,速度为 50MHz
*(unsigned int *)0x40010C00 &= 0xFFFFFF0F; // 设置位清零
*(unsigned int *)0x40010C00 |= 0x00000030; // PB1 推挽输出,速度为 50MHz
*(unsigned int *)0x40011004 &= 0xFF0FFFFF; // 设置位清零
*(unsigned int *)0x40011004 |= 0x00300000; // PC14 推挽输出,速度为 50MHz
设置GPIO引脚的初始状态
*(unsigned int *)0x4001080C = 0x1 << 1; // 将 GPIOA 的 Pin_1 置为高电平
*(unsigned int *)0x40010C0C = 0x1 << 1; // 将 GPIOB 的 Pin_1 置为高电平
*(unsigned int *)0x4001100C &= ~(1 << 14); // 清除 GPIOC 的 Pin_14
*(unsigned int *)0x4001100C = 0x1 << 14; // 将 GPIOC 的 Pin_14 置为高电平
控制LED的状态
while (1)
{
// 红灯亮:GPIOA 的 Pin_1 置低,其他两个引脚置高
*(unsigned int *)0x4001080C = 0x0 << 1; // 将 GPIOA 的 Pin_1 置为低电平
*(unsigned int *)0x40010C0C = 0x1 << 1; // 将 GPIOB 的 Pin_1 置为高电平
*(unsigned int *)0x4001100C = 0x1 << 14; // 将 GPIOC 的 Pin_14 置为高电平
Delay_ms(1000); // 延时 1 秒
// 绿灯亮:GPIOB 的 Pin_1 置低,其他两个引脚置高
*(unsigned int *)0x4001080C = 0x1 << 1; // 将 GPIOA 的 Pin_1 置为高电平
*(unsigned int *)0x40010C0C = 0x0 << 1; // 将 GPIOB 的 Pin_1 置为低电平
*(unsigned int *)0x4001100C = 0x1 << 14; // 将 GPIOC 的 Pin_14 置为高电平
Delay_ms(1000); // 延时 1 秒
// 蓝灯亮:GPIOC 的 Pin_14 置低,其他两个引脚置高
*(unsigned int *)0x4001080C = 0x1 << 1; // 将 GPIOA 的 Pin_1 置为高电平
*(unsigned int *)0x40010C0C = 0x1 << 1; // 将 GPIOB 的 Pin_1 置为高电平
*(unsigned int *)0x4001100C = 0x0 << 14; // 将 GPIOC 的 Pin_14 置为低电平
Delay_ms(1000); // 延时 1 秒
}
延时函数
Delay_ms(1000); // 延时 1 秒
代码烧录进去后能看见三个灯以流水灯形式闪烁,
2.基于标准库实现LED流水灯
代码实现
启用GPIOA时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
配置引脚,为了省事直接是所有A引脚
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; // 配置所有引脚
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 设置输出速度为 50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure);
控制引脚输出状态,时间有点短可以自己设置长一点
Delay_ms(100);
烧录后三个引脚上的LED灯会以100ms的延迟闪烁
项目创建
使用的下载的资源库所以我直接打开的文件,
选一个版本打开建议有注释版
找到下面的流水灯点击进去就可以使用相关的文件配置,
进去后就能直接使用,更细节的配置在开始的视屏网站中有提到。
利用keil仿真分析波形
右键target 1文件打开 勾选如下
然后点击形似放大镜的标志
然后再如下找到窗口
点开了之后会有一个波形图的视窗,
然后设置什么的我就是卡在了这一步,
然后参考https://blog.youkuaiyun.com/weixin_48896613/article/details/125664514
这篇博客里写了一般解决办法和过程。在绑定资源里也有演示,但是本人没有做出来。
心得体会
通过使用 Keil 5 和逻辑分析仪观察 STM32 GPIO 波形,我深刻体会到调试工具在嵌入式开发中的重要性。通过逻辑分析仪,它能够直观地观察到 GPIO 引脚的电平变化,帮助快速发现程序中可能存在的时序问题或硬件配置问题。相比于传统的串口打印调试,逻辑分析仪提供了更精确和实时的波形数据,使得硬件和软件之间的调试变得更加高效。通过正确设置触发条件和采样率,可以精准捕获到关键的信号变化,从而加快了调试过程,也提升了系统的稳定性。总体来说,硬件调试和软件调试的结合是提高开发效率和产品质量的关键。