(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->...(htim->Init.ClockDivision)); assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload));...; /* 配置快速输出模式 */ htim->Instance->CCMR1 &= ~TIM_CCMR1_OC1FE; htim->Instance->CCMR1...(htim->Instance) !...= RESET) { /* 使能主输出 */ __HAL_TIM_MOE_ENABLE(htim); } /* 触发模式会自动使能 */ tmpsmcr = htim-
.Instance = TIM4; htim4.Init.Prescaler = 83; htim4.Init.CounterMode = TIM_COUNTERMODE_UP; htim4...//HAL_TIM_PWM_Stop(&htim3,TIM_CHANNEL_4); __HAL_TIM_SetCompare(&htim3,TIM_CHANNEL_1,1000);...HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1); break; case 90: //HAL_TIM_PWM_Stop(&htim3...,TIM_CHANNEL_4); __HAL_TIM_SetCompare(&htim3,TIM_CHANNEL_1,1500); HAL_TIM_PWM_Start(&htim3,...); HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1); break; default: HAL_TIM_PWM_Stop(&htim3
(htim->Instance, &htim->Init); /* 设置TIM就绪 */ htim->State= HAL_TIM_STATE_READY; return HAL_OK...(htim->Init.ClockDivision)); if(htim->State == HAL_TIM_STATE_RESET) { /* 默认取消锁 */ htim->...(htim->Init.ClockDivision)); if(htim->State == HAL_TIM_STATE_RESET) { /* 默认取消锁 */ htim->Lock...(htim->Init.ClockDivision)); if(htim->State == HAL_TIM_STATE_RESET) { /* 默认取消锁 */ htim->Lock...the Output Compare */ TIM_Base_SetConfig(htim->Instance, &htim->Init); /* 设置定时器状态 */ htim
.Instance = TIM2; htim2.Init.Prescaler = 80-1; htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2....Init.Period = 100; htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim2.Init.AutoReloadPreload...= TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_Base_Init(&htim2) !...= HAL_OK) { Error_Handler(); } if (HAL_TIM_PWM_Init(&htim2) !...); HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_3); /* USER CODE END 2 */ /* Infinite loop */ /* USER
.Instance = TIM2; htim2.Init.Prescaler = 84-1; htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2....Init.Period = 65535; htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; if (HAL_TIM_Base_Init(&htim2...; } sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; if (HAL_TIM_ConfigClockSource(&htim2...); HAL_TIM_Base_Start(&htim2); //HAL_TIM_Base_Start_IT(&htim2); msHcCount = 0; } else { HAL_TIM_Base_Stop...(&htim2); //HAL_TIM_Base_Stop_IT(&htim2); } } 接下来就是我们的核心时间采集及距离换算部分了,代码如下,设计两个函数,一个是单次获取距离,另一个是对采集结果做了均值滤波处理
.Instance = TIM1; htim1.Init.Prescaler = 71; htim1.Init.CounterMode = TIM_COUNTERMODE_UP; htim1.Init.Period...= MOTOR_PWM_MAX - 1; htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim1.Init.RepetitionCounter...= 0; htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; if (HAL_TIM_Base_Init(&htim1) !...); HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1); HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2); HAL_TIM_PWM_Start...(&htim1, TIM_CHANNEL_3); HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_4); LOG_I("motor pwm initialization ok
Motor_PWM_SetValue(&htim1, TIM_CHANNEL_2, CCR5_Val); //1 快 Motor_PWM_SetValue(&htim1,...(&htim2, TIM_CHANNEL_2, CCR0_Val); //0 Motor_PWM_SetValue(&htim2, TIM_CHANNEL_3, CCR0...Motor_PWM_SetValue(&htim1, TIM_CHANNEL_3, CCR5_Val); //1 Motor_PWM_SetValue(&htim1, TIM_CHANNEL...Motor_PWM_SetValue(&htim2, TIM_CHANNEL_2, CCR0_Val); //0 Motor_PWM_SetValue(&htim2, TIM_CHANNEL...Motor_PWM_SetValue(&htim1, TIM_CHANNEL_3, CCR0_Val); //0 Motor_PWM_SetValue(&htim1, TIM_CHANNEL
.Instance = TIM1; htim1.Init.Prescaler = 168-1; htim1.Init.CounterMode = TIM_COUNTERMODE_UP; htim1....Init.Period = 10000; htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim1.Init.RepetitionCounter...= 0; htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; if (HAL_TIM_Base_Init(&htim1)...= HAL_OK) { Error_Handler(); } if (HAL_TIM_PWM_Init(&htim1) !...(&htim1, TIM_CHANNEL_2, Grade); __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, Grade); } } //启动LED功能
delay_us(uint32_t us) { // Set timer period for desired delay in microseconds __HAL_TIM_SET_AUTORELOAD(&htim2..., us - 1);//定时器响应时间为period*定时器频率 HAL_TIM_Base_Start(&htim2);//start the timer //通过轮询的方式等待定时器的更新事件...while(__HAL_TIM_GET_FLAG(&htim2,TIM_FLAG_UPDATE)==RESET); __HAL_TIM_CLEAR_FLAG(&htim2,TIM_FLAG_UPDATE...);//清楚更新标志位 HAL_TIM_Base_Stop(&htim2);//Stop the timer } 上述程序首先通过__HAL_TIM_SET_AUTORELOAD设定延时周期,之后打开定时器
; htim2.Init.Period = 999; // 1kHz PWM htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;...(TIM_HandleTypeDef *htim) { GPIO_InitTypeDef GPIO_InitStruct = {0}; if (htim->Instance == TIM1....Instance = TIM1; htim1.Init.Prescaler = 839; // 84MHz / 840 = 100kHz htim1.Init.CounterMode....Instance = TIM1; htim1.Init.Prescaler = 839; // 84MHz / 840 = 100kHz htim1.Init.CounterMode...(TIM_HandleTypeDef *htim) { if (htim->Instance == TIM1) { __HAL_RCC_TIM1_CLK_ENABLE()
1MHz,即定时器计数 1 次的时间,刚好为 1us htim.Init.CounterMode = TIM_COUNTERMODE_UP; // 向上计数 htim.Init.Period = 0;...// 自动装载器 ARR 的值 (范围:0~0xFFFF) htim.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; // 时钟分频(与输入采样相关) //htim.Init.RepetitionCounter...(HAL_TIM_Base_Init(&htim) !...句柄 * 输出参数:无 * 返回值:无 * 函数作用:使能 TIM 时钟 */ void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim) { if(htim..., t); // 设置定时器自动加载值 __HAL_TIM_SET_COUNTER(&htim, counter); // 设置定时器初始值 HAL_TIM_Base_Start(&htim); //
.Instance = TIM9; htim9.Init.Prescaler = 215; htim9.Init.CounterMode = TIM_COUNTERMODE_UP; htim9....Init.Period = 65535; htim9.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim9.Init.AutoReloadPreload...= TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_Base_Init(&htim9) !...n : (n-30); HAL_TIM_Base_Stop_IT(&htim9); htim9.Instance->CNT = htim9.Init.Period - n; HAL_TIM_Base_Start_IT...(&htim9); } 这里注意是“先关闭再打开”,上面提到了“时间覆盖”的情况下做延时,就必须先关闭正在延时中的定时器。
* 但计数器计数不会停 * 防止计数器增加到65535之后重新开始计数 */ uint16_t differ=50000-us; HAL_TIM_Base_Start(&htim2...); __HAL_TIM_SET_COUNTER(&htim2,differ); while(differ<50000) { differ=__HAL_TIM_GET_COUNTER...(&htim2); } HAL_TIM_Base_Stop(&htim2); } 2.
; TIM_HandleTypeDef htim2; /* TIM1 init function */ /** * @brief TIM1 Initialization Function *....Instance = TIM1; htim1.Init.Prescaler = 0; htim1.Init.CounterMode = TIM_COUNTERMODE_UP; htim1....Init.Period = 65535; htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim1.Init.RepetitionCounter....Instance = TIM2; htim2.Init.Prescaler = 0; htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2....Init.Period = 4294967295; htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim2.Init.AutoReloadPreload
bool getState() { return elapsed; } void usDelay(uint32_t time) { __HAL_TIM_SetCounter(&htim2...,time); //设置计数值 setState(false); HAL_TIM_Base_Start_IT(&htim2); //开启定时器...getState()); //判断计数值是否耗尽 HAL_TIM_Base_Stop_IT(&htim2); //关闭定时器 } 计数值耗尽回调函数...void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim->Instance == TIM2) {
, 这里我们是使用定时器溢出中断回调函数 void TIM3_IRQHandler(void) 首先进入中断函数 HAL_TIM_IRQHandler(&htim2);之后进入定时器中断处理函数...和定时器通道 void HAL_TIM_PeriodElapsedCallback(&htim2); 进入相对应中断回调函数 在中断回调函数中添加用户代码 你也可以在在stm32f1xx_it.c...中找到中断回调函数 __weak void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) 例程: 定时器溢出时间为500ms.../* USER CODE END 2 */ 在main.c主函数下方添加中断回调函数 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim...) { static unsigned char ledState = 0; if (htim == (&htim2)) { if (ledState == 0)
, TIM_CHANNEL_1, PWM01);//PA0 __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2, 0);//PA1} else if(MPU6050...HAL_GPIO_WritePin(BTS7960_EN_Port,BTS7960_EN_Pin,GPIO_PIN_RESET); __HAL_TIM_SET_COMPARE(&htim2..., TIM_CHANNEL_1, 0); __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2, -PWM02);}else{HAL_GPIO_WritePin(BTS7960...(&htim2, TIM_CHANNEL_2, 0);}#endif//车舵机控制AccY=MPU6050.Ay+90;//*3.2;if(AccY>=110)AccY=110;else if(AccY...//PA8}else{ LCD_ShowCharStr(10,150," PWM ERRO ",BACKCOLOR,RED,24);__HAL_TIM_SET_COMPARE(&htim1
----------------*/ BOOL xMBPortTimersInit( USHORT usTim1Timerout50us ) { __HAL_TIM_SET_AUTORELOAD(&htim7...* usTim1Timerout50us-1); return TRUE; } void vMBPortTimersEnable( ) { __HAL_TIM_SET_COUNTER(&htim7,0...); HAL_TIM_Base_Start_IT(&htim7); } void vMBPortTimersDisable( ) { __HAL_TIM_SET_COUNTER(&htim7,0...); HAL_TIM_Base_Stop_IT(&htim7); } void TIMERExpiredISR( void ) { (void)pxMBPortCBTimerExpired...endif /* USER CODE END USART1_IRQn 1 */ } void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim
我们需要开启定时器中断: HAL_TIM_Base_Start_IT(&htim3); 编写定时器中断回调函数 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef...*htim) { if(htim->Instance == htim3.Instance) { //书写我们想要执行的功能 } } 编译一下,无错误,项目完成,每10us进入中断回调函数一次
领取专属 10元无门槛券
手把手带您无忧上云