初级会员

- 积分
- 185
- 金钱
- 185
- 注册时间
- 2017-6-19
- 在线时间
- 90 小时
|
1金钱
本帖最后由 王大爷爱吃鱼 于 2020-11-3 11:15 编辑
如题,我用STM32CUBEMX生成的工程,做输入捕获的时候,高电平时间不变。如下图,高电平时间一直都是192us,但实际我用示波器测量的是300us和400us。- __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, 400);//高电平为400us
复制代码
- __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, 300);//高电平为300us
复制代码 我只改动了上面一句,实际用示波器测量效果和代码可以对得上。可是串口调试助手却一直都是显示192us不变,代码如下,求解。- 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_TIM3_Init();
- MX_TIM5_Init();
- MX_USART1_UART_Init();
- /* USER CODE BEGIN 2 */
- HAL_TIM_IC_Start_IT(&htim5,TIM_CHANNEL_1); //一定要开启TIM5通道1的捕获中断
- __HAL_TIM_ENABLE_IT(&htim5,TIM_IT_UPDATE); //一定要开启TIM5的更新中断
- HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2);
- printf("准备开始采集高电平...\r\n");
- /* USER CODE END 2 */
- /* Infinite loop */
- /* USER CODE BEGIN WHILE */
- while (1)
- {
- /* USER CODE END WHILE */
- /* USER CODE BEGIN 3 */
- __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, 400);
- HAL_Delay(500);
- if(TIM5CH1_CAPTURE_STA & 0X80)
- { //完成一次高电平捕获
- temp = TIM5CH1_CAPTURE_STA & 0X3F;
- temp *= 65536; //溢出总时间
- temp += TIM5CH1_CAPTURE_STA; //总的高电平时间
- printf("高电平时间:%lld us\r\n",temp);
- TIM5CH1_CAPTURE_STA = 0; //准备下一次捕获
- }
- }
- /* USER CODE END 3 */
- }
复制代码- /* USER CODE BEGIN 1 */
- uint8_t TIM5CH1_CAPTURE_STA=0; //输入捕获状态
- uint16_t TIM5CH1_CAPTURE_VAL; //输入捕获值(TIM5是16位)
- //定时器5中断服务函数
- //void TIM5_IRQHandler(void)
- //{
- // HAL_TIM_IRQHandler(&htim5); //定时器共用处理函数
- //}
-
- //定时器更新中断(计数溢出)中断处理回调函数, 该函数在HAL_TIM_IRQHandler中会被调用
- void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)//更新中断(溢出)发生时执行
- {
- if((TIM5CH1_CAPTURE_STA&0X80)==0) //还未成功捕获
- {
- if(TIM5CH1_CAPTURE_STA&0X40) //已经捕获到高电平了
- {
- if((TIM5CH1_CAPTURE_STA&0X3F)==0X3F) //高电平太长了
- {
- TIM5CH1_CAPTURE_STA|=0X80; //标记成功捕获了一次
- TIM5CH1_CAPTURE_VAL=0XFFFF;
- }else TIM5CH1_CAPTURE_STA++;
- }
- }
- }
- //定时器输入捕获中断处理回调函数,该函数在HAL_TIM_IRQHandler中会被调用
- void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)//捕获中断发生时执行
- {
- if((TIM5CH1_CAPTURE_STA&0X80)==0) //还未成功捕获
- {
- if(TIM5CH1_CAPTURE_STA&0X40) //捕获到一个下降沿
- {
- TIM5CH1_CAPTURE_STA|=0X80; //标记成功捕获到一次高电平脉宽
- TIM5CH1_CAPTURE_VAL=HAL_TIM_ReadCapturedValue(&htim5,TIM_CHANNEL_1);//获取当前的捕获值.
- TIM_RESET_CAPTUREPOLARITY(&htim5,TIM_CHANNEL_1); //一定要先清除原来的设置!!
- TIM_SET_CAPTUREPOLARITY(&htim5,TIM_CHANNEL_1,TIM_ICPOLARITY_RISING);//配置TIM5通道1上升沿捕获
- }else //还未开始,第一次捕获上升沿
- {
- TIM5CH1_CAPTURE_STA=0; //清空
- TIM5CH1_CAPTURE_VAL=0;
- TIM5CH1_CAPTURE_STA|=0X40; //标记捕获到了上升沿
- __HAL_TIM_DISABLE(&htim5); //关闭定时器5
- __HAL_TIM_SET_COUNTER(&htim5,0);
- TIM_RESET_CAPTUREPOLARITY(&htim5,TIM_CHANNEL_1); //一定要先清除原来的设置!!
- TIM_SET_CAPTUREPOLARITY(&htim5,TIM_CHANNEL_1,TIM_ICPOLARITY_FALLING);//定时器5通道1设置为下降沿捕获
- __HAL_TIM_ENABLE(&htim5); //使能定时器5
- }
- }
- }
- /* USER CODE END 1 */
复制代码
|
|