[经验分享] LED流水灯

[复制链接]
155|0
Haizangwang 发表于 2025-10-9 11:57 | 显示全部楼层 |阅读模式
1.程序设计思路

(1)配置GPIO端口为输出模式

(2)使用循环控制LED灯闪烁

(3)使用延时函数控制LED灯闪烁 2.GPIOx端口的各寄存器地址和详细参数

GPIOA 端口:

GPIOA_CRL 寄存器:用于配置 GPIOA 的0~7号管脚的控制模式和速度,每4位代表一个管脚,共有2个字节。

GPIOA_CRH 寄存器:用于配置 GPIOA 的8~15号管脚的控制模式和速度,每4位代表一个管脚,共有2个字节。

GPIOA_BSRR 寄存器:设置 GPIOA 输出的位状态,每个位对应一个管脚,共有4个字节。 GPIOB 端口:

GPIOB_CRL 寄存器:用于配置 GPIOB 的0~7号管脚的控制模式和速度,每4位代表一个管脚,共有2个字节。

GPIOB_CRH 寄存器:用于配置 GPIOB 的8~15号管脚的控制模式和速度,每4位代表一个管脚,共有2个字节。

GPIOB_BSRR 寄存器:设置 GPIOB 输出的位状态,每个位对应一个管脚,共有4个字节。 GPIOC 端口:

GPIOC_CRL 寄存器:用于配置 GPIOC 的0~7号管脚的控制模式和速度,每4位代表一个管脚,共有2个字节。

GPIOC_CRH 寄存器:用于配置 GPIOC 的8~15号管脚的控制模式和速度,每4位代表一个管脚,共有2个字节。

GPIOC_BSRR 寄存器:设置 GPIOC 输出的位状态,每个位对应一个管脚,共有4个字节。

3.编程实现

(1)函数封装

实现代码如下

void LED_GPIO_Config(void) { *(unsigned int *)0x40021018 |=(1<<2); *(unsigned int *)0x40021018 |=(1<<3); *(unsigned int *)0x40021018 |=(1<<4);

*(unsigned int *)0x40010800 &=0xFFFFFFF0;

*(unsigned int *)0x40010800 |=0x00000002;

*(unsigned int *)0x40010C04 &=0xFFFFFF0F;

*(unsigned int *)0x40010C04 |=0x00000020;

*(unsigned int *)0x40011004 &=0xFF0FFFFF;

*(unsigned int *)0x40011004 |=0x20000000;



*(unsigned int *)0x40010800 &=0xFFFFFFF0;

*(unsigned int *)0x40010800 |=0x00000002;

*(unsigned int *)0x40010C04 &=0xFFFFFF0F;

*(unsigned int *)0x40010C04 |=0x00000020;

*(unsigned int *)0x40011004 &=0xFF0FFFFF;

*(unsigned int *)0x40011004 |=0x20000000;



}

(2)LEDA.LEDB.LEDC闪烁函数

代码如下

void LEDA_LIGHT(){ *(unsigned int *)0x4001080C=0x0<<0; *(unsigned int *)0x40010C0C=0x1<<9; *(unsigned int *)0x4001100C=0x1<<15; } void LEDB_LIGHT(){ *(unsigned int *)0x4001080C=0x1<<0; *(unsigned int *)0x40010C0C=0x0<<9; *(unsigned int *)0x4001100C=0x1<<15; } void LEDC_LIGHT(){ *(unsigned int *)0x4001080C=0x1<<0; *(unsigned int *)0x40010C0C=0x1<<9; *(unsigned int *)0x4001100C=0x0<<15; }

(3)主函数

代码如下

int main(void) { LED_GPIO_Config();

while(1)

{

LEDA_LIGHT();

Delay_ms(1000);

LEDB_LIGHT();

Delay_ms(1000);

LEDC_LIGHT();

Delay_ms(1000);

}



}

4.将PC13LED编入流水灯中

代码如下

#include "stm32f10x.h" // Device header #include "Delay.h"

int main(void) { RCC->APB2ENR = 0x0000001C; /RCC->APB2ENR = 0x0000001C; GPIOC->CRH = 0x300000; GPIOC->ODR = 0x00000000; Delay_ms(500); GPIOC->ODR = 0x00002000; Delay_ms(500);/ while(1) { RCC->APB2ENR = 0x0000001C; GPIOC->CRH = 0x00300000; GPIOC->ODR = 0x00000000; Delay_ms(500); GPIOC->ODR = 0x00002000; Delay_ms(500);

GPIOA->CRL = 0x00000003;



GPIOA->ODR = 0x00000001;

Delay_ms(500);

GPIOA->ODR = 0x00000000;

Delay_ms(500);



GPIOB->CRL = 0x00000003;



GPIOB->ODR = 0x00000001;

Delay_ms(500);

GPIOB->ODR = 0x00000000;

Delay_ms(500);



}



}

5.基于标准外设库实现

(1)首先开启时钟

代码如下

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

(2)初始化GPIO

代码如下

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;

GPIO_Init(GPIOA, &GPIO_InitStructure);



(3)输入函数控制闪硕

代码如下

while (1) { GPIO_Write(GPIOA, ~0x0001); Delay_ms(1000); GPIO_Write(GPIOA, ~0x0002); Delay_ms(1000); GPIO_Write(GPIOA, ~0x0004); Delay_ms(1000); GPIO_Write(GPIOA, ~0x0008); Delay_ms(1000); GPIO_Write(GPIOA, ~0x0010); Delay_ms(1000); GPIO_Write(GPIOA, ~0x0020); Delay_ms(1000); GPIO_Write(GPIOA, ~0x0040); Delay_ms(1000); GPIO_Write(GPIOA, ~0x0080); Delay_ms(1000); } }

结果如下



6.通过仿真, 分析闪烁周期

(1)打开keil软件,打开debug,选择ues simulator

(2) 修改dialog dll和parameter

(3) 选择start session

(4) 选择logic analyzer

(5) 选择run输出波形

结果如下



(6)计算闪烁周期
————————————————
版权声明:本文为CSDN博主「uppp123」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/2302_80163058/article/details/152051426

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

85

主题

270

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部