STM32跑马灯编写教程详解

一、创建项目

新建一个文件夹,打开KeiL,projiece—–new vision projection

 给文件命名(随便取)

 根据自己开发板的信号选择对应的型号

 在刚才创建的文件夹里面新建一个main.c文件

 双击source group 1,点击main.c,点击add

 添加头文件

 二、编写代码

led.c

#include "led.h"
#include <stm32f4xx.h>
//初始化小灯
void LED_init(void)
{
	
	GPIO_InitTypeDef GPIO_InitStruct;//定义结构体
	 
	//1.Enable the GPIO AHB clock,使能时钟GPIOx,
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF|RCC_AHB1Periph_GPIOE, ENABLE);
	
	//2.Configure the GPIO pin(s),配置GPIO引脚
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10;	//led0和led1对应的IO口
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;			//普通输出模式
	GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;			//推挽输出
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
	GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;			//上拉
	GPIO_Init(GPIOF,&GPIO_InitStruct);					//初始化GPIOF9,F10
	
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14;	//led3和led4对应的IO口
	GPIO_Init(GPIOE,&GPIO_InitStruct);
	
	//3.输出高电平
	GPIO_SetBits(GPIOF,GPIO_Pin_9);
	GPIO_SetBits(GPIOF,GPIO_Pin_10);
	GPIO_SetBits(GPIOE,GPIO_Pin_13);
	GPIO_SetBits(GPIOE,GPIO_Pin_14);

}

main.c

#include <stm32f4xx.h>
#include "led.h"

void delay(void)
{
	int a = 0xffffff;
	while(a--);

}


void delay_us(uint32_t nus)
{
	uint32_t temp;	 
	
	SysTick->CTRL = 0; // 关闭系统定时器
	SysTick->LOAD = nus*21; //设置重装置寄存器的值,设置计数值
	SysTick->VAL = 0; // 设置当前数值寄存器的值为0
	SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; //使能定时器
	
	do
	{
		temp=SysTick->CTRL;
	}while((temp&0x01)&&!(temp&(1<<16)));			//等待时间到达 
	
	SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; 		//关闭计数器
	SysTick->VAL =0X00;    
	
}

void delay_ms(int nms)   //毫秒
{
    uint32_t m,n;
    m = nms/500;

    n = nms%500;
    while(m--)
    {
        SysTick->LOAD = (SystemCoreClock/8/1000) * 500;		//定时时间
        
        SysTick->CTRL |= 1;							//开启定时器,开始计数
        
        while((SysTick->CTRL & (1<<16)) == 0);		//等待定时时间到
        
        SysTick->CTRL &=~1;							//关闭定时器
    }
    if(n)
    {
        SysTick->LOAD = (SystemCoreClock/8/1000) * n;		//定时时间
        
        SysTick->CTRL |= 1;							//开启定时器,开始计数
        
        while((SysTick->CTRL & (1<<16)) == 0);		//等待定时时间到
        
        SysTick->CTRL &=~1;							//关闭定时器
    }	
}

int main(void)
{
	
	LED_init();
	while(1)
	{
		GPIO_ResetBits(GPIOF,GPIO_Pin_9);
		GPIO_ResetBits(GPIOF,GPIO_Pin_10);
		GPIO_ResetBits(GPIOE,GPIO_Pin_13);
		GPIO_ResetBits(GPIOE,GPIO_Pin_14);
		delay_ms(500);
		GPIO_SetBits(GPIOF,GPIO_Pin_9);
		GPIO_SetBits(GPIOF,GPIO_Pin_10);
		GPIO_SetBits(GPIOE,GPIO_Pin_13);
		GPIO_SetBits(GPIOE,GPIO_Pin_14);
		delay_ms(500);
		
	}
	
	return 0;
}

led就可以全亮然后全灭一直循环

物联沃分享整理
物联沃-IOTWORD物联网 » STM32跑马灯编写教程详解

发表评论