注:此处的N取值为1-10。
1.定时器配置
STM32CubeMX配置定时器可以参看文章:
使用STM32CubeMX配置定时器中断实现LED每秒闪烁一次(STM32G070CBT6)_stm32cubemx 怎么配置tim3 定时器-CSDN博客
将定时器的定时间时间配置为10ms,此处我的主频设置的是48M。
cpp
/* 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.功能实现函数
发送率功能函数
cpp
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);
}
}
定时器中断函数
cpp
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM3) //10ms
{
if(++LaserSendCount > LaserSendInterval) //发送
{
LaserSendCount = 0;
LaserTxFlag = 1;
}
}
}
主函数
cpp
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 */
}
3.实现效果
