首先,在上一节的模板基础上建立一个新的Keil工程,取名为LED。打开main.c函数,可以直接在这里写代码,当然也可以重新建立.c文件,这里我们直接在main文件中写程序。第一步,也是最重要的一步就是配置作为输出的IO口,代码如下:
GPIO_InitTypeDef GPIO_Structure; //定义GPIO结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE); //使能PEIO口的时钟
GPIO_Structure.GPIO_Pin = GPIO_Pin_9; //结构体引脚为PE9
GPIO_Structure.GPIO_Mode = GPIO_Mode_Out_PP; //设置为推挽输出
GPIO_Structure.GPIO_Speed = GPIO_Speed_50MHz; //IO口翻转速度设置为50MHz
GPIO_Init(GPIOE,&GPIO_Structure); //初始化PE9引脚
这里只设置了一个PE9引脚,其他引脚的设置类似,只需改变GPIO_Pin_x然后初始化即可,如下:
GPIO_Structure.GPIO_Pin = GPIO_Pin_11;
GPIO_Init(GPIOE,&GPIO_Structure);
GPIO_Structure.GPIO_Pin = GPIO_Pin_13;
GPIO_Init(GPIOE,&GPIO_Structure);
GPIO_Structure.GPIO_Pin = GPIO_Pin_15;
GPIO_Init(GPIOE,&GPIO_Structure);
将以上初始化IO口的代码封装成一个函数命名为LED_init():
void Led_init(void)
{
GPIO_InitTypeDef GPIO_Structure; //定义GPIO结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE); //使能PEIO口的时钟
GPIO_Structure.GPIO_Pin = GPIO_Pin_9; //结构体引脚为PE9
GPIO_Structure.GPIO_Mode = GPIO_Mode_Out_PP; //设置为推挽输出
GPIO_Structure.GPIO_Speed = GPIO_Speed_50MHz; //IO口翻转速度设置为50MHz
GPIO_Init(GPIOE,&GPIO_Structure); //初始化PE9引脚
GPIO_Structure.GPIO_Pin = GPIO_Pin_11;
GPIO_Init(GPIOE,&GPIO_Structure);
GPIO_Structure.GPIO_Pin = GPIO_Pin_13;
GPIO_Init(GPIOE,&GPIO_Structure);
GPIO_Structure.GPIO_Pin = GPIO_Pin_15;
GPIO_Init(GPIOE,&GPIO_Structure);
}
然后需要一个延时函数,控制LED等亮与灭的时间间隔:
void Delay(int n)
{
while(n--)
; //学过51的人都明白
}
至此,驱动LED的程序代码基本已经完成,为了更方便的调用,我们定义一些宏:
#define LED1_ON() GPIO_SetBits(GPIOE,GPIO_Pin_13) //LED1置位
#define LED1_OFF() GPIO_ResetBits(GPIOE,GPIO_Pin_13) //LED1复位
#define LED2_ON() GPIO_SetBits(GPIOE,GPIO_Pin_9)
#define LED2_OFF() GPIO_ResetBits(GPIOE,GPIO_Pin_9)
#define LED3_ON() GPIO_SetBits(GPIOE,GPIO_Pin_15)
#define LED3_OFF() GPIO_ResetBits(GPIOE,GPIO_Pin_15)
#define LED4_ON() GPIO_SetBits(GPIOE,GPIO_Pin_11)
#define LED4_OFF() GPIO_ResetBits(GPIOE,GPIO_Pin_11)
好了,要LED等怎么闪烁就看你怎么调用这些宏了,实现流水灯的调用如下:
int main()
{
//SystemInit();
Led_init(); //初始化LED等所用的IO口
while(1)
{
LED1_ON();LED2_OFF();LED3_OFF();LED4_OFF();
Delay(0x8ffff);
LED1_OFF();LED2_ON();LED3_OFF();LED4_OFF();
Delay(0x8ffff);
LED1_OFF();LED2_OFF();LED3_ON();LED4_OFF();
Delay(0x8ffff);
LED1_OFF();LED2_OFF();LED3_OFF();LED4_ON();
Delay(0x8ffff);
}
}
对于SystemInit()函数,在启动代码中已经调用过,那么在main函数中无需再调用,如果使用的固件库版本比较低,启动代码中没有调用,那么main函数中就需要调用了。好了,我们看一下运行的效果怎么样:
上一篇:STM32外部中断程序
下一篇:基于STM32单片机,FLASh先擦后写的函数分析案例
推荐阅读最新更新时间:2024-11-11 19:19
设计资源 培训 开发板 精华推荐
- 用于 NCP3063 1.5A 升压开关稳压器的带有外部 NMOS 晶体管的典型升压应用原理图
- 采用 LTC1387 的 5V RS232/RS485 多协议收发器参考设计
- LT3484EDCB-1 演示板,闪光灯充电器,Vin=2.8V-4.2V,Vbat=1.8V-4.2V,5V 最大值
- LTC3531-3.3,锂离子至 3.3V 原理图和 100mA 效率曲线
- NCN4557EVB,销售点终端适配卡评估套件
- OM11036: Keil LPC1758评估板
- 用于工业应用的 LT3973EDD-3.3 5V 降压转换器的典型应用
- 用于双极输入的单电源直流耦合 16 位、125 MSPS 模拟前端
- 具有电源排序功能的 LTC3589HUJ-1 8 输出稳压器的典型应用电路
- LT6656AIS6-3.3、3.3V 电压基准作为微功率稳压器的典型应用