新手上路
- 积分
- 22
- 金钱
- 22
- 注册时间
- 2020-5-18
- 在线时间
- 35 小时
|
44金钱
新人小白一枚,我查了相关资料,自己写了个HAL库的MODBUS通信程序,使用的是STM32F411的开发板,但是一直接收不到数据。进不去串口中断是什么原因啊。
有没有大神能帮我看一下哪里出问题了,跪求 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; //收发模式
HAL_UART_Receive_IT(&UART2_Handler, (u8 *)a485RxBuffer, RXBUFFERSIZE);//该函数会开启接收中断:标志位UART_IT_RXNE,并且设置接收缓冲以及接收缓冲接收最大数
HAL_NVIC_SetPriority(USART2_IRQn,2,2); //抢占优先级为2,子优先级为1
HAL_NVIC_EnableIRQ(USART2_IRQn);
HAL_UART_Init(&UART2_Handler); //HAL_UART_Init()会使能UART
RS485_RX_EN();//默认为接收模式
// Modbus_RegMap();
TIM3_Init();//定时器3初始化,用于监视空闲时间
}
void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{
//GPIO端口设置
GPIO_InitTypeDef GPIO_Initure;
if(huart->Instance==USART2)//如果是串口2,进行串口2 MSP初始化
{
__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_0; //PA0
GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //推挽输出
GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_RESET);//默认低电平
HAL_GPIO_Init(GPIOA,&GPIO_Initure);
}
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance==USART2)//如果是串口2
{
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);
}
}
}
这是有关串口初始化的程序。进不去串口中断。
|
|