STM32的分时复用(以STM32G431RBT6为例)

一.分时复用简介

        单片机中的分时复用也被称为前后台系统。分时复用是一种资源共享的方法,可以用来处理多个任务或事件。分时复用通过时间分割的方式,将总的时间划分为多个小的时间段,每个时间段称为一个时间片。然后,系统按照一定的规则将这些时间片分配给不同的任务或事件。在实际工程中,我们将每一个模块视作一个任务,分时复用将这些任务轮询执行,使得整个工程的逻辑更加明朗,清晰。

二.STM32中的实例(试用HAL库)

1.SysTick(系统滴答定时器)

内核级外设,为单片机提供稳定的时钟基准,

 初始化中将SysTick设置为最低优先级,即可以被任一中断打断

2.中断处理函数

当发生由SysTick产生的中断后执行void SysTick_Handler(void)函数。

void SysTick_Handler(void)
{
  /* USER CODE BEGIN SysTick_IRQn 0 */

  /* USER CODE END SysTick_IRQn 0 */
  HAL_IncTick();
  /* USER CODE BEGIN SysTick_IRQn 1 */
  

    /* USER CODE END SysTick_IRQn 1 */
}

该函数默认的样子,用户可以更具自身需求在其中添加中断后的代码;先讲一下HAL_IncTick();

__weak void HAL_IncTick(void)
{
  uwTick += uwTickFreq;
}

这个函数被调用来增加一个全局变量“uwTick”作为应用程序的基准时间。在默认实现中,该变量在SysTick ISR中每隔一毫秒增加一次,即SysTick每一毫秒产生一次中断,在stm32g4xx_hal.c中将将HAL_TICK_FREQ_DEFAULT赋值给uwTickFreq,

uint32_t uwTickFreq = HAL_TICK_FREQ_DEFAULT;  /* 1KHz */

而HAL_TICK_FREQ_DEFAULT是一个定义在stm32g4xx_hal.h中的宏

#define HAL_TICK_FREQ_10HZ         100U
#define HAL_TICK_FREQ_100HZ        10U
#define HAL_TICK_FREQ_1KHZ         1U
#define HAL_TICK_FREQ_DEFAULT      HAL_TICK_FREQ_1KHZ

因此我们可以将中断时间设置为官方推荐的1ms,10ms,100ms;

在stm32g4xx_it.h中创建两个结构体,分别用来保存对各个任务的扫描时间和执行标志位

struct GLOBALVariable1{
    uint8_t  LED_Taskflag;
};
struct GLOBALVariable2{
    uint8_t  LED_Taskflag_count;
};

在stm32g4xx_it.c中定义类型为上述结构体的变量

struct GLOBALVariable1 GLOBAL_TASKFLAG;
struct GLOBALVariable2 GLOBAL_TASKFLAG_Count;

以下为后台逻辑

void SysTick_Handler(void)
{
  /* USER CODE BEGIN SysTick_IRQn 0 */
  /* USER CODE END SysTick_IRQn 0 */
  HAL_IncTick();
  /* USER CODE BEGIN SysTick_IRQn 1 */
    if(GLOBAL_TASKFLAG_Count.LED_Taskflag_count==99) {
        GLOBAL_TASKFLAG_Count.LED_Taskflag_count=0;
         GLOBAL_TASKFLAG.LED_Taskflag=1;
    }
    else{
        GLOBAL_TASKFLAG_Count.LED_Taskflag_count++;
    }
    /* USER CODE END SysTick_IRQn 1 */
}

每100毫秒将LED_Taskflag置1,即执行LED任务的标志位

extern struct GLOBALVariable1 GLOBAL_TASKFLAG;

while (1)
  {
      if(GLOBAL_TASKFLAG.LED_Taskflag)
      {
          HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_8);
          HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
          HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
          HAL_Delay(500);
          GLOBAL_TASKFLAG.LED_Taskflag=0;
      }

    /* USER CODE END WHILE */
    /* USER CODE BEGIN 3 */
  }

在前台中如果LED任务的标志位成立就执行LED相关逻辑函数,之后清0;

以上,为本人对分时复用的一些浅显的认识,文章有任何不足之处还请在评论区指出。

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FPGA实现分时复用是通过将一个大型的FPGA划分成多个小块的FPGA来实现的。这种思想在增量编译中被广泛应用。增量编译是为了解决FPGA开发过程中综合和布局布线的长耗时性而提出的。具体来说,FPGA被切割成多个小块,每个小块被约定放置什么模块、实现什么功能,从物理上进行界定。当工程被修改后,开发平台会检测哪些小块内没有进行修改,哪些进行了修改,然后只重新综合和布局布线修改过的部分,以节省时间。这种方式可以实现分时复用,即在不重新编译整个工程的情况下,只对修改过的部分进行编译和实现。 此外,FPGA的多片模式也可以实现分时复用。其中一种多片模式采用菊花链的思想,多个FPGA共享一个存储器。另一种多片模式是使用其他存储器来配置不同的FPGA。在共享型结构中,主FPGA和从FPGA通过串行主模式进行配置,后面的FPGA的配置通过第一个配置好的FPGA上的微处理器进行协调。这样,可以实现多片FPGA的分时复用。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [FPGA开发流程:详述每一环节的物理含义和实现目标](https://blog.csdn.net/limanjihe/article/details/52435983)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值