一、简介
**芯片:stm32f051k8** **软件平台:keil5, stm32CubeMX** **方法:利用HAL固件实训中断在uart1中断通讯的基础上**
**注意:时钟采用的默认时钟,uart1连接是PC ,uart2连接时esp8266**
二、实验步骤
1. 配置uart1和uart2都为异常中断通信(如下图uart1和uart2的配置相同)
二、生成代码,在代码中添加
1、在main.c中
/*USER CODE BEGIN PV*/
//因为我这里是产生一个字节就产生中断
uint8_t RX_Buf_It1; //中断字节
uint8_t Rx_Buf_It2; //中断字节
/*USER CODE END PV*/
/* USER CODE BEGIN 0 */
//重写中断处理函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
//如果是uart1传出来的数据
if(huart == &huart1)
{
//传送给uart2&
HAL_UART_Transmit(&huart2,&RX_Buf_It1,1,HAL_MAX_DELAY);
//初始化当前字节的内容
memset(&RX_Buf_It1,0,sizeof(RX_Buf_It1));
//重新使能一下中断
HAL_UART_Receive_IT(&huart1,&RX_Buf_It1,1);
}
//如果是uart2传过来的数据
if(huart == &huart2)
{
HAL_UART_Transmit(&huart1,&RX_Buf_It2,1,HAL_MAX_DELAY);
memset(&RX_Buf_It1,0,sizeof(RX_Buf_It2));
HAL_UART_Receive_IT(&huart2,&RX_Buf_It2,1);
}
}
/*USER CODE END 0*/
//在主函数main里面添加
/* USER CODE BEGIN 2 */
//使能中断
HAL_UART_Receive_IT(&huart1,&RX_Buf_It1,1);
HAL_UART_Receive_IT(&huart2,&RX_Buf_It2,1);
/*USER CODE END 2*/
三、附加esp8266模块的透传通信
char command_putc(char ch)
{
HAL_UART_Transmit(&huart2,(uint8_t *)&ch,1,HAL_MAX_DELAY);
return ch;
}
void command_puts(char *str)
{
while(*str != 0)
{
command_putc(*str);
str++;
}
}
void wifi_init(void)
{
char p[133];
command_puts("AT+CWMODE=1\r\n");//设为station模式 就是一个客户端
HAL_Delay(2000);
command_puts("AT+CWDHCP_CUR=1,1\r\n");
//AT+UART_CUR - 设置 UART 当前临时设置,不保存到 Flash
HAL_Delay(2000);
command_puts("AT+CWJAP=\"hqyj1107\",\"hqyj1107\"\r\n");//连接wifi
HAL_Delay(7000);
command_puts("AT+CIFSR\r\n");//查询 ESP8266 设备的IP地址和MAC
HAL_Delay(3000);
command_puts("AT+PING=\"192.168.11.109\"\r\n");//ping 一下服务器
HAL_Delay(3000);
command_puts("AT+CIPSTART=\"TCP\",\"192.168.11.109\",8888\r\n");//连接TCP服务器
HAL_Delay(300);
command_puts("AT+CIPMODE=1\r\n");//使能透传模式
HAL_Delay(300);
command_puts("AT+CIPSEND\r\n"); //开始透传发送
HAL_Delay(300);
//下面是把wifi的tcp上加了一个消息头,使其伪装为http通信;
// sprintf(p,"POST /post HTTP/1.1\r\nHOST: 192.168.11.102:8081\r\nAccept: */*\r\nContent-Type:application/x-www-form-urlencoded\r\nContent-Length: 3\r\n\r\n123");// sprintf(p,"POST /post HTTP/1.1\r\nHOST: 192.168.11.102:8081\r\nAccept: */*\r\nContent-Type:application/x-www-form-urlencoded\r\nContent-Length: 3\r\n\r\n123");
// command_puts(p);
// +++ 退出透传;不需要\r\n
}
四、改善HAL库的数据传输缓慢
用HAL库调用对应中断回调,会有大量的判断和函数调用,所以优化为寄存器版本;当然用空闲中断加DMA也是可以,后面会更新!代码见下图
UART1中断跳转
//这里是读取uart1获取 SR 寄存器标志位状态 看它是否为set
if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_RXNE) == SET)
{
//串口状态寄存器的TXE标志位,TXE标志位标识发送数据寄存器(TDR寄存器)是否为空
while((USART2->ISR & 0x40) == 0);
//把uart1的数据传给uart2
USART2->TDR = USART1->RDR;
}
uart2中断跳转
if(__HAL_UART_GET_FLAG(&huart2,UART_FLAG_RXNE) == SET)
{
while((USART1->ISR & 0x40) == 0);
USART1->TDR = USART2->RDR;
}