2022.4.6~2022.4.12 百问网开启智能家居二期培训,以下记录学习过程及一些心得。小白入门,水平有限,差错之处在所难免,欢迎大家指正。
DAY5:
一、调试串口USART1
使用USART1向电脑发送打印信息。
1) 初始化USART:设置波特率,收发选择,有效数据位等
2) 串口引脚初始化:USART使能、GPIO端口时钟使能、GPIO引脚设置为USART复用;
3) 重定向printf和scanf;
相关代码:
void UsartInit(uint32_t baudrate)
{
husart.Instance = USARTx; // 选择USART1
husart.Init.BaudRate = baudrate; // 配置波特率
husart.Init.WordLength = USART_WORDLENGTH_8B; // 配置数据有效位为8bit
husart.Init.StopBits = USART_STOPBITS_1; // 配置一位停止位
husart.Init.Parity = USART_PARITY_NONE; // 不设校验位
husart.Init.Mode = USART_MODE_TX_RX; // 可收可发
husart.Init.HwFlowCtl = UART_HWCONTROL_NONE;
// 使用库函数初始化USART1的参数
if (HAL_UART_Init(&husart) != HAL_OK)
{
Error_Handler();
}
}
/*****************************************************
*function: 写字符文件函数
*param1: 输出的字符
*param2: 文件指针
*return: 输出字符的ASCII码
******************************************************/
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit(&husart, (uint8_t*)&ch, 1, 10);
return ch;
}
/*****************************************************
*function: 读字符文件函数
*param1: 文件指针
*return: 读取字符的ASCII码
******************************************************/
int fgetc(FILE *f)
{
uint8_t ch = 0;
HAL_UART_Receive(&husart, (uint8_t*)&ch, 1, 10);
return (int)ch;
}
/*
* 添加如下代码,则不需要在工程设置中勾选Use MicroLIB
*/
#pragma import(__use_no_semihosting)
struct __FILE
{
int a;
};
FILE __stdout;
FILE __stdin;
void _sys_exit(int x)
{
}
二、连接WIFI模块串口USART2
使用USART2与ESP8266通讯
1) 启动串口2接收(中断方式)
2) 串口2发送AT指令
3)接收模块返回数据
相关代码:
// 1.启动串口2接收(中断方式)
USART2_StartRx();
// 2.串口2发送AT指令
USART2_Transmit(tx_data, sizeof(tx_data), 500);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
// 3.接收模块返回数据
data_len = USART2_Receive(rx_data);
if (data_len > 0) //接收到数据
{
printf("Receive: %s\n\r", rx_data); // 打印接收的数据
USART2_ClearBuf(); // 清空接收的buf
data_len = 0; // 准备下一次接收
}
}
注:本文参考百问网100ASK_STM32F103_MINI用户手册。