Stm32F407——跑马灯的实现(3)

通用I/O端口功能函数的设计:
1、提供端口入口
2、设置要配置的引脚
3、设置引脚功能
4.5、如为输出,设置数据驱动方式和速度
6、如为输入,设置上下拉电阻

main.c

#include "delay.h"
#include "sys.h"
#include "led.h"
int main(void)
{
    
    
	Stm32_Clock_Init(336,8,2,7);//系统时钟初始化
	LED_Init();//LED灯初始化
	while(1)
	{
    
    
		LED0 = 0; LED1 = 1; //led0亮led1灭
		delay();
		LED0 = 1; LED1 = 0; //led0灭led1亮
		delay();
	}
}

sys.c(函数内容的设计):

GPIO_Set(GPIOF,(1<<9)|(1<<10),1,0,1,1);//设置GPIOF的第9和10引脚

通用I/O端口功能函数的设计

void GPIO_Set(GPIO_TypeDef *GPIOx,u16 pin,u8 mode,u8 otype,u8 ospeed,u8 pupd)
{
    
    
	u8 pos=0;
	for(pos=0;pos<16;pos++)//1
	{
    
    
		if((1<<pos)&pin)//2
		{
    
    
			GPIOx->MODER &= ~(3<<(pos*2));//3
			GPIOx->MODER |= (mode<<(pos*2));
			if((GPIOx->MODER == 1)||(GPIOx->MODER == 2))//4、5
			{
    
    
				GPIOx->OTYPER  &= ~(1<<pos);
				GPIOx->OTYPER  |= (otype<<pos);
				GPIOx->OSPEEDR &=~(3<<(pos*2));
				GPIOx->OSPEEDR |= (ospeed<<(pos*2));
			}
			GPIOx->PUPDR &= ~(3<<(pos*2));//6
			GPIOx->PUPDR |= (pupd<<(pos*2));
		}
	}
}

led.c

#include "stm32f407.h"
#include "led.h"
#include "typedef.h"
#include "sys.h"
void LED_Init(void)
{
    
    
	RCC_AHB1ENR |= 1<<5;        //使能GPIOF的时钟
	GPIO_Set(GPIOF,(1<<9)|(1<<10),1,0,1,1);//设置GPIOF的第9和10引脚
	LED0 = 1;
	LED1 = 1;
}

led.h

#ifndef _LED_H_
#define _LED_H_
	#include "stm32f407.h"
	#define LED0 PFout(9)
	#define LED1 PFout(10)
	void LED_Init(void);
#endif

定义引脚地址:

#define GPIOF_ODR     0x40021414
#define ALIASADDR(bitbandaddr,bitn) (*(volatile unsigned int*)((bitbandaddr&0xf0000000)+0x2000000+((bitbandaddr&0xfffff)<<5)+(bitn<<2)))
#define PFout(n)  ALIASADDR(GPIOF_ODR, n)
#define GPIOF (GPIO_TypeDef*)0x40021400

猜你喜欢

转载自blog.csdn.net/weixin_53391957/article/details/117421818