芯片用的是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芯片,要是哪里有什么问题请大家斧正。