OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2914|回复: 5

关于STM32F429 串口中断发送数据问题

[复制链接]

12

主题

32

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
330
金钱
330
注册时间
2015-6-24
在线时间
124 小时
发表于 2019-9-18 17:30:03 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 _yi_feng_ 于 2019-9-18 17:32 编辑

各位大佬:    小弟最近STM32F429核心板上在调试串口通信,使用HAL库的中断方式,接收发送都是用中断,以下代码是初始化和回调函数:
void DeviceUart_Init(void)
{
       UART1_Handler.Instance        = USART1;                                            
         UART1_Handler.Init.BaudRate   = cDeviceBound;                                   
         UART1_Handler.Init.WordLength = UART_WORDLENGTH_8B;  
         UART1_Handler.Init.StopBits   = UART_STOPBITS_1;           
         UART1_Handler.Init.Parity     = UART_PARITY_NONE;                  
         UART1_Handler.Init.HwFlowCtl  = UART_HWCONTROL_NONE;  
         UART1_Handler.Init.Mode       = UART_MODE_TX_RX;                  
         HAL_UART_Init(&UART1_Handler);                                          
         
         HAL_UART_Receive_IT(&UART1_Handler, (u8 *)gstvDevice.RxBuffer, RXBUFFERSIZE)
}

void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{
  GPIO_InitTypeDef GPIO_Initure;

  if(huart->Instance == USART1)
  {
    __HAL_RCC_GPIOA_CLK_ENABLE();                        
    __HAL_RCC_USART1_CLK_ENABLE();        

    GPIO_Initure.Pin       = cDeviceRxPin;                        
    GPIO_Initure.Mode      = GPIO_MODE_AF_PP;               
    GPIO_Initure.Pull      = GPIO_PULLUP;               
    GPIO_Initure.Speed     = GPIO_SPEED_FAST;        
    GPIO_Initure.Alternate = GPIO_AF7_USART1;        
    HAL_GPIO_Init(cDeviceRxPort, &GPIO_Initure);           

    GPIO_Initure.Pin = cDeviceTxPin;        
    HAL_GPIO_Init(cDeviceTxPort, &GPIO_Initure);           

    HAL_NVIC_EnableIRQ(USART1_IRQn);        
    HAL_NVIC_SetPriority(USART1_IRQn,0,1);        
  }

}


void USART1_IRQHandler(void)
{
  u32 timeout=0;
         u32 maxDelay = 0x1FFFF;


         HAL_UART_IRQHandler(&UART1_Handler);
  timeout=0;
  while (HAL_UART_GetState(&UART1_Handler) != HAL_UART_STATE_READY)
  {
    timeout++;
    if(timeout>maxDelay)
    break;               
  }

  timeout=0;
  while(HAL_UART_Receive_IT(&UART1_Handler, (u8 *)gstvDevice.RxBuffer, RXBUFFERSIZE) != HAL_OK)
  {
    timeout++;
    if(timeout>maxDelay)
      break;        
  }
}


void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  if(huart->Instance == USART1)
  {
      DeviceRxcIsr();
  }
}


void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
  if(huart->Instance == USART1)
  {
    DeviceTxcIsr();
  }
}


数据发送函数用:HAL_UART_Transmit_IT();
发现每个数据间发送的时间大概30毫秒,
用HAL_UART_Transmit()这个函数是秒发,功能需要只能用这个HAL_UART_Transmit_IT()函数,请教下,这个时间要怎么修改,还是程序哪里出错了。
附串口发送,电脑接收时的数据。以下数据为SSCOM V5.13.1软件
[17:24:15.500]发→◇FC FD 80 04 03 01 02 03 87 □
[17:24:15.512]收←◆FC
[17:24:15.550]收←◆FD
[17:24:15.589]收←◆01
[17:24:15.628]收←◆20
[17:24:15.666]收←◆03
[17:24:15.704]收←◆01
[17:24:15.743]收←◆04
[17:24:15.782]收←◆00
[17:24:15.821]收←◆00
[17:24:15.860]收←◆00
[17:24:15.898]收←◆00
[17:24:15.936]收←◆02
[17:24:15.975]收←◆0F
[17:24:16.013]收←◆00
[17:24:16.052]收←◆00
[17:24:16.090]收←◆00
[17:24:16.129]收←◆00
[17:24:16.168]收←◆00
[17:24:16.206]收←◆00
[17:24:16.245]收←◆00
[17:24:16.284]收←◆00
[17:24:16.322]收←◆00
[17:24:16.361]收←◆00
[17:24:16.399]收←◆00
[17:24:16.438]收←◆00
[17:24:16.476]收←◆00
[17:24:16.516]收←◆00
[17:24:16.554]收←◆00
[17:24:16.592]收←◆03
[17:24:16.631]收←◆06
[17:24:16.669]收←◆00
[17:24:16.708]收←◆00
[17:24:16.747]收←◆00
[17:24:16.785]收←◆00
[17:24:16.824]收←◆00
[17:24:16.862]收←◆00
[17:24:16.901]收←◆2F
[17:24:16.980]收←◆FC FD 01 20 03 01 04 00 00 00 00 02 0F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 06 00 00 00 00 00 00 2F



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165508
金钱
165508
注册时间
2010-12-1
在线时间
2115 小时
发表于 2019-9-19 02:53:23 | 显示全部楼层
回复

使用道具 举报

12

主题

32

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
330
金钱
330
注册时间
2015-6-24
在线时间
124 小时
 楼主| 发表于 2019-9-19 10:15:18 | 显示全部楼层

原子哥,用历程把发送函数改成中断的函数,也是一样的,这是什么原因造成的呢。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165508
金钱
165508
注册时间
2010-12-1
在线时间
2115 小时
发表于 2019-9-20 02:28:36 | 显示全部楼层
_yi_feng_ 发表于 2019-9-19 10:15
原子哥,用历程把发送函数改成中断的函数,也是一样的,这是什么原因造成的呢。

发送不建议用中断,我没这么玩过
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

3

主题

312

帖子

0

精华

高级会员

Rank: 4

积分
907
金钱
907
注册时间
2011-10-19
在线时间
196 小时
发表于 2019-9-20 08:57:12 | 显示全部楼层
没有列出关键代码,没人帮得了你
回复

使用道具 举报

2

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
188
金钱
188
注册时间
2019-7-17
在线时间
48 小时
发表于 2019-9-20 09:20:30 | 显示全部楼层
看了下,首先不是很懂你想做什么,但是根据你的代码,说说我个人的理解吧
1.首先 HAL_UART_Transmit 应该是带了发送超时参数的,你可以通过源码看出,调用这个是当一帧数据发送,一次性全部发送出去( 使用while ),不干其他的事情,除非中断,在实际的产品,我接触的很少这么用,当一帧数据过长时,只有发送完毕了才做其他的事情,系统不具备实时性。
2.利用中断的话,就是比如发送一个字节的时候,发送之后,没必要 while 等待发送 TXE ,然后做其他的事情,一旦TXE置位,就中断了,再发送第二个字节,直到结束
3.当然,还有使用 DMA 等等
4.至于你纠结的字节间的时间,关联的因素不是唯一的,按照我的理解来说 正如你所说的同一帧数据 HAL_UART_Transmit 会比 HAL_UART_Transmit_IT 要快吧,毕竟前者一次发送

总的来说,串口发送,如果仅仅调试功能的话,可以用HAL库函数,产品化的,不建议使用,太繁琐,好的方向来说内部很严谨,可以学习他们的思路。我一般就是初始化才会使用HAL_XX_Init
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-16 14:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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