简单小实验——串口控制LED灯(HAL库)

硬件设备

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、轮询等,这里就不一一展示

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值