1、新建工程,和之前一样
2、选择芯片的型号,这是选择的是STM32mp157daax,点击next
3、给工程定一个名称,不要用中文
4、选择NO
5、按如图所示的方式配置引脚,前面的文章有配置的过程
6、在工程管理处勾选生成.c/.h文件
7、在M4内核的文件夹下新建文件夹BSP(其他名称也可以,不要用中文)
8、在BSP文件夹下新建名为Include和src的文件夹,做好文件分层,并在这两个文件夹下新建3个.c的文件以及它们的头文件
9、右键M4文件夹选择最后一个属性配置选项
10、在弹出的窗口中选择c/c++ General中的Paths and Symbols并选择Source Location选择右边的Add Folder...将BSP文件夹加入工程中,点击Apply and Close保存配置并关闭
11、贴上代码
led.h:
#ifndef __LED_H
#define __LED_H
#include "gpio.h"
#define LED0(x) {(x==0)?(HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_RESET)):(HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_SET));}
#define LED1(x) {(x==0)?(HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_RESET)):(HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET));}
#define LED0_T HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin);
#define LED1_T HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);
void led_init(void);
#endif
led.c
#include "../Include/led.h"
void led_init(void)
{
LED0(1); //init led0 and led1,close them.
LED1(1);
}
beep.h:
#ifndef __BEEP_H
#define __BEEP_H
#include "gpio.h"
#define BEEP(x) {(x==0)?(HAL_GPIO_WritePin(BEEP_GPIO_Port, BEEP_Pin, GPIO_PIN_RESET)):(HAL_GPIO_WritePin(BEEP_GPIO_Port, BEEP_Pin, GPIO_PIN_SET));}
#define BEEP_T HAL_GPIO_TogglePin(BEEP_GPIO_Port, BEEP_Pin);
void beep_init(void);
#endif
beep.c:
#include "../Include/beep.h"
void beep_init(void)
{
BEEP(1); //init beep,close it.
}
key.h:
#ifndef __KEY_H
#define __KEY_H
#include "gpio.h"
#define KEY0_RET 1
#define KEY1_RET 2
#define KEY2_RET 3
#define KEY_UP 1
#define KEY_DOWN 0
#define KEY0_VAL HAL_GPIO_ReadPin(KEY0_GPIO_Port,KEY0_Pin)
#define KEY1_VAL HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin)
#define KEY2_VAL HAL_GPIO_ReadPin(WKUP_GPIO_Port,WKUP_Pin)
int8_t key_scan(int8_t mode);
#endif
key.c:
#include "../Include/key.h"
#include "../Include/beep.h"
#include "../Include/led.h"
int ret;
/*
#define KEY0_RET 1
#define KEY1_RET 2
#define KEY2_RET 3
#define KEY_UP 1
#define KEY_DOWN 0
#define KEY0_VAL HAL_GPIO_ReadPin(KEY0_GPIO_Port,KEY0_Pin);
#define KEY1_VAL HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin);
#define KEY2_VAL
*/
int8_t key_scan(int8_t mode) //mode = 0 : if keep press the button,it will output value until released,1: it will output a value until you released.
{
ret = 0;
if(KEY0_VAL == KEY_DOWN)
{
HAL_Delay(10);
if(KEY0_VAL == KEY_DOWN)
{
if(mode == 1){
while(KEY0_VAL == KEY_DOWN);
}
ret=KEY0_RET;
}
}
else if(KEY1_VAL == KEY_DOWN)
{
HAL_Delay(10);
if(KEY1_VAL == KEY_DOWN)
{
if(mode == 1){
while(KEY1_VAL == KEY_DOWN);
}
ret=KEY1_RET;
}
}
else if(KEY2_VAL == KEY_UP)
{
HAL_Delay(10);
if(KEY2_VAL == KEY_UP)
{
if(mode == 1){
while(KEY2_VAL == KEY_UP);
}
ret=KEY2_RET;
}
}
return ret;
}
main.c:只贴出中间需要修改的段
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "gpio.h"
#include "../../BSP/Include/led.h"
#include "../../BSP/Include/beep.h"
#include "../../BSP/Include/key.h"
int8_t key_val;
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
/* USER CODE END PTD */
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */
/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
/* USER CODE END PM */
/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
/* USER CODE END PFP */
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
/* USER CODE END 0 */
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
if(IS_ENGINEERING_BOOT_MODE())
{
/* Configure the system clock */
SystemClock_Config();
}
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
/* USER CODE BEGIN 2 */
led_init();
beep_init();
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
key_val = key_scan(1);
if(key_val)
{
switch(key_val)
{
case KEY0_RET:
LED0_T;
break;
case KEY1_RET:
LED1_T;
break;
case KEY2_RET:
BEEP_T;
break;
}
}
else
HAL_Delay(10);
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
有时间再更新中断点灯的配置方法