Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 175|回复: 0

STM32模块学习(基于B站江协科技)3-2 LED流水灯

[复制链接]

3

主题

3

帖子

27

积分

新手上路

Rank: 1

积分
27
发表于 2025-4-23 09:03:09 来自手机 | 显示全部楼层 |阅读模式
接线图如下:
本次用到的库函数与3-1一致

RCC.h说明:

void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState);
使能或者失能AHB外设时钟
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);
APB1,APB2同理,第一个参数选择外设,第二个参数使能或失能

GPIO.h说明(1):

void GPIO_DeInit(GPIO_TypeDef* GPIOx);
:复位GPIO外设
void GPIO_AFIODeInit(void);
:复位AFIO外设
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
:用结构体函数初始化GPIO口。先定义一个结构体变量,再给结构体赋值,最后调用这个函数
void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct);
读(4)
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
:读取输入数据寄存器某一个端口的值,参数用来指定端口,uint8_t 代表这个端口的高低电平
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
:读取整个输入数据寄存器
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
:读取输出寄存器的某一个值(一般用于输出模式,看一下输出了什么)
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
:读取整个输出数据寄存器
写(4)
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
:指定端口为高电平
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
:指定端口为低电平
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
:前两个参数指定端口,BitVal根据第三个参数的值指定端口
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
:第一个参数选择外设,PortVal可以对16个端口写入操作

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);
    }
}


主函数main.c:
#include "stm32f10x.h"                  // Device header
#include "Delay.h"

int main(void)
{
    /*开启时钟*/
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);   
//开启GPIOA的时钟                                                      
//使用各个外设前必须开启时钟,否则对外设的操作无效
   
    /*GPIO初始化*/
    GPIO_InitTypeDef GPIO_InitStructure;                    
    //定义结构体变量
   
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;        
//GPIO模式,赋值为推挽输出模式    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All;               
//GPIO引脚,赋值为所有引脚GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;        
//GPIO速度,赋值为50MHz
   
    GPIO_Init(GPIOA, &GPIO_InitStructure);                  
    //将赋值后的构体变量传递给GPIO_Init函数                                                     
    //函数内部会自动根据结构体的参数配置相应寄存器                                                        
//实现GPIOA的初始化
   
    /*主循环,循环体内的代码会一直循环执行*/
    while (1)
    {
        /*使用GPIO_Write,同时设置GPIOA所有引脚的高低电平,实现LED流水灯*/
        GPIO_Write(GPIOA, ~0x0001);  
        //0000 0000 0000 0001,PA0引脚为低电平,其他引脚均为高电平,注意数据有按位取反
        Delay_ms(100);               
        //延时100ms
        GPIO_Write(GPIOA, ~0x0002);   
        //0000 0000 0000 0010,PA1引脚为低电平,其他引脚均为高电平
        Delay_ms(100);               
        //延时100ms
        GPIO_Write(GPIOA, ~0x0004);  
        //0000 0000 0000 0100,PA2引脚为低电平,其他引脚均为高电平
        Delay_ms(100);               
        //延时100ms
        GPIO_Write(GPIOA, ~0x0008);   
        //0000 0000 0000 1000,PA3引脚为低电平,其他引脚均为高电平
        Delay_ms(100);               
        //延时100ms
        GPIO_Write(GPIOA, ~0x0010);   
        //0000 0000 0001 0000,PA4引脚为低电平,其他引脚均为高电平
        Delay_ms(100);               
        //延时100ms
        GPIO_Write(GPIOA, ~0x0020);   
        //0000 0000 0010 0000,PA5引脚为低电平,其他引脚均为高电平
        Delay_ms(100);              
        //延时100ms
        GPIO_Write(GPIOA, ~0x0040);   
        //0000 0000 0100 0000,PA6引脚为低电平,其他引脚均为高电平
        Delay_ms(100);               
        //延时100ms
        GPIO_Write(GPIOA, ~0x0080);  
        //0000 0000 1000 0000,PA7引脚为低电平,其他引脚均为高电平
        Delay_ms(100);               
        //延时100ms
    }
}

最后的现象为8个LED依次闪烁

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|DiscuzX

GMT+8, 2025-6-8 09:28 , Processed in 0.040726 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表