STM32点灯/流水灯

本文详细介绍了如何使用STM32单片机通过RCC和GPIO接口点亮LED灯,包括开启时钟、初始化GPIO、设置工作模式和使用延迟函数实现亮灭效果。同时,展示了如何扩展到流水灯项目的实现。
摘要由CSDN通过智能技术生成

使用STM32点亮一盏LED灯需要执行三个步骤:

        ①使用RCC开启时钟

        ②使用GPIO_Init()初始化GPIO口

        ③使用输入输出函数控制GPIO口

GPIO的库函数:

1.GPIO_DeInit():参数写GPIOx,复位指定的GPIO外设

2.GPIO_AFIODeInit():复位AFIO外设

3.GPIO_Init():用结构体的参数来初始化GPIO

4.GPIO_StructInit():给结构体变量赋值

5.8个GPIO读写函数,具体参考gpio.h文件

GPIO的8种工作模式:

·每个GPIO端口对应16个引脚。例:GPOIOA(PA0~PA15)

(注:PA15、PB3、PB4为JTAG的调试端口,若作为普通端口输出需另外配置)

·内核CPU可以通过APB2总线对寄存器读写,完成输出电平和读取电平的功能

点亮LED灯使用GPIO的推挽输出功能(OUT_PP),且LED灯接在A0口。

main函数如下所示:

int main(void)
{
	//使用RCC开启GPIO时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	
	//使用GPIO_Init函数初始化GPIO口
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //Out_PP为推挽输出模式
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	
	while(1)
	{   //使用输出函数控制GPIO口
		GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET); //GPIO_WriteBit(GPIOA,GPIO_Pin_0,(BitAction)0);
		Delay_ms(2000);
		GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET);   //GPIO_WriteBit(GPIOA,GPIO_Pin_0,(BitAction)1);
		Delay_ms(2000);
	}
}

对于LED亮灭之间的间隔,使用一个Delay函数来进行延时

另外在工程文件中对不同模块进行封装,Delay函数则需要新建一个Delay.c,Delay.h文件封装在System文件夹中

delay.c文件如下所示

#include "stm32f10x.h"

/**
  * @brief  微秒级延时
  * @param  xus 延时时长,范围:0~233015
  * @retval 无
  */
void Delay_us(uint32_t xus)
{
	SysTick->LOAD = 72 * xus;				//设置定时器重装值
	SysTick->VAL = 0x00;					//清空当前计数值
	SysTick->CTRL = 0x00000005;				//设置时钟源为HCLK,启动定时器
	while(!(SysTick->CTRL & 0x00010000));	//等待计数到0
	SysTick->CTRL = 0x00000004;				//关闭定时器
}

/**
  * @brief  毫秒级延时
  * @param  xms 延时时长,范围:0~4294967295
  * @retval 无
  */
void Delay_ms(uint32_t xms)
{
	while(xms--)
	{
		Delay_us(1000);
	}
}
 
/**
  * @brief  秒级延时
  * @param  xs 延时时长,范围:0~4294967295
  * @retval 无
  */
void Delay_s(uint32_t xs)
{
	while(xs--)
	{
		Delay_ms(1000);
	}
} 

delay.h文件如下所示

#ifndef __DELAY_H
#define __DELAY_H

void Delay_us(uint32_t us);
void Delay_ms(uint32_t ms);
void Delay_s(uint32_t s);

#endif

至此就完成了使用单片机进行点灯操作。

类似的,如果要实现流水灯的项目,则需要初始化更多所用到的端口

流水灯的main.c文件如下

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

int main(void)
{
	//使用RCC开启GPIO时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	
	//使用GPIO_Init函数初始化GPIO口
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //Out_PP为推挽输出模式
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;				//初始化所有GPIOA端口
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	while(1)
	{
		//使用输出函数控制GPIO口
		GPIO_Write(GPIOA,~0x0001); // 0000 0000 0000 0001
		Delay_ms(100);
		GPIO_Write(GPIOA,~0x0002); // 0000 0000 0000 0010
		Delay_ms(100);
		GPIO_Write(GPIOA,~0x0004); // 0000 0000 0000 0100
		Delay_ms(100);
		GPIO_Write(GPIOA,~0x0008); // 0000 0000 0000 1000
		Delay_ms(100);
		GPIO_Write(GPIOA,~0x0010); // 0000 0000 0001 0000
		Delay_ms(100);
		GPIO_Write(GPIOA,~0x0020); // 0000 0000 0010 0000
		Delay_ms(100);
		GPIO_Write(GPIOA,~0x0040); // 0000 0000 0100 0000
		Delay_ms(100);
		GPIO_Write(GPIOA,~0x0080); // 0000 0000 1000 0000
		Delay_ms(100);
	}
}

至此,流水灯也完成了。

  • 14
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值