1、使用Keil创建一个新工程
2、在弹出的对话框,填写工程的名字,例如工程名字为demo_led
3、为保存的工程,选择对应的芯片
4、为当前工程,添加相应的库函数
5、若库函数添加成功,则显示当前工程目录树
6、在当前工程目录下,先创建main.c
7、添加头文件和设置优化等级
8、开始写跑马灯程序
(1)初始化led灯
void led_init()
{
//定义结构体
GPIO_InitTypeDef GPIO_InitStructure1;
//使能AHB1总线上指定外设的硬件时钟,其实就是对外设进行供电 (如果该外设不使用,可以关闭其硬件时钟,降低功耗)
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOF, ENABLE);
GPIO_InitStructure1.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;//9 10号引脚
GPIO_InitStructure1.GPIO_Mode = GPIO_Mode_OUT;//输出模式
GPIO_InitStructure1.GPIO_PuPd = GPIO_PuPd_NOPULL;//推挽类型,Push Pull
GPIO_InitStructure1.GPIO_OType = GPIO_OType_PP;//不使能上下拉电阻
GPIO_InitStructure1.GPIO_Speed = GPIO_Speed_2MHz;//引脚工作速度
GPIO_Init(GPIOF, &GPIO_InitStructure1);//进行初始化
GPIO_InitStructure1.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14;//13 14号引脚
GPIO_Init(GPIOE, &GPIO_InitStructure1);//进行初始化
//初始完硬件之后,默认关闭状态
GPIO_WriteBit(GPIOE, GPIO_Pin_13 | GPIO_Pin_14, Bit_SET);
GPIO_WriteBit(GPIOF, GPIO_Pin_9 | GPIO_Pin_10, Bit_SET);
}
(2) 设置延时
int32_t delay_ms(uint32_t nms)
{
uint32_t t = nms;
uint32_t temp;
while(t--)
{
SysTick->CTRL = 0;
SysTick->LOAD = 21000-1;
SysTick->VAL = 0;
SysTick->CTRL = 1;
while(1)
{
temp=SysTick->CTRL;
//检测count flag
if(temp & 0x00010000)
break;
//检测系统定时器是否意外关闭
if((temp & 0x1)==0)
return -1;
}
}
SysTick->CTRL = 0;
return 0;
}
(3) 实现跑马灯效果循环
void led()
{
GPIO_WriteBit(GPIOE, GPIO_Pin_14 , Bit_SET);
GPIO_WriteBit(GPIOF, GPIO_Pin_9 , Bit_RESET);
delay_ms(100);
GPIO_WriteBit(GPIOF, GPIO_Pin_10 , Bit_RESET);
GPIO_WriteBit(GPIOF, GPIO_Pin_9 , Bit_SET);
delay_ms(100);
GPIO_WriteBit(GPIOF, GPIO_Pin_10 , Bit_SET);
GPIO_WriteBit(GPIOE, GPIO_Pin_13 , Bit_RESET);
delay_ms(100);
GPIO_WriteBit(GPIOE, GPIO_Pin_13 , Bit_SET);
GPIO_WriteBit(GPIOE, GPIO_Pin_14 , Bit_RESET);
delay_ms(100);
}
(4)源程序
#include "stm32f4xx.h"
void led_init()
{
//定义结构体
GPIO_InitTypeDef GPIO_InitStructure1;
//使能AHB1总线上指定外设的硬件时钟,其实就是对外设进行供电 (如果该外设不使用,可以关闭其硬件时钟,降低功耗)
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOF, ENABLE);
GPIO_InitStructure1.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;//9 10号引脚
GPIO_InitStructure1.GPIO_Mode = GPIO_Mode_OUT;//输出模式
GPIO_InitStructure1.GPIO_PuPd = GPIO_PuPd_NOPULL;//推挽类型,Push Pull
GPIO_InitStructure1.GPIO_OType = GPIO_OType_PP;//不使能上下拉电阻
GPIO_InitStructure1.GPIO_Speed = GPIO_Speed_2MHz;//引脚工作速度
GPIO_Init(GPIOF, &GPIO_InitStructure1);//进行初始化
GPIO_InitStructure1.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14;//13 14号引脚
GPIO_Init(GPIOE, &GPIO_InitStructure1);//进行初始化
//初始完硬件之后,默认关闭状态
GPIO_WriteBit(GPIOE, GPIO_Pin_13 | GPIO_Pin_14, Bit_SET);
GPIO_WriteBit(GPIOF, GPIO_Pin_9 | GPIO_Pin_10, Bit_SET);
}
int32_t delay_ms(uint32_t nms)
{
uint32_t t = nms;
uint32_t temp;
while(t--)
{
SysTick->CTRL = 0;
SysTick->LOAD = 21000-1;
SysTick->VAL = 0;
SysTick->CTRL = 1;
while(1)
{
temp=SysTick->CTRL;
//检测count flag
if(temp & 0x00010000)
break;
//检测系统定时器是否意外关闭
if((temp & 0x1)==0)
return -1;
}
}
SysTick->CTRL = 0;
return 0;
}
void led()
{
GPIO_WriteBit(GPIOE, GPIO_Pin_14 , Bit_SET);
GPIO_WriteBit(GPIOF, GPIO_Pin_9 , Bit_RESET);
delay_ms(100);
GPIO_WriteBit(GPIOF, GPIO_Pin_10 , Bit_RESET);
GPIO_WriteBit(GPIOF, GPIO_Pin_9 , Bit_SET);
delay_ms(100);
GPIO_WriteBit(GPIOF, GPIO_Pin_10 , Bit_SET);
GPIO_WriteBit(GPIOE, GPIO_Pin_13 , Bit_RESET);
delay_ms(100);
GPIO_WriteBit(GPIOE, GPIO_Pin_13 , Bit_SET);
GPIO_WriteBit(GPIOE, GPIO_Pin_14 , Bit_RESET);
delay_ms(100);
}
int main()
{
led_init();
while(1)
{
led();
}
}
9、如果要在实体板子上运行效果需要配置以下环境
10、程序最终效果
跑马灯