你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

关于STM32L051低功耗串口初始化问题

[复制链接]
piaoxue105 提问时间:2018-10-7 19:04 /
各位大佬我按照例程初始化串口1,2和第三个低功耗串口,都作为普通串口使用,1,2两个串口可以中断接收和发送,第三个低功耗串口初始化后可以发送但进不了接收中断。这个串口的初始化偶什么特殊要求吗?希望可以得到指点。谢谢各位西边是初始化代码。

void Configure_USART_2(void)
{

  /* (1) Enable GPIO clock and configures the USART pins *********************/

  /* Enable the peripheral clock of GPIO Port */
  LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOB);

  /* Configure Tx Pin as : Alternate function, High Speed, Push pull, Pull up */
  LL_GPIO_SetPinMode(GPIOB, LL_GPIO_PIN_10, LL_GPIO_MODE_ALTERNATE);
  LL_GPIO_SetAFPin_8_15(GPIOB, LL_GPIO_PIN_10, LL_GPIO_AF_4);
  LL_GPIO_SetPinSpeed(GPIOB, LL_GPIO_PIN_10, LL_GPIO_SPEED_FREQ_HIGH);
  LL_GPIO_SetPinOutputType(GPIOB, LL_GPIO_PIN_10, LL_GPIO_OUTPUT_PUSHPULL);
  LL_GPIO_SetPinPull(GPIOB, LL_GPIO_PIN_10, LL_GPIO_PULL_NO);

  /* Configure Rx Pin as : Alternate function, High Speed, Push pull, Pull up */
  LL_GPIO_SetPinMode(GPIOB, LL_GPIO_PIN_11, LL_GPIO_MODE_ALTERNATE);
  LL_GPIO_SetAFPin_8_15(GPIOB, LL_GPIO_PIN_11, LL_GPIO_AF_4);
  LL_GPIO_SetPinSpeed(GPIOB, LL_GPIO_PIN_11, LL_GPIO_SPEED_FREQ_HIGH);
  LL_GPIO_SetPinOutputType(GPIOB, LL_GPIO_PIN_11, LL_GPIO_OUTPUT_PUSHPULL);
  LL_GPIO_SetPinPull(GPIOB, LL_GPIO_PIN_11, LL_GPIO_PULL_NO);

  /* (2) NVIC Configuration for USART interrupts */
  /*  - Set priority for USARTx_IRQn */
  /*  - Enable USARTx_IRQn */
  NVIC_SetPriority(LPUART1_IRQn, 0);  
  NVIC_EnableIRQ(LPUART1_IRQn);

  /* (3) Enable USART peripheral clock and clock source ***********************/
  LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_LPUART1);

  /* Set clock source */
  LL_RCC_SetLPUARTClockSource(LL_RCC_LPUART1_CLKSOURCE_HSI);

  /* (4) Configure USART functional parameters ********************************/

  /* Disable USART prior modifying configuration registers */
  /* Note: Commented as corresponding to Reset value */
  // LL_USART_Disable(USARTx_INSTANCE);

  /* TX/RX direction */
  LL_USART_SetTransferDirection(LPUART1, LL_USART_DIRECTION_TX_RX);

  /* 8 data bit, 1 start bit, 1 stop bit, no parity */
  LL_USART_ConfigCharacter(LPUART1, LL_USART_DATAWIDTH_8B, LL_USART_PARITY_NONE, LL_USART_STOPBITS_1);


  LL_LPUART_SetBaudRate(LPUART1, HSI_VALUE, 115200);
  /* (5) Enable USART *********************************************************/
  LL_USART_Enable(LPUART1);

  /* Polling USART initialisation */
  while((!(LL_USART_IsActiveFlag_TEACK(LPUART1))) || (!(LL_USART_IsActiveFlag_REACK(LPUART1))))
  {
  }

  /* Enable RXNE and Error interrupts */
  LL_USART_EnableIT_RXNE(LPUART1);  //UART_HWCONTROL_NONE
  LL_USART_EnableIT_ERROR(LPUART1);
}



中断接收程序

void LPUART1_IRQHandler(void)
{
  /* Check RXNE flag value in ISR register */
  if(LL_USART_IsActiveFlag_RXNE(LPUART1) && LL_USART_IsEnabledIT_RXNE(LPUART1))
  {
               
    USART_CharReception_Callback_2();
               
  }
  else
  {
    /* Call Error function */
    Error_Callback_2();
  }
       
}


接收处理部分
void USART_CharReception_Callback_2(void)
{
__IO uint32_t received_char;

  /* Read Received character. RXNE flag is cleared by reading of RDR register */
  received_char = LL_USART_ReceiveData8(LPUART1);

        if(received_char==0x55)
  {
    datasp=0;                             
    data_r[datasp]=received_char;
    datasp+=1;                  //
  }
  else if(datasp!=0)
  {
    data_r[datasp]=received_char;
    datasp+=1;
    if(data_r[2] == (datasp-4))
                {
                  switch(data_r[3]) {

        case 0xf0:
                                                ADD++;
                                          if(ADD==1)
                                                                        {
                    //LED_On();
                                                                                flag=1;
                                                                        }
                                                                        if(ADD==2)
                                                                        {
                    //LED_Off();
                                                                                flag=0;
                                                                                ADD=0;
                                                                        }
                  break;

        case 0xf1:
                  //LED_Off();
                  break;
                               
        case 0xf2:

                  break;
                               
         default :
                                         
                  break;
                         }
                }
  }
  /* Echo received character on TX */
  LL_USART_TransmitData8(LPUART1, received_char);  //·¢ËÍ
}

收藏 评论2 发布时间:2018-10-7 19:04

举报

2个回答
piaoxue105 回答时间:2018-10-8 11:14:26
谁可以指点下啊!
piaoxue105 回答时间:2018-10-8 11:51:49
仿真了下找到问题了,中断函数名错了,总是进入.S文件中的无限循环。把.S文件中的中断函数名改了下就可以了。
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版