实验环境:
CUBEMX、keil
实验目的:
使用GPIO对单片机驱动二极管通电,以轮询的方式对按键电路进行检测,实现点灯的目的
实验步骤
使用cubemx对代码进行初始化,以便在HAL库的基础上只需完成对功能代码的编写
1. 创建一个工程
2. 搜索并选择对应芯片型号
3. 高速时钟选择晶振
4. 可以在红框中直接输入频率值后按回车,系统会自动帮你配置其余参数
5. 调试选择红框内的串口线(serial wire)
6. 选择单片机led灯连通的GPIO,通过查找STM32F429ZGTX的硬件手册,选择GPIOE3的LED1来进行点灯,同时,由于这个板子只有三个按键,一个用于boot,一个用于reset,故只能选择GPIOA0作为实验按键(这也是为什么在步骤5中会有红色框的原因,因为PA0是用于wake-up,但对此次实验无影响)
7. PA0用于在电路中直接接地,所以我们最好对PA0设置为下拉输入,PE3设置为推挽输出,其余的按图所示进行配置就行(label可自行配置,相当于对使用的GPIO取一个别名,在编写代码时可以增加可读性)
8. 填写工程名称,选择MDK-ARM,然后在code generator中选择如图,之后点击generate code,最后点击open project,则在keil中打开工程
9. 为了模块化编程,在工程中创建两个文件,即key.c和key.h用于按键返回函数的编写
keil中创建空白文件如图所示
两个文件的要放在对应工程目录下
如下图中
10. 编写代码
main.c中编写代码如下:
int main(void)
{
/* USER CODE BEGIN 1 */
uint8_t keyvalue = KEY_NO; // 用于判断按键是否按下
/* 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 */
/* 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 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
keyvalue = key_scan(); // 此函数在key.c中
if(keyvalue != KEY_NO)
{
HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_3);
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
key.c中代码如下(注意要在main.c中include这个文件):
#include "key.h"
uint8_t key_scan(void)
{
static uint8_t flag = UP;
if((flag == UP)&&(PA0_STATUS == GPIO_PIN_SET))
{
flag = DOWN;
return KEY_UP_VALUE;
}
if((flag == DOWN)&&(PA0_STATUS == GPIO_PIN_RESET))
{
HAL_Delay(10);
if(PA0_STATUS == GPIO_PIN_RESET)
flag = UP;
}
return KEY_NO;
}
key.h中代码如下:
#ifndef _KEY_H
#define _KEY_H
#include "main.h"
#define PA0_STATUS HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)
#define KEY_UP_VALUE 0x01
#define KEY_NO 0xFF
#define UP 0
#define DOWN 1
uint8_t key_scan(void);
#endif
11. 代码下载到单片机前,一定一定一定要记得编译一遍,然后对调试串口进行设置就可以下载到单片机中进行硬件测试了