注:此处的N取值为1-10。
1.定时器配置
STM32CubeMX配置定时器可以参看文章:
使用STM32CubeMX配置定时器中断实现LED每秒闪烁一次(STM32G070CBT6)_stm32cubemx 怎么配置tim3 定时器-CSDN博客
将定时器的定时间时间配置为10ms,此处我的主频设置的是48M。
/* TIM3 init function */
void MX_TIM3_Init(void)
{/* USER CODE BEGIN TIM3_Init 0 *//* USER CODE END TIM3_Init 0 */TIM_ClockConfigTypeDef sClockSourceConfig = {0};TIM_MasterConfigTypeDef sMasterConfig = {0};/* USER CODE BEGIN TIM3_Init 1 *//* USER CODE END TIM3_Init 1 */htim3.Instance = TIM3;htim3.Init.Prescaler = 48-1;htim3.Init.CounterMode = TIM_COUNTERMODE_UP;htim3.Init.Period = 10000-1;htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;if (HAL_TIM_Base_Init(&htim3) != HAL_OK){Error_Handler();}sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK){Error_Handler();}sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK){Error_Handler();}/* USER CODE BEGIN TIM3_Init 2 *//* USER CODE END TIM3_Init 2 */}
2.功能实现函数
发送率功能函数
volatile int LaserSendCount = 0; //激光数据发送计数值
volatile int LaserSendInterval = 100; //初始为1次/秒(100*10ms=1000ms)
volatile unsigned char LaserTxFlag = 0; //激光发送标志位//激光发射率函数(发/秒),每秒发送多少个激光包,1-10
static void Laser_Rate(unsigned char rate)
{if(rate < 1){rate = 1;}if(rate > 10){rate = 10;}LaserSendInterval = 100 / rate; //计算中断阈值if(LaserTxFlag) //激光发送标志位{LaserTxFlag = 0;//测试使用HAL_UART_Transmit_DMA(&huart4,"HELLO",5);}
}
定时器中断函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance == TIM3) //10ms {if(++LaserSendCount > LaserSendInterval) //发送{LaserSendCount = 0;LaserTxFlag = 1; }}
}
主函数
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 *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_DMA_Init();MX_TIM3_Init();MX_USART4_UART_Init();/* USER CODE BEGIN 2 */HAL_TIM_Base_Start_IT(&htim3); /* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE */Laser_Rate(5); //在主函数中调用,1s发送五次/* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}