眼巴巴瞅了好久的电路图。大致搞明白了
今天一整天就查资料,就晚上写一段代码
- led电路
四个led对应的io分别是PE0,PE1,PE2,PE3.
点亮led,需要设置io成,通用输出,推挽输出,低电平 - 代码
led.c
#include "LED.h"
void led_init(void)
{
//Pe0~4 初始化
RCC->AHB1ENR|=1<<4; //使能PORTF的时钟
GPIO_Set(GPIOE,PIN0|PIN1|PIN2|PIN3,GPIO_MODE_OUT,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU);
}
led.h
#ifndef __LED_H
#define __LED_H
#include "sys.h"
#define LED0 PEout(0)
#define LED1 PEout(1)
#define LED2 PEout(2)
#define LED3 PEout(3)
/**led初始化**/
void led_init(void);
#endif
main.c
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "LED.h"
//ALIENTEK 探索者STM32F407开发板 实验0
//新建工程实验
//技术支持:www.openedv.com
//广州市星翼电子科技有限公司
int main(void)
{
Stm32_Clock_Init(336,8,2,7);//设置时钟,168Mhz
delay_init(168); //初始化延时函数
led_init();
while(1)
{
LED0=0;
LED1=1;
LED2=1;
LED3=1;
delay_ms(500);
LED0=1;
LED1=0;
LED2=1;
LED3=1;
delay_ms(500);
LED0=1;
LED1=1;
LED2=0;
LED3=1;
delay_ms(500);
LED0=1;
LED1=1;
LED2=1;
LED3=0;
delay_ms(500);
}
}
- 函数说明文件
io口设置,直接调用GPIO_Set()函数了,函数原型如下。
//GPIO通用设置
//GPIOx:GPIOA~GPIOI.
//BITx:0X0000~0XFFFF,位设置,每个位代表一个IO,第0位代表Px0,第1位代表Px1,依次类推.比如0X0101,代表同时设置Px0和Px8.
//MODE:0~3;模式选择,0,输入(系统复位默认状态);1,普通输出;2,复用功能;3,模拟输入.
//OTYPE:0/1;输出类型选择,0,推挽输出;1,开漏输出.
//OSPEED:0~3;输出速度设置,0,2Mhz;1,25Mhz;2,50Mhz;3,100Mh.
//PUPD:0~3:上下拉设置,0,不带上下拉;1,上拉;2,下拉;3,保留.
//注意:在输入模式(普通输入/模拟输入)下,OTYPE和OSPEED参数无效!!
void GPIO_Set(GPIO_TypeDef* GPIOx,u32 BITx,u32 MODE,u32 OTYPE,u32 OSPEED,u32 PUPD)
{
u32 pinpos=0,pos=0,curpin=0;
for(pinpos=0;pinpos<16;pinpos++)
{
pos=1<<pinpos; //一个个位检查
curpin=BITx&pos;//检查引脚是否要设置
if(curpin==pos) //需要设置
{
GPIOx->MODER&=~(3<<(pinpos*2)); //先清除原来的设置
GPIOx->MODER|=MODE<<(pinpos*2); //设置新的模式
if((MODE==0X01)||(MODE==0X02)) //如果是输出模式/复用功能模式
{
GPIOx->OSPEEDR&=~(3<<(pinpos*2)); //清除原来的设置
GPIOx->OSPEEDR|=(OSPEED<<(pinpos*2));//设置新的速度值
GPIOx->OTYPER&=~(1<<pinpos) ; //清除原来的设置
GPIOx->OTYPER|=OTYPE<<pinpos; //设置新的输出模式
}
GPIOx->PUPDR&=~(3<<(pinpos*2)); //先清除原来的设置
GPIOx->PUPDR|=PUPD<<(pinpos*2); //设置新的上下拉
}
}
}
- 工程文件:直接用正点原子,探索者的工程模板就可以直接使用。
- 流水灯,漂亮