stm32 串口5进入不了中断

[复制链接]
2096|11
 楼主| 肥羊 发表于 2017-12-1 14:44 | 显示全部楼层 |阅读模式
  1. //串口5的初始化
  2. void Init_Uart5(u16 bound)
  3. {
  4.          //GPIO端口设置
  5.          GPIO_InitTypeDef GPIO_InitStructure;
  6.          USART_InitTypeDef USART_InitStructure;
  7.          NVIC_InitTypeDef NVIC_InitStructure;
  8.           
  9.          RCC_APB2PeriphClockCmd(RCC_APB1Periph_UART5|LIN_BUS_RX_GPIO_CLK|LIN_BUS_TX_GPIO_CLK|RCC_APB2Periph_AFIO, ENABLE); //使能USART1,GPIOA时钟
  10.          USART_DeInit(UART5);        //复位串口5
  11.           //UART5_TX        PC.12
  12.          GPIO_InitStructure.GPIO_Pin = LIN_BUS_TX_PIN; //PC.12
  13.          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  14.          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
  15.          GPIO_Init(LIN_BUS_TX_GPIO, &GPIO_InitStructure); //初始化PC12
  16.        
  17.          //UART5_RX   PD.2
  18.          GPIO_InitStructure.GPIO_Pin = LIN_BUS_RX_PIN;
  19.          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
  20.          GPIO_Init(LIN_BUS_RX_GPIO, &GPIO_InitStructure);  //初始化PD2
  21.        
  22.         //Usart1 NVIC 配置
  23.        
  24.          NVIC_InitStructure.NVIC_IRQChannel = UART5_IRQn;
  25.          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;//抢占优先级3
  26.          NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;                 //子优先级3
  27.          NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                         //IRQ通道使能
  28.          NVIC_Init(&NVIC_InitStructure);         //根据指定的参数初始化VIC寄存器
  29.        
  30.         //USART 初始化设置
  31.        
  32.           USART_InitStructure.USART_BaudRate = bound;//一般设置为9600;
  33.           USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
  34.           USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
  35.           USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
  36.           USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
  37.           USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;         //收发模式
  38.        
  39.          USART_Init(UART5, &USART_InitStructure); //初始化串口
  40.          USART_ITConfig(UART5, USART_IT_RXNE, ENABLE);
  41.            USART_ITConfig(UART5, USART_IT_TC, ENABLE);
  42.          USART_Cmd(UART5, ENABLE);                                    //使能串口


  43. }



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

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

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

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

  18.     if (USART_GetFlagStatus(UART5, USART_FLAG_ORE) != RESET)
  19.     {
  20.         Res =USART_ReceiveData(UART5);//(USART1->DR);        //
  21.         USART_ClearITPendingBit(UART5, USART_IT_ORE);
  22.     }

  23.         if(USART_GetITStatus(UART5, USART_IT_RXNE) != RESET)  //
  24.         {
  25.                 USART_ClearITPendingBit(USART1, USART_IT_RXNE);
  26.                 Res =USART_ReceiveData(UART5);//(USART1->DR);        //读取接收到的数据
  27.                   
  28.                 if(Pc_rx_sta)
  29.                  {       
  30.                         if((Res!=UART_STAR_CHAR)&&(Res!=UART_STOP_CHAR))
  31.                                 checksum+=Res;
  32.                                                
  33.                          if(Res==UART_MID_CHAR)
  34.                           {
  35.                                   
  36.                                  switch(Pc_rx_buf[Pc_RxLen-1])
  37.                                    {
  38.                                           case 0x00:Pc_rx_buf[Pc_RxLen-1]=0x1a;break;
  39.                                           case 0x01:Pc_rx_buf[Pc_RxLen-1]=0x1b;break;
  40.                                           case 0x02:Pc_rx_buf[Pc_RxLen-1]=0x1c;break;                  
  41.                                           default  :Pc_rx_buf[Pc_RxLen        ]=Res;Pc_RxLen++;break;
  42.                                         }
  43.                            }else if(Res==UART_STOP_CHAR)
  44.                            {
  45.                                         //收到 地址+数据+校验
  46.                                         if(Pc_ok_**==0)
  47.                                         {
  48.                                                 memcpy(Pc_rx_buf1,Pc_rx_buf,Pc_RxLen);
  49.                                                 Pc_RxLen1=Pc_RxLen;
  50.                                                 Pc_ok_**=1;                                       
  51.                                         }       
  52.                                 }else if(Res==UART_STAR_CHAR)
  53.                                 {       
  54.                                         Pc_rx_sta=1;
  55.                                         Pc_RxLen=0;
  56.                                         checksum=0;
  57.                                 }else
  58.                                 {
  59.                                         Pc_rx_buf[Pc_RxLen++] = Res; //将接收到的字符串存到缓存中                                  
  60.                                 }                                       
  61.                                 //缓存指针向后移动
  62.                                 if(Pc_RxLen>=USART_RX_LEN)                        //如果缓存满,将缓存指针指向缓存的首地址
  63.                                 {
  64.                                          Pc_RxLen = 0;
  65.                                          Pc_rx_sta=0;
  66.                                          checksum=0;
  67.                                 }                  
  68.                   }else if(Res==UART_STAR_CHAR)
  69.                   {
  70.                         Pc_rx_sta=1;
  71.                         Pc_RxLen=0;
  72.                         checksum=0;
  73.                   }                
  74.        
  75.         }

  76.        
  77.         Pc_Zhong++;

  78.         if(USART_GetITStatus(UART5,USART_IT_TC))         
  79.     {
  80.         //Pc_Zhong++;
  81.                 USART_ClearITPendingBit(UART5,USART_IT_TC);
  82.                 if(Pc_busyflag)
  83.                 {       
  84.                    if(Pc_send_cnt >=USART_REC_LEN)
  85.                         {
  86.                                 Pc_send_cnt=1;
  87.                                 Pc_sendlen=0;
  88.                                 Pc_busyflag=0;
  89.                         }else if(Pc_send_cnt <Pc_sendlen)
  90.                     {          
  91.                             USART_SendData(UART5,Pc_tx_buf[Pc_send_cnt++]);   
  92.                         }
  93.                     else
  94.                     {
  95.                                 Pc_send_cnt=1;
  96.                                 Pc_sendlen=0;
  97.                                 Pc_busyflag=0;
  98.                     }
  99.             }else
  100.             {
  101.                     Pc_send_cnt=1;
  102.                         Pc_sendlen=0;
  103.                         Pc_busyflag=0;
  104.             }
  105.         }

  106. }

中断函数
 楼主| 肥羊 发表于 2017-12-1 14:45 | 显示全部楼层
发送函数
  1. //发送缓存数据
  2. u8 USART_SendBuf( u8 *pData,u8 buflen )
  3. {
  4.     u8 i;
  5.         if(Pc_busyflag==0)
  6.         {
  7.             Pc_Zhong=0;
  8.                 Pc_busyflag=1;
  9.                 Pc_sendlen =buflen;
  10.                 Pc_send_cnt=1;
  11.                 memcpy(Pc_tx_buf,PackBuf,falen);
  12.                 //for(i=0;i<100;i++)
  13.                 {
  14.                         USART_SendData(UART5, Pc_tx_buf[0]);
  15.                 }
  16.                        
  17.                 return 1;
  18.         }
  19.                
  20.         return 0;
  21. }
 楼主| 肥羊 发表于 2017-12-1 14:45 | 显示全部楼层
不知道为什么进入不了串口中断
 楼主| 肥羊 发表于 2017-12-1 15:10 | 显示全部楼层
好像发送的不出去
布丁奶茶 发表于 2017-12-1 16:06 | 显示全部楼层
你的发送函数中 if条件是否满足?
 楼主| 肥羊 发表于 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时钟
一路向北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_ ...

找到原因就好,怎用用这么多串口?
 楼主| 肥羊 发表于 2017-12-14 13:08 | 显示全部楼层
一路向北lm 发表于 2017-12-3 12:10
找到原因就好,怎用用这么多串口?

硬件的刚好接了那个脚
killalljp 发表于 2017-12-14 16:03 | 显示全部楼层
这个是STM32的哪个型号有这么多uart??
 楼主| 肥羊 发表于 2017-12-15 11:50 | 显示全部楼层
killalljp 发表于 2017-12-14 16:03
这个是STM32的哪个型号有这么多uart??

103
ningling_21 发表于 2017-12-15 13:32 | 显示全部楼层
killalljp 发表于 2017-12-14 16:03
这个是STM32的哪个型号有这么多uart??

407更多
zqx1000 发表于 2018-4-10 23:31 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

38

主题

287

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部