OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4245|回复: 4

STM32F767单片机使用串口2死机问题

[复制链接]

2

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2020-3-10
在线时间
7 小时
发表于 2021-12-13 16:42:12 | 显示全部楼层 |阅读模式
我使用的单片机是STM32F767,是阿波罗开发板,使用的工程是网上下载的阿波罗的工程文件,使用了串口1,然后又使用了串口2,但我一使用串口2,就容易死机,死机后卡死在下图函数中,串口2的初始化如下:

unsigned char UART2_aRxBuffer[USART2_RXBUFFERSIZE];//HAL库使用的串口接收缓冲

UART_HandleTypeDef UART2_Handler; //UART句柄

//串口输出
int USART2_putc(int ch)
{        
        while((USART2->ISR&0X40)==0);//循环发送 直到发送完毕   
        USART2->TDR=(unsigned char)ch;      
        return ch;
}
void Drv_Usart2_Sendx(rt_uint8_t *data, rt_uint16_t size)
{
    rt_uint16_t i = 0;
    rt_interrupt_enter();
    for(i=0; i<size; i++)
    {
        USART2_putc(data);
    }
    rt_interrupt_leave();
}


void uart2_init(unsigned int bound)
{      
    //UART 3?ê??ˉéè??
    UART2_Handler.Instance=USART2;                                            //USART1
    UART2_Handler.Init.BaudRate=bound;                                            //波特率
    UART2_Handler.Init.WordLength=UART_WORDLENGTH_8B;                       //字长为8位格式
    UART2_Handler.Init.StopBits=UART_STOPBITS_1;                            //停止位为1
    UART2_Handler.Init.Parity=UART_PARITY_NONE;                                    //无奇偶校验位
    UART2_Handler.Init.HwFlowCtl=UART_HWCONTROL_NONE;                       //无硬件流控
    UART2_Handler.Init.Mode=UART_MODE_TX_RX;                                    //收发模式
    HAL_UART_Init(&UART2_Handler);                                            //HAL_UART_Init()会使能UART1

    HAL_UART_Receive_IT(&UART2_Handler, (unsigned char *)UART2_aRxBuffer, USART2_RXBUFFERSIZE);//开启接收中断

}


//串口1中断服务程序
unsigned int USART2_timeout=0;
unsigned long USART2_Rec_rt_tick = 0;
//void USART2_IRQHandler(void)                       
//{
//   
//    //unsigned int maxDelay=0x1FFFF;
//   unsigned int maxDelay=0x1F;
//
//    rt_interrupt_enter();
//   
//    USART2_Rec_rt_tick = rt_tick_get();
//    HAL_UART_IRQHandler(&UART2_Handler);        //调用HAL库中断处理公用函数
//   
//    USART2_timeout=0;
//    while (HAL_UART_GetState(&UART2_Handler)!=HAL_UART_STATE_READY)//等待就绪
//    {
//        USART2_timeout++;//超时处理
//        if(USART2_timeout>maxDelay) break;               
//    }
//
//    USART2_timeout=0;
//    //一次处理完成后,重新开启中断并设置RxXferCount为1
//    while(HAL_UART_Receive_IT(&UART2_Handler,(unsigned char *)UART2_aRxBuffer, USART2_RXBUFFERSIZE)!=HAL_OK)
//    {
//        USART2_timeout++; //超时处理
//        if(USART2_timeout>maxDelay) break;      
//    }
//    rt_interrupt_leave();
//
//}

死机后卡死在这里


/**
* The RT_ASSERT function.
*
* @param ex is the assertion condition string.
*
* @param func is the function name when assertion.
*
* @param line is the file line number when assertion.
*/
void rt_assert_handler(const char *ex_string, const char *func, rt_size_t line)
{
    volatile char dummy = 0;

    if (rt_assert_hook == RT_NULL)
    {
#ifdef RT_USING_MODULE
        if (dlmodule_self())
        {
            /* close assertion module */
            dlmodule_exit(-1);
        }
        else
#endif /*RT_USING_MODULE*/
        {
            rt_kprintf("(%s) assertion failed at function:%s, line number:%d \n", ex_string, func, line);
            while (dummy == 0);
        }
    }
    else
    {
        rt_assert_hook(ex_string, func, line);
    }
}
RTM_EXPORT(rt_assert_handler);
#endif /* RT_DEBUG */



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2020-3-10
在线时间
7 小时
 楼主| 发表于 2021-12-13 16:43:43 | 显示全部楼层
//UART底层初始化,时钟使能,引脚配置,中断配置
//huart:串口句柄

void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{
    //GPIO端口设置
        GPIO_InitTypeDef GPIO_Initure;
       
        if(huart->Instance==USART1)//
        {
//              /*串口1使用PA9 PA10*/
//                __HAL_RCC_GPIOA_CLK_ENABLE();                        //使能GPIOA时钟
//                __HAL_RCC_USART1_CLK_ENABLE();                        //使能USART1时钟
//       
//                GPIO_Initure.Pin=GPIO_PIN_9;                        //PA9
//                GPIO_Initure.Mode=GPIO_MODE_AF_PP;                //复用推挽输出
//                GPIO_Initure.Pull=GPIO_PULLUP;                        //上拉
//                GPIO_Initure.Speed=GPIO_SPEED_FAST;                //高速
//                GPIO_Initure.Alternate=GPIO_AF7_USART1;        //复用为USART1
//                HAL_GPIO_Init(GPIOA,&GPIO_Initure);                   //初始化PA9
//
//                GPIO_Initure.Pin=GPIO_PIN_10;                        //PA10
//                GPIO_Initure.Mode=GPIO_MODE_AF_PP;                //复用推挽输出
//                GPIO_Initure.Pull=GPIO_PULLUP;                        //上拉
//                GPIO_Initure.Speed=GPIO_SPEED_FAST;                //高速
//                GPIO_Initure.Alternate=GPIO_AF7_USART1;        //复用为USART1
//                HAL_GPIO_Init(GPIOA,&GPIO_Initure);                   //初始化PA10
         
         
                /*串口1使用PB14 PB15*/
                __HAL_RCC_GPIOB_CLK_ENABLE();                        //使能GPIO时钟
                __HAL_RCC_USART1_CLK_ENABLE();                        //使能USART1时钟
                  
                GPIO_Initure.Pin=GPIO_PIN_14;                        //PB14
                GPIO_Initure.Mode=GPIO_MODE_AF_PP;                //复用推挽输出
                GPIO_Initure.Pull=GPIO_PULLUP;                        //上拉
                GPIO_Initure.Speed=GPIO_SPEED_FAST;                //高速
                GPIO_Initure.Alternate=GPIO_AF4_USART1;                //复用为USART1
                HAL_GPIO_Init(GPIOB,&GPIO_Initure);                   //初始化PB14

                GPIO_Initure.Pin=GPIO_PIN_15;                        //PB15
                HAL_GPIO_Init(GPIOB,&GPIO_Initure);                   //初始化PB15
               
                        
#if EN_USART1_RX
                //__HAL_UART_ENABLE_IT(huart,UART_IT_RXNE);       //开启接收中断
                HAL_NVIC_EnableIRQ(USART1_IRQn);                //使能USART1中断通道
                HAL_NVIC_SetPriority(USART1_IRQn,3,3);                //抢占优先级3  子优先级3
#endif       
      

        }
        
        if(huart->Instance==USART2)//
        {
              
               
                /*串口2使用PA2 PA3*/
                __HAL_RCC_GPIOA_CLK_ENABLE();                        //使能GPIO时钟
                __HAL_RCC_USART2_CLK_ENABLE();                        //使能USART2时钟
                  
                GPIO_Initure.Pin=GPIO_PIN_2;                        //PA2
                GPIO_Initure.Mode=GPIO_MODE_AF_PP;                //复用推挽输出
                GPIO_Initure.Pull=GPIO_PULLUP;                        //上拉
                GPIO_Initure.Speed=GPIO_SPEED_FAST;                //高速
                GPIO_Initure.Alternate=GPIO_AF7_USART2;                //复用为USART1
                HAL_GPIO_Init(GPIOA,&GPIO_Initure);                   //初始化PB14

                GPIO_Initure.Pin=GPIO_PIN_3;                        //PA3
                HAL_GPIO_Init(GPIOA,&GPIO_Initure);                   //初始化PB15
               

      
#if EN_USART2_RX
                //__HAL_UART_ENABLE_IT(huart,UART_IT_RXNE);       //开启接收中断
//                HAL_NVIC_EnableIRQ(USART2_IRQn);                //使能USART2中断通道
//                HAL_NVIC_SetPriority(USART2_IRQn,4,3);                //抢占优先级3  子优先级3
#endif
        }
        
        
        

}
回复 支持 反对

使用道具 举报

2

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2020-3-10
在线时间
7 小时
 楼主| 发表于 2021-12-13 16:44:18 | 显示全部楼层
上面是串口1和串口2 的管脚配置函数
回复 支持 反对

使用道具 举报

5

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2020-9-29
在线时间
20 小时
发表于 2022-3-14 13:08:51 | 显示全部楼层
楼主你是不是还使用了其他功能?
回复 支持 反对

使用道具 举报

5

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2020-9-29
在线时间
20 小时
发表于 2022-3-14 13:10:03 | 显示全部楼层
我现在用串口2也死机,不过我是在原子的汉字显示实验中加了串口二才死机。如果只是使用串口二跟串口一就不死机
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-26 00:09

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表