打印

stm32 串口5进入不了中断

[复制链接]
1818|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
肥羊|  楼主 | 2017-12-1 14:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//串口5的初始化
void Init_Uart5(u16 bound)
{
         //GPIO端口设置
         GPIO_InitTypeDef GPIO_InitStructure;
         USART_InitTypeDef USART_InitStructure;
         NVIC_InitTypeDef NVIC_InitStructure;
          
         RCC_APB2PeriphClockCmd(RCC_APB1Periph_UART5|LIN_BUS_RX_GPIO_CLK|LIN_BUS_TX_GPIO_CLK|RCC_APB2Periph_AFIO, ENABLE); //使能USART1,GPIOA时钟
         USART_DeInit(UART5);        //复位串口5
          //UART5_TX        PC.12
         GPIO_InitStructure.GPIO_Pin = LIN_BUS_TX_PIN; //PC.12
         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
         GPIO_Init(LIN_BUS_TX_GPIO, &GPIO_InitStructure); //初始化PC12
       
         //UART5_RX   PD.2
         GPIO_InitStructure.GPIO_Pin = LIN_BUS_RX_PIN;
         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
         GPIO_Init(LIN_BUS_RX_GPIO, &GPIO_InitStructure);  //初始化PD2
       
        //Usart1 NVIC 配置
       
         NVIC_InitStructure.NVIC_IRQChannel = UART5_IRQn;
         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;//抢占优先级3
         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;                 //子优先级3
         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                         //IRQ通道使能
         NVIC_Init(&NVIC_InitStructure);         //根据指定的参数初始化VIC寄存器
       
        //USART 初始化设置
       
          USART_InitStructure.USART_BaudRate = bound;//一般设置为9600;
          USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
          USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
          USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
          USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
          USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;         //收发模式
       
         USART_Init(UART5, &USART_InitStructure); //初始化串口
         USART_ITConfig(UART5, USART_IT_RXNE, ENABLE);
           USART_ITConfig(UART5, USART_IT_TC, ENABLE);
         USART_Cmd(UART5, ENABLE);                                    //使能串口


}



void UART5_IRQHandler(void)                        //串口1中断服务程序
{
       

   u8 Res;
   if(USART_GetFlagStatus(UART5, USART_FLAG_NE) != RESET)
        {//同  @arg USART_IT_NE     : Noise Error interrupt
                USART_ClearFlag(UART5, USART_FLAG_NE);
        }

        if(USART_GetFlagStatus(UART5, USART_FLAG_FE) != RESET)
        {//同   @arg USART_IT_FE     : Framing Error interrupt
                USART_ClearFlag(UART5, USART_FLAG_FE);
        }

        if(USART_GetFlagStatus(UART5, USART_FLAG_PE) != RESET)
        {//同  @arg USART_IT_PE     : Parity Error interrupt
                USART_ClearFlag(UART5, USART_FLAG_PE);
        }
        //注意!不能使用if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)来判断

    if (USART_GetFlagStatus(UART5, USART_FLAG_ORE) != RESET)
    {
        Res =USART_ReceiveData(UART5);//(USART1->DR);        //
        USART_ClearITPendingBit(UART5, USART_IT_ORE);
    }

        if(USART_GetITStatus(UART5, USART_IT_RXNE) != RESET)  //
        {
                USART_ClearITPendingBit(USART1, USART_IT_RXNE);
                Res =USART_ReceiveData(UART5);//(USART1->DR);        //读取接收到的数据
                  
                if(Pc_rx_sta)
                 {       
                        if((Res!=UART_STAR_CHAR)&&(Res!=UART_STOP_CHAR))
                                checksum+=Res;
                                               
                         if(Res==UART_MID_CHAR)
                          {
                                  
                                 switch(Pc_rx_buf[Pc_RxLen-1])
                                   {
                                          case 0x00:Pc_rx_buf[Pc_RxLen-1]=0x1a;break;
                                          case 0x01:Pc_rx_buf[Pc_RxLen-1]=0x1b;break;
                                          case 0x02:Pc_rx_buf[Pc_RxLen-1]=0x1c;break;                  
                                          default  :Pc_rx_buf[Pc_RxLen        ]=Res;Pc_RxLen++;break;
                                        }
                           }else if(Res==UART_STOP_CHAR)
                           {
                                        //收到 地址+数据+校验
                                        if(Pc_ok_**==0)
                                        {
                                                memcpy(Pc_rx_buf1,Pc_rx_buf,Pc_RxLen);
                                                Pc_RxLen1=Pc_RxLen;
                                                Pc_ok_**=1;                                       
                                        }       
                                }else if(Res==UART_STAR_CHAR)
                                {       
                                        Pc_rx_sta=1;
                                        Pc_RxLen=0;
                                        checksum=0;
                                }else
                                {
                                        Pc_rx_buf[Pc_RxLen++] = Res; //将接收到的字符串存到缓存中                                  
                                }                                       
                                //缓存指针向后移动
                                if(Pc_RxLen>=USART_RX_LEN)                        //如果缓存满,将缓存指针指向缓存的首地址
                                {
                                         Pc_RxLen = 0;
                                         Pc_rx_sta=0;
                                         checksum=0;
                                }                  
                  }else if(Res==UART_STAR_CHAR)
                  {
                        Pc_rx_sta=1;
                        Pc_RxLen=0;
                        checksum=0;
                  }                
       
        }

       
        Pc_Zhong++;

        if(USART_GetITStatus(UART5,USART_IT_TC))         
    {
        //Pc_Zhong++;
                USART_ClearITPendingBit(UART5,USART_IT_TC);
                if(Pc_busyflag)
                {       
                   if(Pc_send_cnt >=USART_REC_LEN)
                        {
                                Pc_send_cnt=1;
                                Pc_sendlen=0;
                                Pc_busyflag=0;
                        }else if(Pc_send_cnt <Pc_sendlen)
                    {          
                            USART_SendData(UART5,Pc_tx_buf[Pc_send_cnt++]);   
                        }
                    else
                    {
                                Pc_send_cnt=1;
                                Pc_sendlen=0;
                                Pc_busyflag=0;
                    }
            }else
            {
                    Pc_send_cnt=1;
                        Pc_sendlen=0;
                        Pc_busyflag=0;
            }
        }

}

中断函数

相关帖子

沙发
肥羊|  楼主 | 2017-12-1 14:45 | 只看该作者
发送函数
//发送缓存数据
u8 USART_SendBuf( u8 *pData,u8 buflen )
{
    u8 i;
        if(Pc_busyflag==0)
        {
            Pc_Zhong=0;
                Pc_busyflag=1;
                Pc_sendlen =buflen;
                Pc_send_cnt=1;
                memcpy(Pc_tx_buf,PackBuf,falen);
                //for(i=0;i<100;i++)
                {
                        USART_SendData(UART5, Pc_tx_buf[0]);
                }
                       
                return 1;
        }
               
        return 0;
}

使用特权

评论回复
板凳
肥羊|  楼主 | 2017-12-1 14:45 | 只看该作者
不知道为什么进入不了串口中断

使用特权

评论回复
地板
肥羊|  楼主 | 2017-12-1 15:10 | 只看该作者
好像发送的不出去

使用特权

评论回复
5
布丁奶茶| | 2017-12-1 16:06 | 只看该作者
你的发送函数中 if条件是否满足?

使用特权

评论回复
6
肥羊|  楼主 | 2017-12-1 17:03 | 只看该作者
本帖最后由 肥羊 于 2017-12-1 17:07 编辑

原因找到了
RCC_APB2PeriphClockCmd(RCC_APB1Periph_UART5|LIN_BUS_RX_GPIO_CLK|LIN_BUS_TX_GPIO_CLK|RCC_APB2Periph_AFIO, ENABLE); //使能USART1,GPIOA时钟
错了改为
RCC_APB2PeriphClockCmd(LIN_BUS_RX_GPIO_CLK|LIN_BUS_TX_GPIO_CLK|RCC_APB2Periph_AFIO, ENABLE); //使能USART1,GPIOA时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5, ENABLE); //使能USART5,GPIOA时钟

使用特权

评论回复
7
一路向北lm| | 2017-12-3 12:10 | 只看该作者
肥羊 发表于 2017-12-1 17:03
原因找到了
RCC_APB2PeriphClockCmd(RCC_APB1Periph_UART5|LIN_BUS_RX_GPIO_CLK|LIN_BUS_TX_GPIO_CLK|RCC_ ...

找到原因就好,怎用用这么多串口?

使用特权

评论回复
8
肥羊|  楼主 | 2017-12-14 13:08 | 只看该作者
一路向北lm 发表于 2017-12-3 12:10
找到原因就好,怎用用这么多串口?

硬件的刚好接了那个脚

使用特权

评论回复
9
killalljp| | 2017-12-14 16:03 | 只看该作者
这个是STM32的哪个型号有这么多uart??

使用特权

评论回复
10
肥羊|  楼主 | 2017-12-15 11:50 | 只看该作者
killalljp 发表于 2017-12-14 16:03
这个是STM32的哪个型号有这么多uart??

103

使用特权

评论回复
11
ningling_21| | 2017-12-15 13:32 | 只看该作者
killalljp 发表于 2017-12-14 16:03
这个是STM32的哪个型号有这么多uart??

407更多

使用特权

评论回复
12
zqx1000| | 2018-4-10 23:31 | 只看该作者
kankan

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

35

主题

271

帖子

1

粉丝