打印
[STM32H7]

【STM32H745I-DISCO试用】双核共享外设

[复制链接]
212|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
BinWin|  楼主 | 2025-3-30 17:28 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
  STM32H745是双核架构,那么如何共用同一个外设资源呢,厂家是有提供方法和例程的。
     打开例程文件夹内可以看到ResourcesManager_SharedResources的例程,也就是资源管理器的应用案例--共享资源。
     通过阅读readme.txt文件可知,该程序是在CM4和CM7的程序中同时使用USART3进行字符打印。CM4获取使用权限后,打印字符串,并在2S后释放资源。
CM7获取使用权限后,占用1S时间后释放,在PC的串口助手上就可以看到交替打印。
      
     很明显,同时使用是不可能的,那如何使两者都能使用呢?ST提供了资源管理器模块,也就是对一个资源列表的互斥管理。该例程中有如下相关函数使用

ResMgr_Status_t  ResMgr_Request ( uint32_t id, uint32_t flags, uint32_t prio, void *phandle)
ResMgr_Status_t  ResMgr_Release ( uint32_t id, uint32_t flags)
            即请求资源和释放资源。两个核对应的代码仅有占用时间的差别,其余相同,如下
  for (;;)
  {
    do
    {
      status =ResMgr_Request(RESMGR_ID_USART1, RESMGR_FLAGS_ACCESS_NORMAL  |\
        RESMGR_FLAGS_CPU2 , 0, NULL) ;
    }while (status == RESMGR_BUSY);

    /* Here We can use the resource */

    BSP_LED_On(LED2);

    if(HAL_UART_Init(&UartHandle) != HAL_OK)
    {
      /* Initialization Error */
      Error_Handler();
    }

    HAL_UART_Transmit(&UartHandle,CM4_Message,sizeof(CM4_Message),0xff);
    HAL_Delay(2000); /* To simulate the use of the resource*/
    if(HAL_UART_DeInit(&UartHandle) != HAL_OK)
    {
      /* Initialization Error */
      Error_Handler();
    }
    ResMgr_Release(RESMGR_ID_USART1, RESMGR_FLAGS_CPU2);

    BSP_LED_Off(LED2);
    HAL_Delay(100);
  }
        HAL_UART_Init()是配置串口参数,实际使用的是串口3,这个串口连接到STLINK的虚拟串口,打印信息也是这个串口。但和下面函数 中RESMGR_ID_USART1不是真实对应关系,这里有可能会带来误解。
status =ResMgr_Request(RESMGR_ID_USART1, RESMGR_FLAGS_ACCESS_NORMAL  |\
        RESMGR_FLAGS_CPU2 , 0, NULL) ;
      转到这个函数的内部,有RESMGR_TBL_LOCK()和RESMGR_TBL_UNLOCK(),这里就和其他库函数的__HAL_LOCK()类似了。其他是状态维护的代码。这里就用到HSEM,是一个硬件信号量。CM7加锁的资源,CM4是无法释放的。通过近似于互斥的管理方式,两个核轮流使用该资源。
     




使用特权

评论回复
沙发
jobszheng| | 2025-3-31 09:54 | 只看该作者
获取到使用权限了,仍然需要重新初始化一下吗?
是延续了之前的配置,还是必须要再 重新配置?
楼主有测试吗?

使用特权

评论回复
板凳
BinWin|  楼主 | 2025-3-31 21:03 | 只看该作者
jobszheng 发表于 2025-3-31 09:54
获取到使用权限了,仍然需要重新初始化一下吗?
是延续了之前的配置,还是必须要再 重新配置?
楼主有测试 ...

使用之前HAL_UART_Init(&UartHandle),使用之后HAL_UART_DeInit(&UartHandle)  是为了保证每次使用按照当前内核所需的配置参数来运行。例程使用配置完全一样,确实可以在进入循环之前HAL_UART_Init(&UartHandle) 一次就可以了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

65

帖子

0

粉丝