TTL串口
TTL串口仅仅需要两根数据线就可以进行串口通信:
①一条是从A设备发送的IO口连接到B设备的接收IO口
②一条是从B设备发送的IO口连接到A设备的接收IO口
③共地(GND)是两个设备通信的前提(保证他们的电平标准一致)
操作步骤:
①新建文件——命名为serial
②找到USART2,将串口模式改为TTL模式——即Asynchronous(异步模式)
③配置小灯的GPIO口:
④生成代码后:我们可以看到初始化串口的函数
编写代码:
因为我们在串口发送的时候需要发送字符,因此我们要加上头文件:
代码:
MX_GPIO_Init();
MX_USART2_UART_Init();
/* USER CODE BEGIN 2 */
//char message[]="Hello World!";
uint8_t receiveData[2];
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
//HAL_UART_Transmit(&huart2, (uint8_t*)message, strlen(message), 100);
//HAL_Delay(1000);
HAL_UART_Receive(&huart2, receiveData, 2, HAL_MAX_DELAY);
HAL_UART_Transmit(&huart2, receiveData, 2, 100);
GPIO_PinState state =GPIO_PIN_SET;
if(receiveData[1]=='0')
{
state = GPIO_PIN_RESET;
}
else if(receiveData[1]=='1')
{
state = GPIO_PIN_SET;
}
if(receiveData[0]=='R')
{
HAL_GPIO_WritePin(LED_RED_GPIO_Port, LED_RED_Pin, state);
}
else if(receiveData[0]=='G')
{
HAL_GPIO_WritePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin, state);
}
else if(receiveData[0]=='B')
{
HAL_GPIO_WritePin(LED_BLUE_GPIO_Port, LED_BLUE_Pin, state);
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
定义串口接收缓冲区,数组大小为2
// 串口接收缓冲区
uint8_t rx_data[2];
代码详解:
1. while (1)
这是一个无限循环,代码会一直在这个循环内运行。常用于嵌入式系统中,确保程序不断执行。
2. HAL_UART_Receive(&huart2, receiveData, 2, HAL_MAX_DELAY);
该行代码通过UART接收2个字节的数据,将其存储到 `receiveData` 缓冲区中。
HAL_MAX_DELAY表示函数将一直阻塞,直到接收到2个字节的数据。
3. HAL_UART_Transmit(&huart2, receiveData, 2, 100);
该行代码将接收到的数据通过UART原样发送回去,用于回显
4. GPIO_PinState state = GPIO_PIN_SET;
这里定义了一个 `GPIO_PinState` 类型的变量 `state`,初始值为 `GPIO_PIN_SET`(高电平)。
5. if(receiveData[1]=='0')
该行代码检查 `receiveData[1]` 是否等于字符 '0'。如果是,将 `state` 设置为 `GPIO_PIN_RESET`,即低电平。这表示如果接收到的第二个字节是 `'0'`,LED灯将被关闭。
6. else if(receiveData[1]=='1')
该行代码检查 `receiveData[1]` 是否等于字符 '1'。如果是,将 `state` 设置为 `GPIO_PIN_SET`,即高电平。这表示如果接收到的第二个字节是 '1',LED灯将被打开。
7. if(receiveData[0]=='R')
该行代码检查 receiveData[0]是否为字符 'R',如果是,表示控制红色LED灯。
HAL_GPIO_WritePin(LED_RED_GPIO_Port, LED_RED_Pin, state);`根据前面设置的 `state` 值,控制红色LED引脚的状态(高电平点亮,低电平熄灭)。
调试:
使用B站UP主keysking写的波特律动 串口助手
网址:
波特律动 串口助手 (baud-dance.com)
编写时遇到的问题:
芯片自锁:STlink烧录一次后就无法在进行烧录,这种情况一般为芯片自锁
解决方法详细参考这篇文章:
STlink烧录一次后就无法在进行烧录解决办法_stm32烧录一次后便无法烧录-CSDN博客
与此同时:在问题解决之后,我们最好是把SYS中Debug配置为Serial Wire