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

STM32F030F4 UART1无法进入中断

[复制链接]
picuser 提问时间:2021-1-4 09:08 /
请问使用STM32F030F4并设定PA2(TX),PA3(RX)为UART
并使用中断接收,却都进不去UART接收中断
但若在主回圈while(1)内加入
printf(" ");
却可以进入中断接收数据
故请问这是哪边出了问题?

STM32CubeMX:5.4
Firmware:STM32Cube_FW_F0_V1.11.2
Keil:5.27
HAL Library

收藏 1 评论22 发布时间:2021-1-4 09:08

举报

22个回答
picuser 回答时间:2021-1-4 14:18:38
安 发表于 2021-1-4 14:00
楼主把配置发一下,接收中端有数据的时候才会产生中端。如果发送时产生中断,查一下是不是开启了发送中断。 ...

相关配置如下 (由CubeMX产生)
*******************************************************
static void MX_USART1_UART_Init(void)
{

  /* USER CODE BEGIN USART1_Init 0 */

  /* USER CODE END USART1_Init 0 */

  /* USER CODE BEGIN USART1_Init 1 */

  /* USER CODE END USART1_Init 1 */
  huart1.Instance = USART1;
  huart1.Init.BaudRate = 100000;
  huart1.Init.WordLength = UART_WORDLENGTH_8B;
  huart1.Init.StopBits = UART_STOPBITS_2;
  huart1.Init.Parity = UART_PARITY_EVEN;
  huart1.Init.Mode = UART_MODE_TX_RX;
  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_RXINVERT_INIT;
  huart1.AdvancedInit.RxPinLevelInvert = UART_ADVFEATURE_RXINV_ENABLE;
  if (HAL_UART_Init(&huart1) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN USART1_Init 2 */
  __HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE);  //使用接收中断及闲置中断,自行加入
  __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);  //使用接收中断及闲置中断,自行加入

  /* USER CODE END USART1_Init 2 */

}

/**
  * @brief GPIO Initialization Function
  * @param None
  * @retval None
  */
static void MX_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOF_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOB_CLK_ENABLE();

  /*Configure GPIO pins : PA0 PA1 PA5 */
  GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_5;
  GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */
************************************************************

确定硬件没问题
因为主回圈加入printf(" ");
程序就可正常运行
怀疑是不是HAL库没写到UART映射到PA2,PA3相关的指令
造成收不到资料而不进中断
但加入printf(" ");就正常
如下
***********************************************************
int main(void)
{
  /* USER CODE BEGIN 1 */
  /* USER CODE END 1 */
  /* MCU Configuration--------------------------------------------------------*/
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();
  /* USER CODE BEGIN Init */
  /* USER CODE END Init */
  /* Configure the system clock */
  SystemClock_Config();
  /* USER CODE BEGIN SysInit */
  /* USER CODE END SysInit */
  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
//  FLashProtectCheck();
  HAL_SYSTICK_Config(SystemCoreClock/1000);
  /* USER CODE END 2 */
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
    /* USER CODE BEGIN 3 */
    printf(" ");                   //加入此行就正常
    do something.........
  }
  /* USER CODE END 3 */
}
******************************************************************
非常奇怪的问题
请教一下有没有高人知道这是甚么问题?




picuser 回答时间:2021-1-5 08:39:48
radio2radio 发表于 2021-1-4 18:26
不知是不是因为初始化没有打开接收中断,参考:
https://www.stmcu.org.cn/module/forum/thread-616613-1-1 ...

在串口初始函数有加入开启中断如下
static void MX_USART1_UART_Init(void)
{
  .....
  ....
  /* USER CODE BEGIN USART1_Init 2 */
  __HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE);
  __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
  /* USER CODE END USART1_Init 2 */
  ....
  .....
}

且怀疑只进中断一次
也在接收中断函数里
再加入开启接收中断
__HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE);
__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
结果还是一样
picuser 回答时间:2021-1-4 14:57:21
安 发表于 2021-1-4 14:32
从代码上看没有问题,楼主串口中断数据传输时才会产生中断。串口的RX和TX是连接到电脑的串口上了吗?怎么连 ...

串口的RX和TX是连接到电脑的串口上了吗?怎么连接的?
-------------------------------------------
串口是经过CP2102转USB线连接电脑

******************分隔线************************
如何确定的接收中断不能接收数据?
-----------------------------
在接收中断函数内
有加打印指令
printf("enter ISR");
但没打印出
而主回圈while(1)内加printf(" "):
就会打印出"enter ISR"
且接收数据都正常
主程式也可正常运行
废鱼 回答时间:2021-1-4 14:00:33
楼主把配置发一下,接收中端有数据的时候才会产生中端。如果发送时产生中断,查一下是不是开启了发送中断。
废鱼 回答时间:2021-1-4 14:32:27
从代码上看没有问题,楼主串口中断数据传输时才会产生中断。串口的RX和TX是连接到电脑的串口上了吗?怎么连接的?如何确定的接收中断不能接收数据?
废鱼 回答时间:2021-1-4 15:45:12
2102的RX和TX与ST如何连接?正常应该是串口工具发送数据到ST,用示波器看一下RX引脚是否有数据传输过来。
picuser 回答时间:2021-1-4 16:10:40
安 发表于 2021-1-4 15:45
2102的RX和TX与ST如何连接?正常应该是串口工具发送数据到ST,用示波器看一下RX引脚是否有数据传输过来。 ...

2102与MCU连接是没问题的
测试时
电脑端是一直发送资料
USB及UART串口接线都没变
只要主回圈加入printf(" ");及可正常传输资料
这就很闷*_*p

甚至
整个CubeMX项目也重新设定产生
也是一样
picuser 回答时间:2021-1-4 16:28:06
另请问一下
STM32F0 HAL库里
若Pin脚使用映射

static void MX_USART1_UART_Init(void)
是否有针对映射脚做设定?

在LL库上
是有相关的设定
可不知FO HAL库是否也有?
废鱼 回答时间:2021-1-4 17:40:22
HAL库在串口配置时会重新映射的。注意RX接TX,TX接RX。
radio2radio 回答时间:2021-1-4 18:26:59
不知是不是因为初始化没有打开接收中断,参考:
https://www.stmcu.org.cn/module/forum/thread-616613-1-1.html
kylixyao 回答时间:2021-1-4 19:26:19
波特率设置很有意思
picuser 回答时间:2021-1-5 09:08:39
kylixyao 发表于 2021-1-4 19:26
波特率设置很有意思

这是使用SBUS协议设定
小歆-2051663 回答时间:2021-1-5 09:43:31
  1. __HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE);
  2. __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
复制代码


不是很明白楼主这样写用意是什么

为什么不直接用库函数实现接收数据:

  1. HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
复制代码
水晶之泪0517 回答时间:2021-1-5 09:45:14
清理一下接收溢出试试,LL_USART_ClearFlag_ORE(USARTx);
12下一页

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版