简单小实验——串口控制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、轮询等,这里就不一一展示

  • 5
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
您可以通过使用STM32HAL库控制串口LED。首先,确保已经在项目中包含了`stm32fxxx_hal.h`头文件(其中"xxx"是您使用的具体芯片型号)。然后,按照以下步骤进行操作: 1. 初始化串口:通过调用`HAL_UART_Init()`函数来初始化串口。您需要指定UART的引脚配置、波特率等参数。 2. 配置GPIO:使用`HAL_GPIO_Init()`函数来配置LED的GPIO引脚,并将其设置为输出模式。 3. 发送数据:在主循环中,您可以使用`HAL_UART_Transmit()`函数来发送数据到串口。例如,您可以发送一个特定的命令或字符以控制LED的状态。 4. 控制LED:根据接收到的数据,您可以使用`HAL_GPIO_WritePin()`函数来控制LED的状态。通过改变引脚的电平,您可以打开或关闭LED。 下面是一个简单的示例代码,展示了如何使用STM32HAL库控制串口LED: ```c #include "stm32fxxx_hal.h" UART_HandleTypeDef huart; GPIO_InitTypeDef GPIO_InitStruct; void UART_Init() { huart.Instance = USART1; huart.Init.BaudRate = 9600; huart.Init.WordLength = UART_WORDLENGTH_8B; huart.Init.StopBits = UART_STOPBITS_1; huart.Init.Parity = UART_PARITY_NONE; huart.Init.Mode = UART_MODE_TX_RX; huart.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart.Init.OverSampling = UART_OVERSAMPLING_16; HAL_UART_Init(&huart); } void GPIO_Init() { __HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); } int main() { HAL_Init(); UART_Init(); GPIO_Init(); while (1) { // 从串口接收数据 uint8_t data; HAL_UART_Receive(&huart, &data, 1, HAL_MAX_DELAY); // 根据接收到的数据控制LED if (data == '1') { HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET); // 打开LED } else if (data == '0') { HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET); // 关闭LED } } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值