STM32
直播中

h1654155275.5614

7年用户 731经验值
私信 关注
[问答]

如何利用STM32F407实现跑马灯实验?

如何利用STM32F407实现跑马灯实验?

回帖(1)

刘欢

2021-11-17 11:28:15
1、跑马灯实验
操作步骤:
①建立hardware文件夹,在其中建立led子文件夹,建立led.h、led.c
②编写led.h,


#ifndef __LED_H
#define __LED_H
#define LED0 PFout(9)//F9
#define LED0 PFout(10)//F10
void LED_Init(void);
                                       
#endif       


首先要懂得ifndef define endif这个结构
void LED_Init(void) 是led的初始化函数,在头文件里先声明,然后在.c文件中直接定义、应用就行了;
PFout(9)这个是位带操作(说实话,不太懂)
③编写led.c文件


#include "led.h"
void LED_Init(void)
{             
  GPIO_InitTypeDef  GPIO_InitStructure;//定义一个结构体


  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);//使能GPIO时钟
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;//LED0和LED1对应的IO口
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//输出模式
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化IO口
       
GPIO_SetBits(GPIOF,GPIO_Pin_9 | GPIO_Pin_10);//GPIOF9,F10设置为高电平,灯灭


}


④编写主函数


#include
#include
int main (void)
{
delay_init(168);
LED_Init();
/*这是通过位带操作完成的*/
while(1)
        {
        LED0=0;
        LED1=0;
        delay_ms(500);
        LED0=1;
        LED1=1;
        delay_ms(500);
        }
}
//下面的是通过库函数来实现的(较常用)


whlie(1)
{
GPIO_ResetBits(GPIOF,GPIO_Pin_9 | GPIO_Pin_10);//PIOF9,F10设置为低电平,灯亮
delay_ms(500);
GPIO_SetBits(GPIOF,GPIO_Pin_9 | GPIO_Pin_10);//PIOF9,F10设置为高电平,灯灭
delay_ms(500);
}

2.按键输入实验
操作步骤
①编写key.h文件


#ifndef __KEY_H
#define __KEY_H
/*下面是通过库函数来读取IO口*/
#define key0 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)
#define key1 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)
#define key2 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)
#define key_up GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)
/*只是通过位带操作来读取IO口
#define key0                 PEin(4)           //PE4
#define key1                 PEin(3)                //PE3
#define key2                 PEin(2)                //P32
#define key_up                 PAin(0)                //PA0
*/
void KEY_Init(void);//初始化IO口
u8 KEY_Scan(u8)//按键扫描


#define KEY0_PRES         1
#define KEY1_PRES        2
#define KEY2_PRES        3
#define WKUP_PRES   4


#endif


②编写key.c函数


#include
#include
#include
void KEY_Init(void)
{
GPIO_InitTypeDef key;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOE,ENBALE);//使能时钟
key.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4; //KEY0 KEY1 KEY2对应引脚
key.GPIO_Mode = GPIO_Mode_IN;//普通输入模式
key.GPIO_Speed = GPIO_Speed_100MHz;//100M
key.GPIO_PuPd = GPIO_PuPd_UP;//上拉输入
GPIO_Init(GPIOE,&key);//初始化GPIOE2、E3、E4


key.GPIO_Pin = GPIO_Pin_0;//key——up对应的引脚
key.GPIO_PuPd = GPIO_PuPd_DOWN;//下拉输入
GPIO_Init(GPIOA,&key);//初始化GPIOA0
}
//按键处理函数
//返回按键值
//mode 0不支持连续按,1支持连续按
//0,没有任何按键按
//1,key0按下
//2,key1按下
//3,key2按下
//4,key_up按下
//注意此函数有响应优先级,key0>key1>key2>key_up
u8 KEY_Scan(u8 mode)
{
static        u8 key_up=1//按键松开标志
if (mode)        u8 key_up=1
if(key_up&&(KEY0==0||KEY1==0||KEY2==0||WK_UP==1))
        {
                delay_ms(10);/消抖
                key_up=0;
                if(KEY0==0)return 1;
                else if(KEY1==0)return 2;
                else if(KEY2==0)return 3;
                else if(WK_UP==1)return 4;
        }
        else if(KEY0==1&&KEY1==1&&KEY2==1&&WK_UP==0)
                key_up=1;             
        return 0;//没有按键输入


③编写主函数


#include
#include
#include
int main()
{
u8 flag;
KEY_Init();
LED_Init();
while(1)
        {
        flag=KEY_Scan(0);
        switch(flag)
                {
                case key0:
                                 LED0=!LED0;//led0翻转
                                 break;
                case key1:
                                 LED1=!LED1;//led1翻转
                                 break;
                case key2:
                                 LED0=!LED0;//led0翻转
                                 LED1=!LED1;//led1翻转
                                 break;
                }
        }
}


3、串口通信实验
①编写usart.h


#ifndef __USART_H
#define __USART_H
void my_USART_Init(void);//usart1串口的初始化
void USART1_IRQHandler(void);//usart1的中断服务程序


#endif


②编写usart.c


#include
#include
void my_USART_Init(void)
{
GPIO_InitTypeDef led0;
USART_InitTypeDef        Usart1;
NVIC_InitTypeDef NVIC0;
//使能串口
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
//串口1对应引脚复用映射
GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);
//USART端口配置
led0.GPIO_Mode=GPIO_Mode_AF;
led0.GPIO_OType=GPIO_OType_PP;
led0.GPIO_Pin=GPIO_Pin_9|GPIO_Pin_10;
led0.GPIO_PuPd=GPIO_PuPd_UP;
led0.GPIO_Speed=GPIO_Speed_100MHz;
GPIO_Init(GPIOA,&led0);
//USART1初始化设置
Usart1.USART_BaudRate=9600;//波特率
Usart1.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//无硬件数据流控制
Usart1.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;//收发模式
Usart1.USART_Parity=USART_Parity_No;//无奇偶位校验
Usart1.USART_StopBits=USART_StopBits_1;//1位停止位
Usart1.USART_WordLength=USART_WordLength_8b;//字长为8的数据格式
USART_Init(USART1,&Usart1);//初始化USART串口
//使能USART串口
USART_Cmd(USART1,ENABLE);
//开启相关中断
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
//USART1 NVIC配置
NVIC0.NVIC_IRQChannel=USART1_IRQn;//串口1中断通道
NVIC0.NVIC_IRQChannelCmd=ENABLE;//开启中断
NVIC0.NVIC_IRQChannelPreemptionPriority=1;//设置抢占优先级
NVIC0.NVIC_IRQChannelSubPriority=1;//设置子优先级
NVIC_Init(&NVIC0);        //根据指定的参数初始化NVIC寄存器
}
//串口1中断服务程序
void USART1_IRQHandler(void)
{
u8 res;
if(USART_GetITStatus(USART1,USART_IT_RXNE))
{
        res=USART_ReceiveData(USART1);//接受发送过来的数据
        if(res=='a')
                LED0=!LED0;//LED0反转
        if(res=='b')
                LED1=!LED1;//LED1反转
}       
}


③编写主函数


#include
#include
#include
int main()
{
//设置优先级分组
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
LED_Init();
my_USART_Init();
LED0=0;
LED1=0;
while(1);
}
举报

更多回帖

发帖
×
20
完善资料,
赚取积分