新手上路
- 积分
- 22
- 金钱
- 22
- 注册时间
- 2020-5-18
- 在线时间
- 35 小时
|
51金钱
在写modbus通信协议时,使用的串口2,但是接收数据一直进不去中断,有没有大佬帮忙看看怎么个情况。下面是串口初始化的程序:
UART_HandleTypeDef UART2_Handler; //UART句柄
void RS485_Init(void)
{
__HAL_RCC_USART2_CLK_ENABLE();
UART2_Handler.Instance=USART2; //USART2
UART2_Handler.Init.BaudRate=RS485_Baudrate; //波特率
UART2_Handler.Init.WordLength=UART_WORDLENGTH_8B; //字长为8位数据格式
UART2_Handler.Init.StopBits=UART_STOPBITS_1; //一个停止位
switch(RS485_Parity)
{
case 0:UART2_Handler.Init.Parity=USART_PARITY_NONE;break;//无校验
case 1:UART2_Handler.Init.Parity=USART_PARITY_ODD;break;//奇校验
case 2:UART2_Handler.Init.Parity=USART_PARITY_EVEN;break;//偶校验
}
UART2_Handler.Init.HwFlowCtl=UART_HWCONTROL_NONE; //无硬件流控
UART2_Handler.Init.Mode=UART_MODE_TX_RX; //收发模式
RS485_RX_EN();//默认为接收模式
TIM3_Init();//定时器3初始化,用于监视空闲时间
HAL_UART_Receive_IT(&UART2_Handler,(uint8_t *)a485RxBuffer,RXBUFFERSIZE);//该函数会开启接收中断:标志位UART_IT_RXNE,并且设置接收缓冲以及接收缓冲接收最大数
}
void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{
//GPIO端口设置
GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_GPIOA_CLK_ENABLE(); //使能GPIOA时钟
GPIO_Initure.Pin=GPIO_PIN_2; //PA2
GPIO_Initure.Mode=GPIO_MODE_AF_PP; //复用推挽输出
GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH;
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
GPIO_Initure.Alternate=GPIO_AF7_USART2; //复用为USART2
// HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_SET);//默认高电平
HAL_GPIO_Init(GPIOA,&GPIO_Initure);
GPIO_Initure.Pin=GPIO_PIN_3; //PA3
GPIO_Initure.Mode=GPIO_MODE_INPUT; //浮空输入
HAL_GPIO_Init(GPIOA,&GPIO_Initure);
GPIO_Initure.Pin=GPIO_PIN_1; //PA1
GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //推挽输出
GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);//默认低电平
HAL_GPIO_Init(GPIOA,&GPIO_Initure);
HAL_NVIC_EnableIRQ(USART2_IRQn);
HAL_NVIC_SetPriority(USART2_IRQn,0,0); //抢占优先级为0,子优先级为
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(RS485_RX_CNT<256)
{
RS485_RX_BUFF[RS485_RX_CNT] = a485RxBuffer[0];
RS485_RX_CNT++;
HAL_UART_Receive_IT(&UART2_Handler,(uint8_t *)a485RxBuffer,RXBUFFERSIZE);
__HAL_TIM_CLEAR_FLAG(&TIM3_Handler,TIM_FLAG_UPDATE);
__HAL_TIM_SET_COUNTER(&TIM3_Handler,0);
HAL_TIM_Base_Start_IT(&TIM3_Handler);
}
}
//串口2中断服务程序
void USART2_IRQHandler(void)
{
// u32 timeout=0;
#if SYSTEM_SUPPORT_OS //使用OS
OSIntEnter();
#endif
HAL_UART_IRQHandler(&UART2_Handler); //调用HAL库中断处理公用函数
}
|
|