突然间发现,原来的标准库的程序,改成hal库,把hal库里的一些规则、形式掌握好,只需要做一些小的改动即可。
这里是串口2的接收中断的代码,用串口1实现这个功能,修改一下。
void USART2_IRQHandler(void)
{
u8 Clear=Clear;
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
{
USART2_RX_BUF[USART2_RX_STA&0X3FFF]=USART_ReceiveData(USART2);
USART2_RX_STA++;
}
else if(USART_GetITStatus(USART2,USART_IT_IDLE) !=RESET )
{
Clear=USART2->SR;
Clear=USART2->DR;
if(USART2_RX_BUF[0] == 0x30)
{
Seial_PARAM_Rev();
}
MQTT_USART2_LEN = USART2_RX_STA&0X3FFF;
memcpy(MQTT_USART2_RX_BUF,USART2_RX_BUF,MQTT_USART2_LEN);
Usart1_SendBuf(MQTT_USART2_RX_BUF,MQTT_USART2_LEN);
UART2ReceiveState=1;
Clear_USART2_RXBUF();
}
}
利用UART_IT_RXNE和UART_IT_IDLE两个标志,就不用 HAL_UART_Receive_IT(&UART1_Handler, (u8 *)aRxBuffer, RXBUFFERSIZE);也不用回调函数了,直接在void USART1_IRQHandler(void) 改下清除UART_IT_RXNE和UART_IT_IDLE标志以及读取数据即可。
usart.c
#include "sys.h"
#include "usart.h"
#if 1
#pragma import(__use_no_semihosting)
struct __FILE
{
int handle;
};
FILE __stdout;
void _sys_exit(int x)
{
x = x;
}
int fputc(int ch, FILE *f)
{
while((USART1->SR&0X40)==0);
USART1->DR = (u8) ch;
return ch;
}
#endif
u8 USART1_RX_BUF[USART_REC_LEN];
u16 USART_RX_STA=0;
u8 Count=0;
u8 aRxBuffer[RXBUFFERSIZE];
UART_HandleTypeDef UART1_Handler;
u16 MQTT_USART2_LEN=0;
void uart_init(u32 bound)
{
UART1_Handler.Instance=USART1;
UART1_Handler.Init.BaudRate=bound;
UART1_Handler.Init.WordLength=UART_WORDLENGTH_8B;
UART1_Handler.Init.StopBits=UART_STOPBITS_1;
UART1_Handler.Init.Parity=UART_PARITY_NONE;
UART1_Handler.Init.HwFlowCtl=UART_HWCONTROL_NONE;
UART1_Handler.Init.Mode=UART_MODE_TX_RX;
HAL_UART_Init(&UART1_Handler);
__HAL_UART_ENABLE_IT(&UART1_Handler, UART_IT_RXNE);
__HAL_UART_ENABLE_IT(&UART1_Handler, UART_IT_IDLE);
}
void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{
GPIO_InitTypeDef GPIO_Initure;
if(huart->Instance==USART1)
{
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_USART1_CLK_ENABLE();
__HAL_RCC_AFIO_CLK_ENABLE();
GPIO_Initure.Pin=GPIO_PIN_9;
GPIO_Initure.Mode=GPIO_MODE_AF_PP;
GPIO_Initure.Pull=GPIO_PULLUP;
GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA,&GPIO_Initure);
GPIO_Initure.Pin=GPIO_PIN_10;
GPIO_Initure.Mode=GPIO_MODE_AF_INPUT;
HAL_GPIO_Init(GPIOA,&GPIO_Initure);
HAL_NVIC_EnableIRQ(USART1_IRQn);
HAL_NVIC_SetPriority(USART1_IRQn,3,3);
}
}
void USART1_IRQHandler(void)
{
#if SYSTEM_SUPPORT_OS
OSIntEnter();
#endif
HAL_UART_IRQHandler(&UART1_Handler);
if(RESET != __HAL_UART_GET_FLAG(&UART1_Handler, UART_FLAG_RXNE))
{
__HAL_UART_CLEAR_FLAG(&UART1_Handler,UART_FLAG_RXNE);
USART1_RX_BUF[USART_RX_STA&0X3FFF]=UART1_Handler.Instance->DR;
USART_RX_STA++;
}
else if(RESET != __HAL_UART_GET_FLAG(&UART1_Handler,UART_FLAG_IDLE))
{
__HAL_UART_CLEAR_IDLEFLAG(&UART1_Handler);
if(USART1_RX_BUF[0]==0x55)
{
for(int i=0;i<USART_RX_STA;i++){
printf("USART1_RX_BUF[%d] = 0x%x\r\n",i,USART1_RX_BUF[i]);
}
MQTT_USART2_LEN = USART_RX_STA&0X3FFF;
printf("MQTT_USART2_LEN = %d \r\n",MQTT_USART2_LEN);
HAL_UART_Transmit(&UART1_Handler, (uint8_t*)USART1_RX_BUF,8,100);
while(__HAL_UART_GET_FLAG(&UART1_Handler,UART_FLAG_TC)!=SET);
memset(USART1_RX_BUF,0,sizeof(USART1_RX_BUF));
USART_RX_STA=0;
}
}
#if SYSTEM_SUPPORT_OS
OSIntExit();
#endif
}
void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
{
if(huart->Instance==USART1)
{
__HAL_RCC_USART1_CLK_DISABLE();
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10);
HAL_NVIC_DisableIRQ(USART1_IRQn);
}
else if(huart->Instance==USART2)
{
__HAL_RCC_USART2_CLK_DISABLE();
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_2|GPIO_PIN_3);
HAL_NVIC_DisableIRQ(USART2_IRQn);
}
}
usart.h
#ifndef __USART_H
#define __USART_H
#include "stdio.h"
#include "sys.h"
#define USART_REC_LEN 200
extern u8 USART1_RX_BUF[USART_REC_LEN];
extern u16 USART_RX_STA;
extern UART_HandleTypeDef UART1_Handler;
extern u16 MQTT_USART2_LEN;
#define RXBUFFERSIZE 1
extern u8 aRxBuffer[RXBUFFERSIZE];
void uart_init(u32 bound);
#endif
例如,发送55 AA 03 04 05 FD FF CC,接收到以后,再转发出来,做了测试如下图所示。
下载链接如下:https://download.csdn.net/download/petertang1975/86497481
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)