硬汉嵌入式论坛

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

[客户分享] HAL库的几点问题分享

[复制链接]

7

主题

114

回帖

135

积分

初级会员

积分
135
发表于 2016-9-21 15:19:10 | 显示全部楼层 |阅读模式
1、 CAN 中断接收问题。
  1. HAL_StatusTypeDef HAL_CAN_Receive_IT(CAN_HandleTypeDef* hcan, uint8_t FIFONumber)
  2. {
  3.   uint32_t tmp = 0U;
  4.   
  5.   /* Check the parameters */
  6.   assert_param(IS_CAN_FIFO(FIFONumber));
  7.   
  8.   tmp = hcan->State;
  9.   if((tmp == HAL_CAN_STATE_READY) || (tmp == HAL_CAN_STATE_BUSY_TX))
  10.   {
  11.     /* Process locked */
  12.     __HAL_LOCK(hcan);
  13.   
  14.     if(hcan->State == HAL_CAN_STATE_BUSY_TX)
  15.     {
  16.       /* Change CAN state */
  17.       hcan->State = HAL_CAN_STATE_BUSY_TX_RX;
  18.     }
  19.     else
  20.     {
  21.       /* Change CAN state */
  22.       hcan->State = HAL_CAN_STATE_BUSY_RX;
复制代码
  1. HAL_StatusTypeDef HAL_CAN_Transmit(CAN_HandleTypeDef* hcan, uint32_t Timeout)
  2. {
  3.   uint32_t  transmitmailbox = 5U;
  4.   uint32_t tickstart = 0U;
  5.   /* Check the parameters */
  6.   assert_param(IS_CAN_IDTYPE(hcan->pTxMsg->IDE));
  7.   assert_param(IS_CAN_RTR(hcan->pTxMsg->RTR));
  8.   assert_param(IS_CAN_DLC(hcan->pTxMsg->DLC));
  9.   if(((hcan->Instance->TSR&CAN_TSR_TME0) == CAN_TSR_TME0) || \
  10.      ((hcan->Instance->TSR&CAN_TSR_TME1) == CAN_TSR_TME1) || \
  11.      ((hcan->Instance->TSR&CAN_TSR_TME2) == CAN_TSR_TME2))
  12.   {  
  13.     /* Process locked */
  14.     __HAL_LOCK(hcan);
  15.   
  16.     if(hcan->State == HAL_CAN_STATE_BUSY_RX)
  17.     {
  18.       /* Change CAN state */
  19.       hcan->State = HAL_CAN_STATE_BUSY_TX_RX;
  20.     }
  21.     else
  22.     {
复制代码
  1. #if (USE_RTOS == 1)
  2.   /* Reserved for future use */
  3.   #error "USE_RTOS should be 0 in the current HAL release"
  4. #else
  5.   #define __HAL_LOCK(__HANDLE__)                                           \
  6.                                 do{                                        \
  7.                                     if((__HANDLE__)->Lock == HAL_LOCKED)   \
  8.                                     {                                      \
  9.                                        return HAL_BUSY;                    \
  10.                                     }                                      \
  11.                                     else                                   \
  12.                                     {                                      \
  13.                                        (__HANDLE__)->Lock = HAL_LOCKED;    \
  14.                                     }                                      \
  15.                                   }while (0)
  16.   #define __HAL_UNLOCK(__HANDLE__)                                          \
  17.                                   do{                                       \
  18.                                       (__HANDLE__)->Lock = HAL_UNLOCKED;    \
  19.                                     }while (0)
  20. #endif /* USE_RTOS */
复制代码
     按照上面代码的逻辑 发送的时候不能开中断 ,开中断的时候不能发送,

按照官方给的例子,如下
  1. void HAL_CAN_RxCpltCallback(CAN_HandleTypeDef* CanHandle)
  2. {
  3.   if ((CanHandle->pRxMsg->StdId == 0x321)&&(CanHandle->pRxMsg->IDE == CAN_ID_STD) && (CanHandle->pRxMsg->DLC == 2))
  4.   {
  5.     LED_Display(CanHandle->pRxMsg->Data[0]);
  6.     ubKeyNumber = CanHandle->pRxMsg->Data[0];
  7.   }
  8.   
  9.   /* Receive */
  10.   if(HAL_CAN_Receive_IT(CanHandle, CAN_FIFO0) != HAL_OK)
  11.   {
  12.     /* Reception Error */
  13.     Error_Handler();
  14.   }
  15. }
复制代码
几乎每次中断一下就需要再开中断,当接收数据非常快的时候,我感觉就想发也发不了了,HAL_LOCK 一直调用。


无力吐槽下面的注释。
  1. /* Reserved for future use */
复制代码
  1. #if (USE_RTOS == 1)
  2. /* Reserved for future use */
  3. #error "USE_RTOS should be 0 in the current HAL release"
  4. #else
复制代码
复制代码
   
二、HAL_UART_Receive 问题
  1. while(huart->RxXferCount > 0U)
  2.     {
  3.       huart->RxXferCount--;
  4.       if(huart->Init.WordLength == UART_WORDLENGTH_9B)
  5.       {
  6.         if(UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_RXNE, RESET, tickstart, Timeout) != HAL_OK)
  7.         {
  8.           return HAL_TIMEOUT;
  9.         }
  10.         tmp = (uint16_t*) pData;
  11.         if(huart->Init.Parity == UART_PARITY_NONE)
  12.         {
  13.           *tmp = (uint16_t)(huart->Instance->DR & (uint16_t)0x01FFU);
  14.           pData +=2U;
  15.         }
  16.         else
  17.         {
  18.           *tmp = (uint16_t)(huart->Instance->DR & (uint16_t)0x00FFU);
  19.           pData +=1U;
  20.         }
  21.       }
复制代码
  1. while(huart->RxXferCount > 0U)
  2. {
  3. huart->RxXferCount--;
复制代码
假如  RxXferCount 是 8  很明显只会循环 7 下。
[s:139]

评分

参与人数 1 +5 收起 理由
eric2013 + 5

查看全部评分

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117564
QQ
发表于 2016-9-21 19:51:42 | 显示全部楼层
非常感谢楼主分享,加分[s:151]
回复

使用道具 举报

7

主题

114

回帖

135

积分

初级会员

积分
135
 楼主| 发表于 2016-9-26 16:15:26 | 显示全部楼层

回 eric2013 的帖子

eric2013:非常感谢楼主分享,加分[s:151]  (2016-09-21 19:51) 
HAL库  你们不是要推F7么,不知道你们有没有碰到类似这样问题。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117564
QQ
发表于 2016-9-26 16:26:53 | 显示全部楼层

回 maksim 的帖子

maksim:HAL库  你们不是要推F7么,不知道你们有没有碰到类似这样问题。 (2016-09-26 16:15) 
F7明年了再弄,今年没有精力了[s:142]
回复

使用道具 举报

7

主题

114

回帖

135

积分

初级会员

积分
135
 楼主| 发表于 2016-9-27 11:01:24 | 显示全部楼层

回 eric2013 的帖子

eric2013:F7明年了再弄,今年没有精力了[s:142] (2016-09-26 16:26) 
HAL 库的一些 收发处理很挫啊,实在没气力学下去了。 有没有稳定的标准库推荐来用用,F4 F1的。硬汉胸。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117564
QQ
发表于 2016-9-28 11:36:13 | 显示全部楼层

回 maksim 的帖子

maksim:HAL 库的一些 收发处理很挫啊,实在没气力学下去了。 有没有稳定的标准库推荐来用用,F4 F1的。硬汉胸。 (2016-09-27 11:01) 
我们F4的板子一直是用的标准库,挺好的,现在最新的是1.7.1版本了,今年5月底发布的
https://forum.anfulai.cn/forum.php?mod=viewthread&tid=19425
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-14 17:33 , Processed in 0.040624 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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