STM32实现流水灯:
实物图如下:
三个主要代码:
Delay.c,Delay.h和main.c
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" // 设备头文件
#include "Delay.h" // 延时头文件
int main(void)
{
/* 开启GPIOA的时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 开启GPIOA时钟
// 使用外设前必须开启时钟,否则对外设的操作无效
/* GPIO初始化 */
GPIO_InitTypeDef GPIO_InitStructure; // 定义GPIO初始化结构体变量
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 设置GPIO模式为推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12; // 设置GPIO引脚
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 设置GPIO速度为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化GPIOA,配置参数由结构体提供
/* 主循环,循环体内的代码会一直循环执行 */
while (1)
{
/* 设置GPIO引脚的高低电平,实现LED流水灯效果 */
GPIO_SetBits(GPIOA, GPIO_Pin_8); // 设置PA8引脚为高电平,点亮LED
Delay_ms(1000); // 延时1000ms
GPIO_ResetBits(GPIOA, GPIO_Pin_8); // 设置PA8引脚为低电平,熄灭LED
Delay_ms(1000); // 延时1000ms
GPIO_SetBits(GPIOA, GPIO_Pin_11); // 设置PA11引脚为高电平,点亮LED
Delay_ms(1000); // 延时1000ms
GPIO_ResetBits(GPIOA, GPIO_Pin_11); // 设置PA11引脚为低电平,熄灭LED
Delay_ms(1000); // 延时1000ms
GPIO_SetBits(GPIOA, GPIO_Pin_12); // 设置PA12引脚为高电平,点亮LED
Delay_ms(1000); // 延时1000ms
GPIO_ResetBits(GPIOA, GPIO_Pin_12); // 设置PA12引脚为低电平,熄灭LED
Delay_ms(1000); // 延时1000ms
}
}
此次代码参考了b站江协科技发布的视频。
流水灯演示视频如下:
stm32流水灯