GPIO与跑马灯实验

STM32学习之GPIO

实战:跑马灯

库函数操作

步骤

  1. 使能IO口时钟。调用RCC_APB2PeriphClockCmd();
  2. 初始化IO口模式,调用GPIO_Init();
  3. 操作IO口,输出高低电平。
    GPIO_SetBits();GPIO_ResetBits();

代码

main.c

#include "stm32f10x.h"
#include "sys.h"
#include "delay.h"
#include "led.h"

int main(void)
{
    LED_Init();
    delay_init();
    
    while(1)
    {
        GPIO_ResetBits(GPIOA,GPIO_Pin_8);
        GPIO_SetBits(GPIOD,GPIO_Pin_2);
        delay_ms(1000);
        GPIO_ResetBits(GPIOD,GPIO_Pin_2);
        GPIO_SetBits(GPIOA,GPIO_Pin_8);
        delay_ms(1000);
    }
}


led.c

#include "led.h"
#include "stm32f10x.h"

void LED_Init(void) //PA8 PD2
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD,ENABLE);//初始化GPIO时钟
    GPIO_InitTypeDef IOInitStruct;//定义GPIO初始化结构体
    IOInitStruct.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
    IOInitStruct.GPIO_Pin = GPIO_Pin_8; //设置PA8
    IOInitStruct.GPIO_Speed = GPIO_Speed_50MHz; //速度为50MHZ
    
    GPIO_Init(GPIOA,&IOInitStruct); //执行PA8初始化函数
    
    IOInitStruct.GPIO_Pin = GPIO_Pin_2; //设置PD2
    GPIO_Init(GPIOD,&IOInitStruct); //执行PD2初始化函数
    return;
}


led.h

#ifndef __LED_H
#define __LED_H

void LED_Init(void);



#endif

寄存器操作

步骤

  1. 使能IO口时钟。配置寄存器RCC_APB2ENR。
  2. 初始化IO口模式。配置寄存器GPIOxCRH/CRL
  3. 操作IO口,输出高低电平。配置寄存器GPIOx_ODR或者BSRR/BRR

代码

led.c

#include "led.h"
#include "stm32f10x.h"

void LED_Init(void) //A8 D2口时钟与工作方式初始化设置
{
    RCC->APB2ENR |= (1<<5|1<<2); //使能IO口时钟
    GPIOA->CRH &= 0xFFFFFFF0; 
    GPIOA->CRH |= 0x00000003;
    //A8口设置为推挽输出
    GPIOA->ODR |= (1<<8);
    //A8口设置为高电平熄灭
    
    GPIOD->CRL &= 0XFFFFF0FF;
    GPIOD->CRL |= 0X00000300;
    //D2口设置为推挽输出
    GPIOD->ODR |= (1<<2);
    //A8口设置为高电平熄灭
    return;
}

led.h

#ifndef __LED_H

#define __LED_H

void LED_Init();

#endif

main.c

#include "stm32f10x.h"
#include "led.h"
#include "delay.h"

int main(void)
{
    delay_init();
    LED_Init();
    
    while(1)
    {
        GPIOA->ODR = ~(1<<8); //点亮A8
        GPIOD->ODR |= (1<<2); //熄灭D2
        delay_ms(1000);
        GPIOA->ODR |= (1<<8); //熄灭A8
        GPIOD->ODR = ~(1<<2); //点亮D2
        delay_ms(1000);
    }

}


位带操作

步骤

  1. 使能IO口时钟。调用RCC_APB2PeriphClockCmd();
  2. 初始化IO口模式,调用GPIO_Init();
  3. 操作IO口,输出高低电平。使用位带操作。

代码

#include "stm32f10x.h"
#include "sys.h"
#include "delay.h"

int main(void)
{
    delay_init();
    LED_Init();
    
    while(1)
    {
        PDout(2) = 1;
        PAout(8) = 0;
        delay_ms(500);
        PDout(2) = 0;
        PAout(8) = 1;
        delay_ms(500);
    }
}


posted @   安河桥北i  阅读(107)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示