基于STM32F103C8T6使用STM32CUBEMX配置串口打印及中断
在前面的博客里写了STM32F103C8T6建立的最小系统的搭建。这次关于串口的配置是基于上次最小系统的基础上进行添加的。
STM32CUBEMX中配置串口
查看引脚表格
通过芯片的引脚表,我们知道串口1的引脚是PA9,PA10。
在STM32中找到串口的配置
在KEIL中添加打印调试代码
重写发送函数
void Usart_SendString(uint8_t *str)
{
unsigned int k=0;
do
{
HAL_UART_Transmit(&huart1,(uint8_t *)(str + k) ,1,1000);
k++;
} while(*(str + k)!='\0');
}
//重定向c库函数printf到串口DEBUG_USART,重定向后可使用printf函数
int fputc(int ch, FILE *f)
{
/* 发送一个字节数据到串口DEBUG_USART */
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 10);
return (ch);
}
//重定向c库函数scanf到串口DEBUG_USART,重写向后可使用scanf、getchar等函数
int fgetc(FILE *f)
{
int ch;
HAL_UART_Receive(&huart1, (uint8_t *)&ch, 1, 10);
return (ch);
}
再添加如下代码
/*
* 添加如下代码,则不需要在工程设置中勾选Use MicroLIB
*/
#pragma import(__use_no_semihosting)
struct __FILE
{
int a;
};
FILE __stdout;
FILE __stdin;
void _sys_exit(int x)
{
}
重写回到函数
// 回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if (huart->Instance == USART1) // 如果是USART1
{
if (RX_Data == 0x1) // 如果接收到0xA1
{
LED1_ON(); // 打开LED1
HAL_UART_Transmit(&huart1, TX_Str2, sizeof(TX_Str2), 10000); // 阻塞性发送
HAL_UART_Receive_IT(&huart1, &RX_Data, 1); // 接收一个字节之后,继续用中断的接收下一个字节
}
else if (RX_Data == 0x2) // 如果接收到0xA2
{
LED1_OFF(); // 关闭LED1
HAL_UART_Transmit(&huart1, TX_Str3, sizeof(TX_Str3), 10000); // 阻塞性发送
HAL_UART_Receive_IT(&huart1, &RX_Data, 1); // 接收一个字节之后,继续用中断的接收下一个字节
}
HAL_UART_Receive_IT(&huart1, &RX_Data, 1); // 写在if判断里面不好用,写在最后面
}
}
调试结果如下
本工程源码下载
链接: https://download.csdn.net/download/weixin_39465496/88750520