硬汉嵌入式论坛

 找回密码
 立即注册
查看: 773|回复: 4
收起左侧

[有问必答] 请教下,使用stm32L4S5xx 系列单片机,貌似uart3 中断触发有时不灵 ?

[复制链接]

610

主题

3063

回帖

4913

积分

至尊会员

积分
4913
发表于 2022-9-26 14:32:40 | 显示全部楼层 |阅读模式
本帖最后由 hpdell 于 2022-9-26 14:53 编辑

请教下,使用stm32L4S5xx 系列单片机,貌似uart3 中断触发有时不灵 ?

此款单片机一共有 6个 uart, 基本全用上了,目前实际测试发现 uart3 中断有时触发不了,不知道是怎么回事呀 ??

其他几个都可以

#define  USART_CR1_RXNEIE  USART_CR1_RXNEIE_RXFNEIE
#define  USART_CR1_TXEIE   USART_CR1_TXEIE_TXFNFIE

static void MX_USART3_UART_Init(void)
{
        UART_HandleTypeDef huart3 = {0};

  huart3.Instance = USART3;
        HAL_UART_DeInit(&huart3);
       
  huart3.Init.BaudRate = 19200;  // 115200;  因为外接 rfid 读卡器的默认波特率为 19200
  huart3.Init.WordLength = UART_WORDLENGTH_8B;
  huart3.Init.StopBits = UART_STOPBITS_1;
  huart3.Init.Parity = UART_PARITY_NONE;
  huart3.Init.Mode = UART_MODE_TX_RX;
  huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart3.Init.OverSampling = UART_OVERSAMPLING_16;
  huart3.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  huart3.Init.ClockPrescaler = UART_PRESCALER_DIV1;
  huart3.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  if (HAL_UART_Init(&huart3) != HAL_OK)
  {
    Error_Handler(__FILE__, __LINE__);
  }
  if (HAL_UARTEx_SetTxFifoThreshold(&huart3, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
  {
    Error_Handler(__FILE__, __LINE__);
  }
  if (HAL_UARTEx_SetRxFifoThreshold(&huart3, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
  {
    Error_Handler(__FILE__, __LINE__);
  }
  if (HAL_UARTEx_DisableFifoMode(&huart3) != HAL_OK)
  {
    Error_Handler(__FILE__, __LINE__);
  }
        SET_BIT(USART3->ICR, USART_ICR_TCCF);
        SET_BIT(USART3->RQR, USART_RQR_RXFRQ);
        SET_BIT(USART3->CR1, USART_CR1_RXNEIE);

}









  else if(uartHandle->Instance==USART3)
  {
    PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART3;
    PeriphClkInit.Usart3ClockSelection = RCC_USART3CLKSOURCE_PCLK1;
    if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
    {
      Error_Handler(__FILE__, __LINE__);
    }

    /* USART3 clock enable */
    __HAL_RCC_USART3_CLK_ENABLE();

    __HAL_RCC_GPIOC_CLK_ENABLE();
    /**USART3 GPIO Configuration
    PC4     ------> USART3_TX
    PC5     ------> USART3_RX
    */
    GPIO_InitStruct.Pin = GPS_TX_Pin|GPS_RX_Pin;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;    // GPIO_SPEED_FREQ_LOW
    HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

    /* USART3 interrupt Init */
    HAL_NVIC_SetPriority(USART3_IRQn, 7, 0);
    HAL_NVIC_EnableIRQ(USART3_IRQn);
  }        

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107128
QQ
发表于 2022-9-26 16:27:09 | 显示全部楼层
HAL_NVIC_SetPriority(USART3_IRQn, 7, 0);设置为 HAL_NVIC_SetPriority(USART3_IRQn,0, 0);试试
回复

使用道具 举报

610

主题

3063

回帖

4913

积分

至尊会员

积分
4913
 楼主| 发表于 2022-9-27 09:25:54 | 显示全部楼层
本帖最后由 hpdell 于 2022-9-27 09:31 编辑
eric2013 发表于 2022-9-26 16:27
HAL_NVIC_SetPriority(USART3_IRQn, 7, 0);设置为 HAL_NVIC_SetPriority(USART3_IRQn,0, 0);试试

试过了,貌似没有什么改善,还有其他哪些地方可以影响到这个串口啊 ??
我的系统中一共使用了 6个 uart , 是不是我的 uart 使用的太多了呀 ???
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107128
QQ
发表于 2022-9-27 13:28:41 | 显示全部楼层
hpdell 发表于 2022-9-27 09:25
试过了,貌似没有什么改善,还有其他哪些地方可以影响到这个串口啊 ??
我的系统中一共使用了 6个 uart ...

其它串口都关闭了,仅开这一个看看,排除大法。
回复

使用道具 举报

610

主题

3063

回帖

4913

积分

至尊会员

积分
4913
 楼主| 发表于 2022-9-27 16:24:25 | 显示全部楼层
eric2013 发表于 2022-9-27 13:28
其它串口都关闭了,仅开这一个看看,排除大法。



貌似发现问题所在了,

我定义的 uart 共用 结构体

typedef struct
{
        USART_TypeDef *uart;               
       
        uint8_t *pRxBuf;
        uint8_t *pRxBufBak;
       
        __IO uint8_t TimerCount;
        __IO uint8_t  RxEnd;
        __IO uint8_t  DataProcessFlag;   // 数据处理标志,=1 表示接收成功,可以处理数据了,=0表示接收没有成功或数据已经处理完毕
        __IO uint16_t usRxBufSize;
        __IO uint16_t usRxWrite;
        __IO uint16_t usRxRead;
        __IO uint16_t usRxCount;
        __IO uint16_t usRxCountGet;
} _UART_T;




然后又定义了一个 结构体
typedef        struct
{



        _GPRS_TypeDef  gprs;
        _GPS_TypeDef   gps;
        _RTC_TypeDef   RtcTime;
//        _RTC_TypeDef   RtcTime_rtc;

        _FLASH_TypeDef flash;
        _BMA253_TypeDef bma253;
        _FIBER_TypeDef fiber;

        _BH1750_TypeDef  bh1750;
       
_UART_T   _debug_info;
... ....  一共定义了 6个 uart

}  _APP_TypeDef;


最后再定义了一个联合体类型的

union SYSINFORMATION
{       
        _APP_TypeDef   InfoData;
        uint8_t        InfoDataBuff[sizeof(_APP_TypeDef)];
};


貌似这样使用 的话,就会导致 uart 中断 会异常

///////////////////////////////////////////////////////////////////////////////////

我重新单独定义了 6个 uart
_UART_T   _debug_info;
... ....  一共定义了 6个 uart


貌似可以解决了,具体的还有待测试看看







回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-19 18:49 , Processed in 0.222274 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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