GPIO口编程,最基础的知识,复制别人的

嵌入式开发里面的 LED点灯 相当于 C语言的Hello World

STM32 GPIO 口名称: PA PB PC .... PF PG ...   一般每个端口有16个引脚(每个引脚对应一个GPIO口)

1.查看电路图

LED0 ---> PF9 

LED1 ---> PF10

2.如何控制GPIO口的高低电平

软件控制硬件:配置寄存器来控制硬件工作。

软件控制硬件:配置寄存器来控制硬件工作。

需要配置的寄存器:(手册GPIO)

端口模式寄存器(GPIO_MODER):用来设置GPIO口的工作模式

上拉/下拉电阻寄存器(GPIO_PUPDR):设置上拉/下拉电阻

输出数据寄存器(GPIO_ODR):每个bit用来设置一个引脚的高低电平

/* myled.c
 GPIO LED驱动
LED0 --> PF9
LED1 --> PF10
*/
 
#include"sys.h"
/*
初始化PF9 PF10为输出工作模式
上拉电阻使能 初始化为高电平
推挽输出方式
*/
void InitLedGpio(void)
{	//打开GPIOF的时钟信号
	RCC->AHB1ENR |= (0x1<<5);
	//设置PF9-10为输出工作方式
	GPIOF->MODER &= (~(0xf<<18));//左移8位,按位取反,使清零
	GPIOF->MODER |= (0x5<<18);   //置0101
	
	//配置PF9-10 为推挽工作模式
	GPIOF->OTYPER &= (~(0x3<<9));
	
	//配置PF9-10 上拉电阻使能
	GPIOF->PUPDR &= (~(0xf<<18));
	GPIOF->PUPDR |= (0x5<<18);
	
	GPIOF->ODR |= (0x3<<9);
}
 
//打开LED灯,PF9-10 设为低电平
void TurnOnLed(void)
{
	GPIOF->ODR &= (~(0x3<<9));
}
//打开LED灯,PF9-10 设为高电平
void TurnOffLed(void)
{
	GPIOF->ODR |= (0x3<<9);
}

main函数写在下面时钟设置里

工程结构:

==========================================================================

时钟设置:

/*
main.c
*/

#include"sys.h"
#include"usart.h"
#include"delay.h"
#include<stdio.h>
int count = 0;

//声明LED相关函数

void InitLedGpio(void);
void TurnOnLed(void);
void TurnOffLed(void);
int main(void)
{
	/*
	//init sys clock
	*/
	Stm32_Clock_Init(336,8,2,7);
	
	//init sys 
	delay_init(168);
	
	//
	uart_init(84,115200);
	InitLedGpio();
	while(1){
		delay_ms(300);
		TurnOnLed();
		delay_ms(500);
		TurnOffLed();
		delay_ms(200);
		printf("this is my first programn");
	}
	
	return 0;
}

注释乱码了,上截图

时钟设置原理图:

猜你喜欢

转载自blog.csdn.net/f12345789123/article/details/87861409