硬汉嵌入式论坛

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

[TIMER] STM32H7的PWM + DMA突发模式实现定时器寄存器的批量更新

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106738
QQ
发表于 2018-8-15 01:07:05 | 显示全部楼层 |阅读模式
说明:

定时器里面有个DMAR寄存器,实现定时器相关寄存器的批量更新就靠这个寄存器了,DMA的突发长度和偏移地址是通过DCD寄存器实现。

官方这个例子是将const uint32_t aSRC_Buffer[3] = {0x00000FFF, 0x00000000, 0x00000555}三个数值在每个DMA更新请求后以此刷新ARR,RCR和CCR1寄存器。

而实现这个功能的关键就是调用函数HAL_TIM_DMABurst_WriteStart


效果:
0000.png


代码:
  1. /* Private typedef -----------------------------------------------------------*/
  2. /* Private define ------------------------------------------------------------*/
  3. /* Private macro -------------------------------------------------------------*/
  4. /* Private variables ---------------------------------------------------------*/
  5. /* Timer handler declaration */
  6. TIM_HandleTypeDef    TimHandle;

  7. /* Timer Output Compare Configuration Structure declaration */
  8. TIM_OC_InitTypeDef sConfig;

  9. /* Capture Compare buffer */
  10. const uint32_t aSRC_Buffer[3] = {0x00000FFF, 0x00000000, 0x00000555};

  11. /* Timer Period*/
  12. uint32_t uwTimerPeriod  = 0;

  13. /* Private function prototypes -----------------------------------------------*/
  14. static void SystemClock_Config(void);
  15. static void Error_Handler(void);
  16. static void CPU_CACHE_Enable(void);

  17. /* Private functions ---------------------------------------------------------*/

  18. /**
  19.   * @brief  Main program.
  20.   * @param  None
  21.   * @retval None
  22.   */
  23. int main(void)
  24. {
  25.   /* STM32H7xx HAL library initialization:
  26.        - Systick timer is configured by default as source of time base, but user
  27.          can eventually implement his proper time base source (a general purpose
  28.          timer for example or other time source), keeping in mind that Time base
  29.          duration should be kept 1ms since PPP_TIMEOUT_VALUEs are defined and
  30.          handled in milliseconds basis.
  31.        - Set NVIC Group Priority to 4
  32.        - Low Level Initialization
  33.      */

  34.   /* Enable the CPU Cache */
  35.   CPU_CACHE_Enable();
  36.   
  37.   HAL_Init();

  38.   /* Configure the system clock to 400 MHz */
  39.   SystemClock_Config();

  40.   /* Configure LED2 */
  41.   BSP_LED_Init(LED2);

  42. /*##-1- Configure the TIM peripheral #######################################*/
  43.   /* -----------------------------------------------------------------------
  44.     TIM2 Configuration: generate 1 PWM signal using the DMA burst mode:
  45.    
  46.     TIM2 input clock (TIM2CLK) is set to APB1 clock (PCLK1)x2, since APB1
  47.     prescaler is 2.
  48.     TIM2CLK = 2*PCLK1
  49.     PCLK1 = HCLK/2 since AHB1 prescaler also is set to 2.
  50.     => TIM2CLK = HCLK = SystemCoreClock/2
  51.    
  52.     To get TIM2 counter clock at 20 MHz, the prescaler is computed as follows:
  53.       Prescaler = (TIM2CLK / TIM2 counter clock) - 1
  54.       Prescaler = ((SystemCoreClock/2) /20 MHz) - 1
  55.   
  56.     The TIM2 Frequency = TIM2 counter clock/(ARR + 1)
  57.                        = 20 MHz / 4096 = 4.88 KHz
  58.     TIM2 Channel1 duty cycle = (TIM2_CCR1/ TIM2_ARR)* 100 = 33.33%
  59.   
  60.     Note:
  61.      SystemCoreClock variable holds HCLK frequency and is defined in system_stm32h7xx.c file.
  62.      Each time the core clock (HCLK) changes, user had to update SystemCoreClock
  63.      variable value. Otherwise, any configuration based on this variable will be incorrect.
  64.      This variable is updated in three ways:
  65.       1) by calling CMSIS function SystemCoreClockUpdate()
  66.       2) by calling HAL API function HAL_RCC_GetSysClockFreq()
  67.       3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency  
  68.   ----------------------------------------------------------------------- */
  69.   
  70.   TimHandle.Instance = TIM2;
  71.   
  72.   TimHandle.Init.Period            = 0xFFFF;
  73.   TimHandle.Init.Prescaler         = ((SystemCoreClock/2) / (20 * 1000000)) - 1;
  74.   TimHandle.Init.ClockDivision     = 0;
  75.   TimHandle.Init.CounterMode       = TIM_COUNTERMODE_UP;
  76.   if(HAL_TIM_PWM_Init(&TimHandle) != HAL_OK)
  77.   {
  78.     /* Initialization Error */
  79.     Error_Handler();
  80.   }
  81.   
  82.   /*##-2- Configure the PWM channel 1 ########################################*/
  83.   sConfig.OCMode     = TIM_OCMODE_PWM1;
  84.   sConfig.OCPolarity = TIM_OCPOLARITY_HIGH;
  85.   sConfig.Pulse      = 0xFFF;
  86.   if(HAL_TIM_PWM_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_1) != HAL_OK)
  87.   {
  88.     /* Configuration Error */
  89.     Error_Handler();
  90.   }
  91.   
  92.   /*##-3- Start PWM signal generation in DMA mode ############################*/
  93.   if(  HAL_TIM_PWM_Start(&TimHandle, TIM_CHANNEL_1) != HAL_OK)
  94.   {
  95.     /* Starting PWM generation Error */
  96.     Error_Handler();
  97.   }
  98.   
  99.   /*##-4- Start DMA Burst transfer ###########################################*/
  100.   HAL_TIM_DMABurst_WriteStart(&TimHandle, TIM_DMABASE_ARR, TIM_DMA_UPDATE,
  101.                               (uint32_t*)aSRC_Buffer, TIM_DMABURSTLENGTH_3TRANSFERS);
  102.   
  103.   /* Infinite loop */
  104.   while (1)
  105.   {
  106.   }


  107. }
复制代码




回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106738
QQ
 楼主| 发表于 2018-8-15 01:07:49 | 显示全部楼层
二代示波器也测量一下,效果完美
QQ截图20180815010822.png



回复

使用道具 举报

36

主题

2039

回帖

2147

积分

至尊会员

积分
2147
发表于 2018-8-15 09:47:44 | 显示全部楼层
eric2013 发表于 2018-8-15 01:07
二代示波器也测量一下,效果完美

666
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

0

主题

77

回帖

77

积分

初级会员

积分
77
发表于 2022-10-31 23:01:04 | 显示全部楼层
硬汉哥。你好。
在F4的官方例程中也看到了这个例子。但实际测试时,发现只能burst传输一次?仿真状态下修改aSRC_Buffer的值,并没有看到对应的ARR,RCR,CCR1寄存器的值有变化(只有第一次成功刷新到了对应的寄存器中)。请问是哪里还需要设置吗?

另外,请教一下,我想用这种方式实现输出任意频率和个数的脉冲。不知这种方案是否是优选 方案。
也看了您在H7上关于《V7-DMAMUX的定时器触+DMA双缓冲控制任意IO做PWM和脉冲数控制》的例程,但感觉虽然脉冲个数可控制,但频率不太好控制,尤其是任意频率,并且是多路频率不同的情况。

所以向您请教,请指点。谢谢。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106738
QQ
 楼主| 发表于 2022-11-1 05:24:54 | 显示全部楼层
艾那的小强 发表于 2022-10-31 23:01
硬汉哥。你好。
在F4的官方例程中也看到了这个例子。但实际测试时,发现只能burst传输一次?仿真状态下修 ...

1、F4的正常,之前测试过
2、不同通道频率跨度比较大的话,略不方便,不大的话,很方便。
回复

使用道具 举报

0

主题

77

回帖

77

积分

初级会员

积分
77
发表于 2022-11-1 10:30:19 | 显示全部楼层
eric2013 发表于 2022-11-1 05:24
1、F4的正常,之前测试过
2、不同通道频率跨度比较大的话,略不方便,不大的话,很方便。

谢谢回复。
我找到问题原因了。要在void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)函数中,主动调用HAL_TIM_DMABurst_WriteStop,然后修改aSRC_Buffer中的值,然后再次调用HAL_TIM_DMABurst_WriteStart。
[C] 纯文本查看 复制代码
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if (htim->Instance == TIM2)
    {
        HAL_TIM_DMABurst_WriteStop(&TimHandle, TIM_DMA_UPDATE);
        HAL_TIM_DMABurst_WriteStart(&TimHandle, TIM_DMABASE_ARR, TIM_DMA_UPDATE,
                              (uint32_t*)aSRC_Buffer, TIM_DMABURSTLENGTH_3TRANSFERS);
    }
}

但这样的话,感觉和中断更新这几个寄存器值又有什么区别呢?DMA的高效并没有体现出来吧。
《V7-DMAMUX的定时器触+DMA双缓冲控制任意IO做PWM和脉冲数控制》这个例程中的双缓冲才是我想要的。所以,如果使用双缓冲去更新ARR,RCR,CCR1这几个寄存器的话,可以参考你这个例程吧?
回复

使用道具 举报

0

主题

77

回帖

77

积分

初级会员

积分
77
发表于 2022-11-1 12:27:19 | 显示全部楼层
目前想明白了,我想要的其实是DMA双缓冲,同时又支持Burst。但刚刚又在官方例程上测试了一下,测试不通过。
代码修改是:HAL_TIM_DMABurst_WriteStart函数中置位DMA_SxCR->DBM,并设置M1AR寄存器为另一个数组地址。
实际运行结果像是运行在FIFO模式。
所以,DMA双缓冲和Burst是两种工作模式,不能同时使用吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106738
QQ
 楼主| 发表于 2022-11-2 09:53:51 | 显示全部楼层
艾那的小强 发表于 2022-11-1 12:27
目前想明白了,我想要的其实是DMA双缓冲,同时又支持Burst。但刚刚又在官方例程上测试了一下,测试不通过。 ...

可以的,使用DMA传输完成中断和传输完成中断。
回复

使用道具 举报

0

主题

77

回帖

77

积分

初级会员

积分
77
发表于 2022-11-2 16:47:37 | 显示全部楼层
硬汉哥,你说的是传输完成中断和半传输完成中断吗?
我在H7平台上,使用官方的(即你在1楼贴的代码)基础上,稍作了修改,如果使用hdma_tim.Init.Mode = DMA_NORMAL;的话,则Burst的行为是对的。但是当缓冲区Burst完毕,DMA就停止了,不能再继续了。但如果改成hdma_tim.Init.Mode = DMA_CIRCULAR;则每次Burst变成了1个Word。代码贴在下面。
main.c
[C] 纯文本查看 复制代码
/* Includes ------------------------------------------------------------------*/
#include "main.h"

/** @addtogroup STM32H7xx_HAL_Examples
  * @{
  */

/** @addtogroup TIM_DMABurst
  * @{
  */

/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Timer handler declaration */
TIM_HandleTypeDef    TimHandle;

/* Timer Output Compare Configuration Structure declaration */
TIM_OC_InitTypeDef sConfig;

/* Capture Compare buffer */
uint32_t aSRC_Buffer[6] = {0x0000FFFF, 0x00000fff, 0x00000555,0x0000FFFF, 0x00000fff, 0x00000556};


/* Timer Period*/
uint32_t uwTimerPeriod  = 0;

/* Private function prototypes -----------------------------------------------*/
static void MPU_Config(void);
static void SystemClock_Config(void);
static void Error_Handler(void);
static void CPU_CACHE_Enable(void);

/* Private functions ---------------------------------------------------------*/

/**
  * @brief  Main program.
  * @param  None
  * @retval None
  */
int main(void)
{
  /* STM32H7xx HAL library initialization:
       - Systick timer is configured by default as source of time base, but user 
         can eventually implement his proper time base source (a general purpose 
         timer for example or other time source), keeping in mind that Time base 
         duration should be kept 1ms since PPP_TIMEOUT_VALUEs are defined and 
         handled in milliseconds basis.
       - Set NVIC Group Priority to 4
       - Low Level Initialization
     */

  /* Configure the MPU attributes */
  MPU_Config();

  /* Enable the CPU Cache */
  CPU_CACHE_Enable();
  
  HAL_Init();

  /* Configure the system clock to 400 MHz */
  SystemClock_Config();

  /* Configure LED2 */
  BSP_LED_Init(LED2);

/*##-1- Configure the TIM peripheral #######################################*/ 
  /* -----------------------------------------------------------------------
    TIM2 Configuration: generate 1 PWM signal using the DMA burst mode:
   
    TIM2 input clock (TIM2CLK) is set to APB1 clock (PCLK1)x2, since APB1
    prescaler is 2.
    TIM2CLK = 2*PCLK1
    PCLK1 = HCLK/2 since AHB1 prescaler also is set to 2.
    => TIM2CLK = HCLK = SystemCoreClock/2
    
    To get TIM2 counter clock at 20 MHz, the prescaler is computed as follows:
      Prescaler = (TIM2CLK / TIM2 counter clock) - 1
      Prescaler = ((SystemCoreClock/2) /20 MHz) - 1
  
    The TIM2 Frequency = TIM2 counter clock/(ARR + 1)
                       = 20 MHz / 4096 = 4.88 KHz
    TIM2 Channel1 duty cycle = (TIM2_CCR1/ TIM2_ARR)* 100 = 33.33%
  
    Note: 
     SystemCoreClock variable holds HCLK frequency and is defined in system_stm32h7xx.c file.
     Each time the core clock (HCLK) changes, user had to update SystemCoreClock 
     variable value. Otherwise, any configuration based on this variable will be incorrect.
     This variable is updated in three ways:
      1) by calling CMSIS function SystemCoreClockUpdate()
      2) by calling HAL API function HAL_RCC_GetSysClockFreq()
      3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency  
  ----------------------------------------------------------------------- */
  
  TimHandle.Instance = TIM2;
  
  TimHandle.Init.Period            = 0xFFFF;
  TimHandle.Init.Prescaler         = ((SystemCoreClock/2) / (1000)) - 1;
  TimHandle.Init.ClockDivision     = 0;
  TimHandle.Init.CounterMode       = TIM_COUNTERMODE_UP;
  if(HAL_TIM_PWM_Init(&TimHandle) != HAL_OK)
  {
    /* Initialization Error */
    Error_Handler();
  }
  
  /*##-2- Configure the PWM channel 1 ########################################*/ 
  sConfig.OCMode     = TIM_OCMODE_PWM1;
  sConfig.OCPolarity = TIM_OCPOLARITY_HIGH;
  sConfig.Pulse      = 0xFFF;
  if(HAL_TIM_PWM_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_1) != HAL_OK)
  {
    /* Configuration Error */
    Error_Handler();
  }

  /*##-3- Start PWM signal generation in DMA mode ############################*/ 
  if(  HAL_TIM_PWM_Start(&TimHandle, TIM_CHANNEL_1) != HAL_OK)
  {
    /* Starting PWM generation Error */
    Error_Handler();
  }
  
  /*##-4- Start DMA Burst transfer ###########################################*/ 
  //HAL_TIM_DMABurst_WriteStart(&TimHandle, TIM_DMABASE_ARR, TIM_DMA_UPDATE,
  //                            (uint32_t*)aSRC_Buffer, TIM_DMABURSTLENGTH_3TRANSFERS);
  HAL_TIM_DMABurst_MultiWriteStart(&TimHandle, TIM_DMABASE_ARR, TIM_DMA_UPDATE,
                              (uint32_t*)aSRC_Buffer, TIM_DMABURSTLENGTH_3TRANSFERS, 6);
  
  /* Infinite loop */
  while (1)
  {
  }


}

void DMA1_Stream1_IRQHandler(void)
{
	/* 传输完成中断 */
	if((DMA1->LISR & DMA_FLAG_TCIF1_5) != RESET)
	{
		/* 清除标志 */
		DMA1->LIFCR = DMA_FLAG_TCIF1_5;
        //增加这几行,当首次进入这里后,DMA 第次Burst 3个word变成了每次Burst 1个word
        DMA1_Stream1->CR &= ~DMA_SxCR_EN;
        DMA1_Stream1->NDTR = 6;
        DMA1_Stream1->CR |= DMA_SxCR_EN;
	}

	/* 半传输完成中断 */    
	if((DMA1->LISR & DMA_FLAG_HTIF1_5) != RESET)
	{
		/* 清除标志 */
		DMA1->LIFCR = DMA_FLAG_HTIF1_5;
	}

	/* 传输错误中断 */
	if((DMA1->LISR & DMA_FLAG_TEIF1_5) != RESET)
	{
		/* 清除标志 */
		DMA1->LIFCR = DMA_FLAG_TEIF1_5;
	}

	/* 直接模式错误中断 */
	if((DMA1->LISR & DMA_FLAG_DMEIF1_5) != RESET)
	{
		/* 清除标志 */
		DMA1->LIFCR = DMA_FLAG_DMEIF1_5;
	}
}


stm32h7xx_hal_msp.c
[C] 纯文本查看 复制代码
void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)
{
  GPIO_InitTypeDef   GPIO_InitStruct;
  static DMA_HandleTypeDef  hdma_tim;

  /*##-1- Enable peripherals and GPIO Clocks #################################*/
  /* TIMx clock enable */
  TIMx_CLK_ENABLE();

  /* Enable GPIO Channel3/3N Clocks */
  TIMx_CHANNEL1_GPIO_CLK_ENABLE();

  /* Enable DMA clock */
  DMAx_CLK_ENABLE();

  /* Configure TIM2_Channel1 in output, push-pull & alternate function mode */
  GPIO_InitStruct.Pin = GPIO_PIN_CHANNEL1;
  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  GPIO_InitStruct.Alternate = GPIO_AF_TIMx;
  HAL_GPIO_Init(TIMx_GPIO_CHANNEL1_PORT, &GPIO_InitStruct);


  /* Set the parameters to be configured */
  hdma_tim.Init.Request = DMA_REQUEST_TIM2_UP;
  hdma_tim.Init.Direction = DMA_MEMORY_TO_PERIPH;
  hdma_tim.Init.PeriphInc = DMA_PINC_DISABLE;
  hdma_tim.Init.MemInc = DMA_MINC_ENABLE;
  hdma_tim.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD ;
  hdma_tim.Init.MemDataAlignment = DMA_MDATAALIGN_WORD ;
  hdma_tim.Init.Mode = DMA_NORMAL;
  hdma_tim.Init.Priority = DMA_PRIORITY_HIGH;
  hdma_tim.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
  hdma_tim.Init.PeriphBurst = DMA_PBURST_SINGLE;
  hdma_tim.Init.MemBurst = DMA_PBURST_SINGLE;
  hdma_tim.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;

    
  /* Set hdma_tim instance */
  hdma_tim.Instance = TIMx_UPDATE_DMA_INST;

  /* Link hdma_tim to hdma[TIM_DMA_ID_UPDATE] (update) */
  __HAL_LINKDMA(htim, hdma[TIM_DMA_ID_UPDATE], hdma_tim);
  
  /* Initialize TIMx DMA handle */
  HAL_DMA_Init(htim->hdma[TIM_DMA_ID_UPDATE]);
  
  /*##-2- Configure the NVIC for DMA #########################################*/
  /* NVIC configuration for DMA transfer complete interrupt */
  HAL_NVIC_SetPriority(TIMx_DMA_IRQn, 0, 0);
  HAL_NVIC_EnableIRQ(TIMx_DMA_IRQn);
}


能帮我看一下应该如何设置吗?谢谢
回复

使用道具 举报

0

主题

77

回帖

77

积分

初级会员

积分
77
发表于 2022-11-3 00:47:09 | 显示全部楼层
哦。知道怎么回事了。是我仿真看寄存器的值有没有变化。这种方式是不行的。需要接上示波器看。
另外,就是官方例程用的TIM2,由于没有RCR寄存器,所以我修改成了TIM1,这样就可以每个频率输出几个脉冲。
但仍然还是有不对的地方。如下所示,
采用数组:
uint32_t aSRC_Buffer[6] = {999, 5, 299,999, 5, 599};
定时器频率是1MHz,计数周期999,即1毫秒
则上面数组表示每burst一次,更新ARR为999,RCR为5(会有6个脉冲),点空比为30%。下次burst时,将会有6个占空比为60%的脉冲。
波形最开始输出时是正确的:
微信截图_20221103003617.png

但输出到某个位置后,就出现了错误的波形,如下:
微信截图_20221103003029.png

出现了明显不是我的缓冲区中定义的波形。

另外,就是从宏观上看,波形也不连续,如下:
微信截图_20221103003643.png

我的代码和官方例程相比,只有如下几个地方有修改:
[C] 纯文本查看 复制代码
uint32_t aSRC_Buffer[6] = {999, 5, 299,999, 5, 599};

[C] 纯文本查看 复制代码
  TimHandle.Instance = TIM1;
  
  TimHandle.Init.Period            = 999;
  TimHandle.Init.Prescaler         = ((SystemCoreClock/2) / (1000)) - 1;
  TimHandle.Init.ClockDivision     = 0;
  TimHandle.Init.CounterMode       = TIM_COUNTERMODE_UP;
  if(HAL_TIM_PWM_Init(&TimHandle) != HAL_OK)
  {
    /* Initialization Error */
    Error_Handler();
  }
  
  /*##-2- Configure the PWM channel 1 ########################################*/ 
  sConfig.OCMode     = TIM_OCMODE_PWM1;
  sConfig.OCPolarity = TIM_OCPOLARITY_HIGH;
  sConfig.Pulse      = 99;
  if(HAL_TIM_PWM_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_1) != HAL_OK)
  {
    /* Configuration Error */
    Error_Handler();
  }


[C] 纯文本查看 复制代码
hdma_tim.Init.Mode = DMA_NORMAL;
  hdma_tim.Init.Priority = DMA_PRIORITY_HIGH;
  hdma_tim.Init.FIFOMode = DMA_FIFOMODE_DISABLE;

这里尝试了,NORMAL+FIFO, CIRCULAR+FIFO, NORMAL, CIRCULAR, FIFO
只有CIRCULAR+FIFO,或CIRCULAR可以输出上面的波形。但这个波形会有错误。

还请各位大佬指点。谢谢。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106738
QQ
 楼主| 发表于 2022-11-3 10:24:56 | 显示全部楼层
艾那的小强 发表于 2022-11-3 00:47
哦。知道怎么回事了。是我仿真看寄存器的值有没有变化。这种方式是不行的。需要接上示波器看。
另外,就是 ...

你看下这个bustdma函数正常处理整个没。
image.png
回复

使用道具 举报

0

主题

77

回帖

77

积分

初级会员

积分
77
发表于 2022-11-5 12:12:33 | 显示全部楼层
结案了。原来是不能使用仿真模式。需要把程序下载进单片机后,重新上电看波形。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106738
QQ
 楼主| 发表于 2022-11-6 09:53:37 | 显示全部楼层
艾那的小强 发表于 2022-11-5 12:12
结案了。原来是不能使用仿真模式。需要把程序下载进单片机后,重新上电看波形。


仿真时多么可怕,要以实际运行为准。
回复

使用道具 举报

0

主题

77

回帖

77

积分

初级会员

积分
77
发表于 2022-11-7 08:25:33 | 显示全部楼层
eric2013 发表于 2022-11-6 09:53
仿真时多么可怕,要以实际运行为准。

上面的测试是通过仿真器下载到单片机运行。
正确的姿势是,通过仿真器下载到单片机后,板子重新上电。这样就能看到正确的波形了。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106738
QQ
 楼主| 发表于 2022-11-7 09:25:21 | 显示全部楼层
艾那的小强 发表于 2022-11-7 08:25
上面的测试是通过仿真器下载到单片机运行。
正确的姿势是,通过仿真器下载到单片机后,板子重新上电。这 ...

实际中,就是以反复冷启动是否正常为准。
回复

使用道具 举报

0

主题

77

回帖

77

积分

初级会员

积分
77
发表于 2022-11-8 08:29:49 | 显示全部楼层
eric2013 发表于 2022-11-7 09:25
实际中,就是以反复冷启动是否正常为准。

谢谢楼主指点。之前没有像玩这么深入过。学习了。谢谢。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-3 01:34 , Processed in 0.303338 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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