硬件设备
STM32F103ZET3开发板
STLink
功能实现
发送ON LED亮
发送OFF LED灭
其他指令串口发送error
实验过程
波特率设置为115200、数据位8、奇偶校验位None、停止位1
这里我采用的是中断的方式去实现串口控制LED,因此NVIC需要开启
在usart.c文件中添加重定义后的函数
/* USER CODE BEGIN 0 */
#include "stdio.h"
int fputc(int ch,FILE *f)
{ HAL_UART_Transmit (&huart1 ,(uint8_t *)&ch,1,HAL_MAX_DELAY );
return ch;
}
int fgetc(FILE *f)
{
uint8_t ch = 0;
HAL_UART_Receive(&huart1, &ch, 1, 0xffff);
return ch;
}
/* USER CODE END 0 */
在main.c中首先定义一个接收中断缓冲变量
/* USER CODE BEGIN PV */
uint8_t data;
/* USER CODE END PV */
然后在串口初始化函数后,while函数前添加一个接收中断开启函数,同时print自己的标题
printf("LED控制系统\r\n");
printf("LED打开 o\r\n");
printf("LED关闭 f\r\n");
HAL_UART_Receive_IT(&huart1,(uint8_t *)&data,sizeof(data));
添加中断回调函数,编写自己的需求。
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance==USART1)
{
if(data=='o')
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET);
HAL_UART_Transmit(&huart1,(uint8_t *)&"灯已开启!\r\n",sizeof("灯已开启!\r\n"),HAL_MAX_DELAY);
HAL_UART_Receive_IT(&huart1,&data,sizeof(data));
}
else if(data=='f')
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET);
HAL_UART_Transmit(&huart1,(uint8_t *)&"灯已关闭!\r\n",sizeof("灯已关闭!\r\n"),HAL_MAX_DELAY);
HAL_UART_Receive_IT(&huart1,&data,sizeof(data));
}
else
{
HAL_UART_Transmit(&huart1,(uint8_t *)&"error!\r\n",sizeof("error\r\n"),HAL_MAX_DELAY);
HAL_UART_Receive_IT(&huart1,&data,sizeof(data));
}
HAL_UART_Receive_IT(&huart1,(uint8_t*)&data,sizeof(data));//打开下一次串口接收中断
}
}
还是很容易理解的,当串口接收道数据时,判断接收的字符,如果相同就执行后续的步骤,这里的电灯可以换成其他的东西,
实验现象
将程序下载进去后,出现下列接收的数据表明,串口已经连接好
向单片机发送‘t’,会接收到error!的指令
发送开启灯的命令后,串口接收的指令如下
可以观察到LED已经点亮
上述是用串口中断做的控制,也可以用DMA、轮询等,这里就不一一展示