系列文章目录
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版权协议,转载请附上原文出处链接和本声明。