STM32cubemx配置高级定时器TIM1刹车中断(HAL库)

芯片用的是STM32G030C8T6

CUBE配置如下

GPIO配置刹车引脚 TIM1_BK

开启刹车中断

TIM1相关配置

代码相关 main.c

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */
  PramInit();	
  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_ADC1_Init();
  MX_TIM1_Init();
  MX_TIM3_Init();
  MX_TIM14_Init();
  MX_TIM16_Init();
  MX_USART1_UART_Init();
  MX_USART2_UART_Init();
  MX_IWDG_Init();
  /* USER CODE BEGIN 2 */
  
  HAL_TIM_Base_Start_IT(&htim1);  //TIM1此时需要开启,中断才能进入
  
  HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_1);
  HAL_TIMEx_PWMN_Stop(&htim1, TIM_CHANNEL_1);	
  HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_2);
  HAL_TIMEx_PWMN_Stop(&htim1, TIM_CHANNEL_2);

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {

    /* USER CODE END WHILE */

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

stm32g0xx_it.c关键代码如下

/**
  * @brief This function handles TIM1 break, update, trigger and commutation interrupts.
  */
void TIM1_BRK_UP_TRG_COM_IRQHandler(void)
{
  /* USER CODE BEGIN TIM1_BRK_UP_TRG_COM_IRQn 0 */
  if(__HAL_TIM_GET_FLAG(&htim1, TIM_FLAG_BREAK) != RESET)
  {
    //此处可以写触发刹车中断之后的要进行的操作
    
	__HAL_TIM_CLEAR_FLAG(&htim1,TIM_FLAG_BREAK);  
  }
  /* USER CODE END TIM1_BRK_UP_TRG_COM_IRQn 0 */
  HAL_TIM_IRQHandler(&htim1);
  /* USER CODE BEGIN TIM1_BRK_UP_TRG_COM_IRQn 1 */

关于刹车复位:

刹车触发之后需要手动发一个脉冲解锁PWM通道,

#define AL 	 HAL_GPIO_WritePin(GPIOA,GPIO_PIN_8,GPIO_PIN_RESET)  //
#define BL 	 HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,GPIO_PIN_RESET)  //
#define CL 	 HAL_GPIO_WritePin(GPIOA,GPIO_PIN_9,GPIO_PIN_RESET)  //
#define DL 	 HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14,GPIO_PIN_RESET)  //

#define AH 	 HAL_GPIO_WritePin(GPIOA,GPIO_PIN_8,GPIO_PIN_SET)  //
#define BH 	 HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,GPIO_PIN_SET)  //
#define CH 	 HAL_GPIO_WritePin(GPIOA,GPIO_PIN_9,GPIO_PIN_SET)  //
#define DH 	 HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14,GPIO_PIN_SET)  //

extern TIM_HandleTypeDef htim16; //这里定时器用来计时延迟
void HAL_Delay_US(unsigned long int Delay_us) 
{
    __HAL_TIM_SetCounter(&htim16, 0);

    __HAL_TIM_ENABLE(&htim16);

    while(__HAL_TIM_GetCounter(&htim16) < Delay_us);
    /* Disable the Peripheral */
    __HAL_TIM_DISABLE(&htim16);

}

/******************************************************************************
函  数  名 : BrkRevocer
说      明 :  刹车之后恢复 需要发波
输      入 : none
返      回 : none
******************************************************************************/
void BrkRevocer(void)
{
    //TIM1->CR1 |= 0x01; //start  TIM1发波
    unsigned int cnt;

    cnt=__HAL_TIM_GetCounter(&htim1);

    HAL_Delay_US(5);
    GPIO_InitTypeDef GPIO_InitStruct = {0};

    GPIO_InitStruct.Pin = GPIO_PIN_8;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = GPIO_PIN_13;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = GPIO_PIN_9;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = GPIO_PIN_14;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

    //发波解锁
    AH;
    BL;
    CL;
    DL;

    HAL_Delay_US(5);
    AL;
    HAL_Delay_US(5);
    BH;
    HAL_Delay_US(5);
    BL;
    CH;
    HAL_Delay_US(5);
    CL;
    DH;
    HAL_Delay_US(5);
    DL;

    GPIO_InitStruct.Pin = GPIO_PIN_13;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    GPIO_InitStruct.Alternate = GPIO_AF2_TIM1;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = GPIO_PIN_8;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    GPIO_InitStruct.Alternate = GPIO_AF2_TIM1;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = GPIO_PIN_14;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    GPIO_InitStruct.Alternate = GPIO_AF2_TIM1;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = GPIO_PIN_9;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    GPIO_InitStruct.Alternate = GPIO_AF2_TIM1;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    //清除标志位,避免再次进入中断
    __HAL_TIM_CLEAR_FLAG(&htim1,TIM_FLAG_BREAK);
    //还原计数值,以免影响后续发PWM波
    __HAL_TIM_SetCounter(&htim1, cnt);


}

本人刚开始研究STM芯片,要是哪里有什么问题请大家斧正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值