4691|11

2934

帖子

4

TA的资源

五彩晶圆(中级)

楼主
 

STM32 HAL库UART中断接收问题 [复制链接]

 

我使用STM32CubeMX生成了UART1的中断代码。 

  在文件stm32f0xx_it.c中生成了中断代码。为了验证是否发生中断,我使用了uart_irq变量来指示中断。在主循环中进行检验

/**
  * [url=home.php?mod=space&uid=159083]@brief[/url] This function handles USART1 global interrupt.
  */
void USART1_IRQHandler(void)
{
  /* USER CODE BEGIN USART1_IRQn 0 */
  uart_irq = 1;
  /* USER CODE END USART1_IRQn 0 */
  HAL_UART_IRQHandler(&huart1);
  /* USER CODE BEGIN USART1_IRQn 1 */

  /* USER CODE END USART1_IRQn 1 */
}
if(uart_irq == 0x01)
{
	 for(i=0;i<20;i++)
	 {
		printf("%c: \n",aRxBuffer[i],i);
	 }	
	 printf("Line a End\n");
	 uart_irq = 0x00;
}

在程序的主循环外使用HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer, 1);函数接收了一次。

程序开始没有看到有输出,当程序第一次接收到发送数据时,发现第一次可以接收到一个“字符”。但是后来就无法接收到任何字符了。

所以现在有两个疑问:

1、中断函数void USART1_IRQHandler(void)中的  HAL_UART_IRQHandler(&huart1);函数有什么用处。

2、为什么中断只发生了一次就不在发生了。

 

 

 

此帖出自stm32/stm8论坛

最新回复

我记得这是搞成的异步收发的样子,一会接收一会发送的,速度一高点很容易就出问题了。建议楼主看看同步方式。   详情 回复 发表于 2021-7-23 16:15
点赞 关注
 

回复
举报

6105

帖子

4

TA的资源

版主

沙发
 
本帖最后由 damiaa 于 2021-7-20 14:25 编辑

1,HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer, 1);是指让中断接受一个字符数据。

当收到1个字符数据后会触发HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){}函数。。

必须在这里面再调用HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer, 1);一次

才能接收下一个字符。

2,HAL_UART_IRQHandler(&huart1);就是接收处理串口1的数据,触发回调函数。

不用管,只管在回调函数中处理。

 

此帖出自stm32/stm8论坛
 
 

回复

2934

帖子

4

TA的资源

五彩晶圆(中级)

板凳
 
//二次发送相同的内容
abcdefghijklm

//第一次接收
h: 7d5 0
c: 846 1
d: 83d 2
e: 838 3
f: 7d8 4
g: 802 5
h: 83a 6
i: 85a 7
j: 7d9 8
k: 7d7 9
l: 818 10
m: 85a 11
g: 837 12
h: 83a 13
i: 816 14
j: 83e 15
k: 7d5 16
l: 7d2 17
m: 801 18
a: 7d4 19
Line a End
//第二次接收
b: 808 0
j: 7fe 1
k: 83a 2
l: 7e7 3
m: 7da 4
g: 7e6 5
h: 859 6
i: 816 7
j: 7fc 8
k: 803 9
l: 802 10
m: 85a 11
a: 7d3 12
b: 81a 13
c: 846 14
d: 849 15
e: 83c 16
f: 83c 17
g: 833 18
h: 806 19
Line a End

这是我将函数HAL_UART_Receive_IT(&huart1,aRxBuffer, 20);放到中断中的测试程序。我感觉HAL_UART_Receive_IT(&huart1,aRxBuffer, 20);函数中好像有个全局指针。

void USART1_IRQHandler(void)
{
  /* USER CODE BEGIN USART1_IRQn 0 */
  uart_irq = 1;
  /* USER CODE END USART1_IRQn 0 */
  HAL_UART_IRQHandler(&huart1);
  /* USER CODE BEGIN USART1_IRQn 1 */
  HAL_UART_Receive_IT(&huart1,aRxBuffer, 20);
  /* USER CODE END USART1_IRQn 1 */
}

 

此帖出自stm32/stm8论坛

点评

你这个写法不对。  详情 回复 发表于 2021-7-20 15:45
 
 

回复

1942

帖子

3

TA的资源

版主

4
 

2楼正解。STM32的HAL库就是像2楼说的,它是有个回调函数【HAL_UART_RxCpltCallback】,在这里面进行再次开启接受中断。

此帖出自stm32/stm8论坛

点评

是啊。还有就是每次最好接收一个产生中断。接收多个的话有一些问题。 比如发过来的是3个字符,接收20个才中断。那就麻烦了。要等到凑到20个才产生中断。  详情 回复 发表于 2021-7-20 16:23
 
 
 

回复

1942

帖子

3

TA的资源

版主

5
 
bigbat 发表于 2021-7-20 15:17 //二次发送相同的内容 abcdefghijklm //第一次接收 h: 7d5 0 c: 846 1 d: 83d 2 e: 838 3 f: 7d ...

你这个写法不对。

此帖出自stm32/stm8论坛
 
 
 

回复

6105

帖子

4

TA的资源

版主

6
 
w494143467 发表于 2021-7-20 15:45 2楼正解。STM32的HAL库就是像2楼说的,它是有个回调函数【HAL_UART_RxCpltCallback】,在这里面进行再次开 ...

是啊。还有就是每次最好接收一个产生中断。接收多个的话有一些问题。

比如发过来的是3个字符,接收20个才中断。那就麻烦了。要等到凑到20个才产生中断。

此帖出自stm32/stm8论坛

点评

由这个试验问一个衍生问题: USART1_IRQHandler这个中断是收到每一个字符就中断,还是收到第一个字符后才中断  详情 回复 发表于 2021-7-20 16:50
 
 
 

回复

2934

帖子

4

TA的资源

五彩晶圆(中级)

7
 
a: 7d6 0
b: 7d8 1
c: 802 2
d: 7d6 3
e: 83c 4
f: 804 5
g: 7d6 6
h: 83d 7
i: 83e 8
j: 804 9
k: 800 10
l: 809 11
m: 7d9 12
: 803 13
: 804 14
: 7d8 15
: 7d5 16
: 7d8 17
: 833 18
: 837 19
Line a End
a: 7d6 0
b: 7d6 1
c: 801 2
d: 804 3
e: 83c 4
f: 83c 5
g: 804 6
h: 83b 7
i: 7d9 8
j: 7d4 9
k: 839 10
l: 801 11
m: 83c 12
: 801 13
: 802 14
: 835 15
: 7d6 16
: 849 17
: 83e 18
: 7d6 19
Line a End

这是我修改后的代码,我在 stm32f0xx_it.c中增加了函数HAL_UART_RxCpltCallback

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  /* Prevent unused argument(s) compilation warning */
  
  /* NOTE : This function should not be modified, when the callback is needed,
            the HAL_UART_RxCpltCallback can be implemented in the user file
   */
      //HAL_UART_Transmit(&huart1, (uint8_t *)aRxBuffer, 1,0xFFFF);
      HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer, 13);
}

//main 
HAL_UART_Receive_IT(&huart1,aRxBuffer, 13);

说明接收正常,但是我把函数移到USART1_IRQHandler中效果一样。

void USART1_IRQHandler(void)
{
  /* USER CODE BEGIN USART1_IRQn 0 */
  uart_irq = 1;
  /* USER CODE END USART1_IRQn 0 */
  HAL_UART_IRQHandler(&huart1);
  /* USER CODE BEGIN USART1_IRQn 1 */
  HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer, 13);
  /* USER CODE END USART1_IRQn 1 */
}

现在问题是这两个有何区别

此帖出自stm32/stm8论坛
 
 
 

回复

2934

帖子

4

TA的资源

五彩晶圆(中级)

8
 

主要是想搞明白中断接收的规范流程,有没有谁给一个官方的例子。

此帖出自stm32/stm8论坛

点评

有源码,进去看就是了  详情 回复 发表于 2021-7-22 17:50
 
 
 

回复

2934

帖子

4

TA的资源

五彩晶圆(中级)

9
 
damiaa 发表于 2021-7-20 16:23 是啊。还有就是每次最好接收一个产生中断。接收多个的话有一些问题。 比如发过来的是3个字符,接收20 ...

由这个试验问一个衍生问题:

USART1_IRQHandler这个中断是收到每一个字符就中断,还是收到第一个字符后才中断

此帖出自stm32/stm8论坛

点评

HAL_UART_Receive_IT这个指出了接收多少个数产生中断。应该就是收到多少字符产生中断。 具体可以试一下。 改一下那个参数。  详情 回复 发表于 2021-7-20 16:55
 
 
 

回复

6105

帖子

4

TA的资源

版主

10
 
bigbat 发表于 2021-7-20 16:50 由这个试验问一个衍生问题: USART1_IRQHandler这个中断是收到每一个字符就中断,还是收到第一个字符 ...

HAL_UART_Receive_IT这个指出了接收多少个数产生中断。应该就是收到多少字符产生中断。

具体可以试一下。 改一下那个参数。

此帖出自stm32/stm8论坛
 
 
 

回复

4008

帖子

0

TA的资源

版主

11
 
bigbat 发表于 2021-7-20 16:42 主要是想搞明白中断接收的规范流程,有没有谁给一个官方的例子。

有源码,进去看就是了

此帖出自stm32/stm8论坛
 
 
 

回复

7608

帖子

2

TA的资源

五彩晶圆(高级)

12
 

我记得这是搞成的异步收发的样子,一会接收一会发送的,速度一高点很容易就出问题了。建议楼主看看同步方式。

此帖出自stm32/stm8论坛
 
个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表