自学内容网 自学内容网

基于STM32F407VGT6芯片----跑马灯实验

一、在STM32F407VGT6芯片中配置GPIO环境

  • 对于一个跑马灯实验,首先,要了解的就是,芯片是如何构造出来的,设计GPIO引脚:根据原理图, PC4,PC5,PC6,PC7 为 LED 输出控制管脚,PE0 为蜂鸣器输出控制管脚, 配置为 GPIO_Output 输出模式, PA0,PE2,PE3,PE4 为按键输入管脚,配置为 GPIO_Input 输 入模式。

  • 外射配置:

                        以 LED1 配置为例,点击 PC4,选择模式为 GPIO_Output 模式,LED1 的负极接 PC4 引 脚,所以,PC4 为高电平时 LED 熄灭,这里 PC4 的 output level 选择高电平,即上电复位 后 PC4 位高电平,默认为熄灭,把 User Label 标记为 LED1,同理 PC5、PA6、PA7 做同样 的选择和配置。 蜂鸣器引脚为 PE0,根据原理图高电平时蜂鸣器有电,低电平时蜂鸣器截止,因此 output level 配置为 low 低电平,上电保持截止,user label 标记为 BUZ。

  • 工程配置:

                          设置一个文件夹,生成代码。

二、在keil中配置代码的生成环境

  • 然后,就来到了Keil配置环境中:

设置跑马灯的代码,设置四个文件:<led.h>,<led.c>,<key.h>,<key.c>

代码实现为:

  • 接下来在 led.c 文件中添加 LED1-LED4 的管脚的数组变量和三个函数代码:

//接下来在 led.c 文件中添加 LED1-LED4 的管脚的数组变量和三个函数代码
 GPIO_TypeDef* GPIO_PORT[] = {LED1_GPIO_Port, 
 LED2_GPIO_Port, 
 LED3_GPIO_Port, 
 LED4_GPIO_Port}; 
 
 const uint16_t GPIO_PIN[] = {LED1_Pin, 
 LED2_Pin, 
 LED3_Pin, 
 LED4_Pin}; 
uint16_t buzDs = 0; 
void LED_On(Led_TypeDef Led) 
 { 
 HAL_GPIO_WritePin(GPIO_PORT[Led], GPIO_PIN[Led], 
GPIO_PIN_RESET); 
 } 
 void LED_Off(Led_TypeDef Led) 
 { 
 HAL_GPIO_WritePin(GPIO_PORT[Led], GPIO_PIN[Led], 
GPIO_PIN_SET); 
 } 
 void LED_Toggle(Led_TypeDef Led) 
 { 
 HAL_GPIO_TogglePin(GPIO_PORT[Led], GPIO_PIN[Led]); 
 }
void BUZ_On(void) 
 { 
 HAL_GPIO_WritePin(BUZ_GPIO_Port, BUZ_Pin, GPIO_PIN_SET); 
 } 
 void BUZ_Off(void) 
 { 
 HAL_GPIO_WritePin(BUZ_GPIO_Port, BUZ_Pin, GPIO_PIN_RESET); 
 } 
void BUZ_Prc(void) 
 { 
 if(buzDs) 
 { 
 BUZ_On(); 
 buzDs--; 
 } 
 else BUZ_Off(); 
 }  
  • 在 led.h 前面添加 Led_TypeDef 枚举类型。声明刚才添加的 2 个函数、会在 mian.c 中调用:在 key.c 中编写按键扫描和按键处理的代码

//在 led.h 前面添加 Led_TypeDef 枚举类型。声明刚才添加的 2 个函数、会在 mian.c 中调用 
#ifndef __LED_H__ 
#define __LED_H__ 
#include "main.h" 
/************************************************************* 
 用户自定义数据类型 
**************************************************************/ 
typedef enum 
 { 
 LED1 = 0, 
 LED2 = 1, 
 LED3 = 2, 
 LED4 = 3, 
 LED_NO = 4 
 }Led_TypeDef; 
 extern uint16_t Select_DelayT ; 
 extern uint16_t Select_Dir ; 
/******************************* 
本模块提供给外部调用的函数 
*********************************/ 
void LED_Prc(void); 
void BUZ_Prc(void); 
#endif 
  • 在 key.h 中,定义几个宏定义:

//在 key.h 中,定义几个宏定义
#ifndef __KEY_H__ 
 
定义指示灯序号的数据类型,使用枚举类型 
实现,包括 LED1——LED4 四个枚举常量,用来 
表示四个 LED 灯 
 避免头文件的重复包含 
 
提供给外部使用的函数声明 
蜂鸣器控制函数 
存放的都是 LED 灯 
控制引脚  
#define __KEY_H__ 
#include "main.h" 
 
typedef enum 
 { 
 KEY1 = 0, 
 KEY2 = 1, 
 KEY3 = 2, 
 KEY4 = 3 
 }Key_TypeDef; 
extern uint16_t buzDs ;
 
#define READ_KEY1 (HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin)) 
#define READ_KEY2 (!HAL_GPIO_ReadPin(KEY2_GPIO_Port, KEY2_Pin)) 
#define READ_KEY3 (!HAL_GPIO_ReadPin(KEY3_GPIO_Port, KEY3_Pin)) 
#define READ_KEY4 (!HAL_GPIO_ReadPin(KEY4_GPIO_Port, KEY4_Pin)) 
void KEY_Prc(void); 
#endif 

  • 在 key.c 中编写按键扫描和按键处理的代码

//在 key.c 中编写按键扫描和按键处理的代码 
uint8_t keyScan(void) 
 { 
 static uint8_t pressed =0; 
 static uint8_t keyCnt = 0; 
 uint8_t key_num = 0; 
 if(( READ_KEY1 || READ_KEY2 || READ_KEY3 || READ_KEY4) && (pressed ==1)) 
 { 
 if(keyCnt < 5) keyCnt++; 
 else 
 { 
 if(READ_KEY1) 
 { 
 pressed =0; 
 key_num = 1; 
 } 
 else if(READ_KEY2) 
{ 
 pressed =0; 
 key_num = 2; 
 } 
 else if(READ_KEY3) 
 { 
 pressed =0; 
 key_num = 3; 
 } 
 else if(READ_KEY4) 
 { 
 pressed =0; 
 key_num = 4; 
 } 
 } 
 } 
 if( !READ_KEY1 && !READ_KEY2 && !READ_KEY3 && !READ_KEY4 &&(pressed == 0)) 
 { 
 pressed =1; 
 keyCnt = 0; 
 } 
 return key_num; 
 } 
void KEY_Prc(void) 
 { 
 uint8_t key_val = 0; 
 key_val = keyScan(); 
 if(key_val != 0) buzDs = 10; 
 switch(key_val) 
 { 
 case 1: 
 Select_Dir ^= 1; 
 break; 
 case 2:
Select_DelayT = 10; 
 break; 
 case 3: 
 Select_DelayT = 50; 
 break; 
case 4: 
 Select_DelayT = 100; 
 default: 
 break; 
 } 
 } 
  • 值得注意的是:必须在.c文件中加入对应的.h文件。

  • 最后,在<main.c>中加入

uint32_t startTimeTick = 0; 
 uint32_t endTimeTick = 0;
  • 至此,在keil中的代码文件都相继完成了。

三、在Proteus中配置模拟环境

  • 接下来,就需要配置模拟环境了。这里就需要用到:

  • 其对应的图片是:

  • 最后就能跑起来了。纵观整个过程,其最难的部分就是keil写代码的部分了。

原文地址:https://blog.csdn.net/J15212630255/article/details/143077686

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!