通用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