使用STM32F407xx的GPIO引脚实现跑马灯效果的详细步骤
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 PullGPIO_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 flagif(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 PullGPIO_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 flagif(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、程序最终效果
跑马灯