第二章 STM32CubeMX生成按键程序

系列文章目录

STM32CubeMX生成程序



前言

硬件:百问网100ASK_STM32F103_MINI开发板(STM32F103C8T6)
IDE:KEIL 5
按键GPIO口为:PA0
串口为:PA10(USART1_RX)、PA9(USART1_TX)
原理图如下:
在这里插入图片描述


提示:以下是本篇文章正文内容,下面案例可供参考

一、串口重定义

一定要将自己的程序放在/* USER CODE BEGIN 1 /和/ USER CODE END 1 */之间,要不然以后使用STM32CubeMX生成程序后将用户自己的程序删除掉;添加重定义后,就可以在其它文件中使用打印函数 printf了;

1.1、在uart.c中添加 标准输入输出头文件stdio.h

/* USER CODE BEGIN 0 */
#include <stdio.h>
/* USER CODE END 0 */

如果不添加头文件,之后添加重定义函数会报错,如下图:
在这里插入图片描述

1.2、在uart.c中添加重定义函数

/* USER CODE BEGIN 1 */
#pragma import(__use_no_semihosting)
 
struct __FILE
{
	int a;
};
 
FILE __stdout;
FILE __stdin;
void _sys_exit(int x)
{
	
}

int fputc(int ch, FILE *f)
{
	HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, 10);
	return ch;
}

int fgetc(FILE *f)
{
    uint8_t ch = 0;
    HAL_UART_Receive(&huart1, (uint8_t*)&ch, 1, 10);
    return (int)ch;
}
/* USER CODE END 1 */

二、添加按键程序

2.1、在mian.h中添加 标准输入输出头文件stdio.h

在这里插入图片描述

/* USER CODE BEGIN Includes */
#include <stdio.h>
/* USER CODE END Includes */

2.2、在mian.c 文件 的 主函数 int main(void)添加调试程序

	  /*Task A*/
      printf("This is Task A .time:%d\r\n", HAL_GetTick());
	  /*Task B*/
      printf("This is Task B .time:%d\r\n", HAL_GetTick());
      HAL_Delay(500);
      printf("This is Task C is get Keyu Status.\r\n");
	  
	  if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0)==0){
		  HAL_Delay(50);
	      if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0)==0){
		       printf("Have Been read key pressed.\r\n");
		  }else{
		      printf("It is key shake.\r\n");
		  }
	  }

在这里插入图片描述

三、串口打印

3.2、按键未按下

在这里插入图片描述

3.2、按键按下

在这里插入图片描述

四、总结

 本程序使用的是轮询方式:

所谓轮询方式,即为轮流查询是否要处理当前任务,如果要处理则所有的CPU资源都用来处理当前任务,其他任务需要等待当前任务处理完毕之后才有机会执行。所以程序在运行时,如果有按键按下时间比较短,程序有时候可能不会处理到按键;只有按键时间足够长,才能处理到按键。


版权声明:本文为hewenhu1989原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。