GPIO与跑马灯实验
STM32学习之GPIO
实战:跑马灯
库函数操作
步骤
- 使能IO口时钟。调用RCC_APB2PeriphClockCmd();
- 初始化IO口模式,调用GPIO_Init();
- 操作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
寄存器操作
步骤
- 使能IO口时钟。配置寄存器RCC_APB2ENR。
- 初始化IO口模式。配置寄存器GPIOxCRH/CRL
- 操作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);
}
}
位带操作
步骤
- 使能IO口时钟。调用RCC_APB2PeriphClockCmd();
- 初始化IO口模式,调用GPIO_Init();
- 操作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);
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)