实现以下功能:开机后,单片机从串口发出"input time in ms:\r\n"以提示用户从UART输入以毫秒表示的倒计时时间,然后从UART接收一个整数作为倒计时毫秒时间,开始计时,时间到了之后从UART提示“"time's up!”并结束计时。
知识点:
定时器开启HAL_TIM_Base_Start_IT
定时器关闭HAL_TIM_Base_Stop_IT
定时器中断回调名:HAL_TIM_PeriodElapsedCallback
改变计数周期数:__HAL_TIM_SET_AUTORELOAD(&htimX,inputnum);
伪代码如下:
-------------
在主程序中:
接受输入;
改变计时器的值为输入的值;
开启计时器;
在定时器回调中:
打印"time's up!
关闭计时器;
-------------
利用串口实现printf/scanf函数。
参考:https://forum.digikey.com/t/easily-use-scanf-on-stm32/21103
在用户代码区位置加上这两段代码:
/* USER CODE BEGIN Includes */
#include <stdio.h>
/* USER CODE END Includes */
/* USER CODE BEGIN PFP */
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#define GETCHAR_PROTOTYPE int __io_getchar(void)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#define GETCHAR_PROTOTYPE int fgetc(FILE *f)
#endif
PUTCHAR_PROTOTYPE
{
HAL_UART_Transmit(&huart?, (uint8_t *)&ch, 1, HAL_MAX_DELAY);
return ch;
}
GETCHAR_PROTOTYPE
{
uint8_t ch = 0;
/* Clear the Overrun flag just before receiving the first character */
__HAL_UART_CLEAR_OREFLAG(&huart?);
/* Wait for reception of a character on the USART RX line and echo this
* character on console */
HAL_UART_Receive(&huart?, (uint8_t *)&ch, 1, HAL_MAX_DELAY);
HAL_UART_Transmit(&huart?, (uint8_t *)&ch, 1, HAL_MAX_DELAY);
return ch;
}
/* USER CODE END PFP */