参考资料:
蓝桥杯嵌入式备赛手册
蓝桥杯嵌入式开发经验分享(3.LED的配置)
总目录:目录
驱动文件的编写与存放
以后此步骤不再单独说明,直接编写了
-
点击新建文件
-
保存在HARDWARE文件夹中,命名为led.c
-
同样的,建立led.h
-
双击左侧Project里的HARDWARE,将led.c添加进工程
-
这样,在main.c中include即可,结构比较清晰方便
LED硬件连接
- 先看电路原理图
- 我们可以看到,8个发光二极管连接到了一个锁存器,当LE引脚为高电平时,D0-D7的电平信号可以直接传到右端给到LED,当LE引脚为低电平的时候,无论D0-D7的电平信号的改变对右端的电平无影响。
- 通过此图可以看出,连接锁存器的D0-D7对应PC8-PC15,使能端LE对应PD2
利用库函数编写LED
led.c
- 首先对led进行初始化
- 函数里的内容我们大部分可以通过例程直接复制,节省时间且确保准确
- 在比赛提供的V3.5库的"Project->STM32F10x_StdPeriph_Examples->GPIO->IOToggle"文件夹下,打开"main.c"
- 直接复制到我们led.c中初始化函数中
- 由于我们用到了PC和PD,因此GPIO初始化时也要初始化GPIOC和GPIOD,给的例程即GPIOD的配置,类似的,配置GPIOC即可
- 因此,我们的LED_Init函数为:
void led_Init()
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = LED_ALL;
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
- 我们也可以编写一个控制函数led_control.c
void led_Control(uint16_t led, uint8_t state)
{
if(state==1)
{
GPIO_ResetBits(GPIOC,led);
GPIO_SetBits(GPIOD,GPIO_Pin_2);
GPIO_ResetBits(GPIOD,GPIO_Pin_2);
}
else if(state==0)
{
GPIO_SetBits(GPIOC,led);
GPIO_SetBits(GPIOD,GPIO_Pin_2);
GPIO_ResetBits(GPIOD,GPIO_Pin_2);
}
}
- 其中GPIO_ResetBits和GPIO_SetBits的原型在我们keil中找到FWLIB下gpio.c下的gpio.h,找到代码最下面
led.h
- led.h中其实没什么好写的,主要是函数的声明
#ifndef __LED_H
#define __LED_H
#include "stm32f10x.h"
//这些可以不写,GPIO库函数也有,一样用
#define LED_ALL GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15
#define LED1 GPIO_Pin_8
#define LED2 GPIO_Pin_9
#define LED3 GPIO_Pin_10
#define LED4 GPIO_Pin_11
#define LED5 GPIO_Pin_12
#define LED6 GPIO_Pin_13
#define LED7 GPIO_Pin_14
#define LED8 GPIO_Pin_15
void led_Init(void);
void led_Control(u16 led, u8 state);
#endif
主函数调用
- 只需要通过led_Control函数即可实现调用
跑马灯的实现
int main(void)
{
u8 i;
SysTick_Config(SystemCoreClock/1000);
led_Init();
while(1)
{
for(i=8;i<16;i++)
{
led_Control(1<<i,1);
Delay_Ms(1000);
}
for(i=15;i>=8;i--)
{
led_Control(1<<i,0);
Delay_Ms(1000);
}
Delay_Ms(1000);
}
}