【arm】国民N32G435通用定时器霍尔配置,双边沿输入捕获配置

server/2024/12/18 6:46:30/

项目场景:

无刷电机FOC控制,配置通用定时器TIM4为霍尔输入检测。
控制平台,国民N32G435CBL7。


问题描述

端口配置:

    /* Hall port configuration. */GPIO_InitStructure.Pin              = GPIO_PIN_6 | GPIO_PIN_7 | GPIO_PIN_8;GPIO_InitStructure.GPIO_Current     = GPIO_DC_2mA;GPIO_InitStructure.GPIO_Slew_Rate   = GPIO_Slew_Rate_High;//Default HighGPIO_InitStructure.GPIO_Pull        = GPIO_Pull_Up;GPIO_InitStructure.GPIO_Mode        = GPIO_Mode_Input;GPIO_InitStructure.GPIO_Alternate   = GPIO_AF2_TIM4;GPIO_InitPeripheral(GPIOB, &GPIO_InitStructure);

TIM4配置:

/*  Check RCC_Configuration()Enable TIM4 Clock, GPIO, AFIORCC_EnableAPB1PeriphClk(RCC_APB1_PERIPH_TIM4, ENABLE);RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOB | RCC_APB2_PERIPH_AFIO, ENABLE);
*//* TIM4 Configuration */TIM_DeInit(TIM4);/* Time Base configuration */TIM_InitTimBaseStruct(&TIM_TimeBaseStructure);TIM_TimeBaseStructure.Prescaler = 0;TIM_TimeBaseStructure.CntMode   = TIM_CNT_MODE_UP;TIM_TimeBaseStructure.Period    = APB1_CLK_FREQ / 1000000 * 2000;//Notice calculation procedure to avoid overflow.TIM_TimeBaseStructure.ClkDiv    = 0;TIM_TimeBaseStructure.RepetCnt  = 0;TIM_InitTimeBase(TIM4, &TIM_TimeBaseStructure);TIM_ICInitType TIM_ICInitStructure;    TIM_InitIcStruct(&TIM_ICInitStructure);TIM_ICInitStructure.Channel     = TIM_CH_1;TIM_ICInitStructure.IcPolarity  = TIM_IC_POLARITY_RISING;TIM_ICInitStructure.IcSelection = TIM_IC_SELECTION_TRC;TIM_ICInitStructure.IcPrescaler = TIM_IC_PSC_DIV1;TIM_ICInitStructure.IcFilter    = 0x0;TIM_ICInit(TIM4, &TIM_ICInitStructure);
//Adjust to TIM_IC_POLARITY_BOTHEDGE
//		TIM4->CCEN &= (uint32_t) ~((uint32_t)TIM_CCEN_CC1EN);
//		TIM4->CCMOD1 |= 0x0003;
//		TIM4->CCEN |= 0x000A;
//		TIM4->CCEN |= ((uint32_t)TIM_CCEN_CC1EN);/* TIM4 Input Capture configuration */TIM_SelectHallSensor(TIM4, ENABLE);//XOR(CC1,CC2,CC3)->TI1F_EDTIM_SelectInputTrig(TIM4, TIM_TRIG_SEL_TI1F_ED);TIM_SelectSlaveMode(TIM4, TIM_SLAVE_MODE_RESET);TIM_SelectMasterSlaveMode(TIM4, TIM_MASTER_SLAVE_MODE_ENABLE);/* Clear Timer Interrupt Pending Bit */TIM_ClrIntPendingBit(TIM4,TIM_INT_TRIG);/* Enable Timer Interrupt */TIM_ConfigInt(TIM4,TIM_INT_TRIG,ENABLE);TIM_ConfigInt(TIM4,TIM_INT_UPDATE,ENABLE);/* Enable TIM4 */TIM_Enable(TIM4,ENABLE); 

初版代码
TIM_ICInitStructure.IcPolarity = TIM_IC_POLARITY_BOTHEDGE;
双边沿检测,编译可以通过,但代码会卡死,进入TIM_ICInit,发现初始化函数只支持TIM4进行单边沿检测。

/**
* @brief  Initializes the TIM peripheral according to the specified
*         parameters in the TIM_ICInitStruct.
* @param TIMx where x can be  1 to 8 except 6 and 7 to select the TIM peripheral.
* @param TIM_ICInitStruct pointer to a TIM_ICInitType structure
*         that contains the configuration information for the specified TIM peripheral.
*/
void TIM_ICInit(TIM_Module* TIMx, TIM_ICInitType* TIM_ICInitStruct)
{/* Check the parameters */assert_param(IsTimCh(TIM_ICInitStruct->Channel));assert_param(IsTimIcSelection(TIM_ICInitStruct->IcSelection));assert_param(IsTimIcPrescaler(TIM_ICInitStruct->IcPrescaler));assert_param(IsTimInCapFilter(TIM_ICInitStruct->IcFilter));if ((TIMx == TIM1) || (TIMx == TIM8) || (TIMx == TIM2) || (TIMx == TIM3) || (TIMx == TIM4) || (TIMx == TIM5) || (TIMx == TIM9)){assert_param(IsTimIcPalaritySingleEdge(TIM_ICInitStruct->IcPolarity));}else{assert_param(IsTimIcPolarityAnyEdge(TIM_ICInitStruct->IcPolarity));}if (TIM_ICInitStruct->Channel == TIM_CH_1){assert_param(IsTimList8Module(TIMx));/* TI1 Configuration */ConfigTI1(TIMx, TIM_ICInitStruct->IcPolarity, TIM_ICInitStruct->IcSelection, TIM_ICInitStruct->IcFilter);/* Set the Input Capture Prescaler value */TIM_SetInCap1Prescaler(TIMx, TIM_ICInitStruct->IcPrescaler);}else if (TIM_ICInitStruct->Channel == TIM_CH_2){assert_param(IsTimList6Module(TIMx));/* TI2 Configuration */ConfigTI2(TIMx, TIM_ICInitStruct->IcPolarity, TIM_ICInitStruct->IcSelection, TIM_ICInitStruct->IcFilter);/* Set the Input Capture Prescaler value */TIM_SetInCap2Prescaler(TIMx, TIM_ICInitStruct->IcPrescaler);}else if (TIM_ICInitStruct->Channel == TIM_CH_3){assert_param(IsTimList3Module(TIMx));/* TI3 Configuration */ConfigTI3(TIMx, TIM_ICInitStruct->IcPolarity, TIM_ICInitStruct->IcSelection, TIM_ICInitStruct->IcFilter);/* Set the Input Capture Prescaler value */TIM_SetInCap3Prescaler(TIMx, TIM_ICInitStruct->IcPrescaler);}else{assert_param(IsTimList3Module(TIMx));/* TI4 Configuration */ConfigTI4(TIMx, TIM_ICInitStruct->IcPolarity, TIM_ICInitStruct->IcSelection, TIM_ICInitStruct->IcFilter);/* Set the Input Capture Prescaler value */TIM_SetInCap4Prescaler(TIMx, TIM_ICInitStruct->IcPrescaler);}
} 

实测配置为上升沿检测霍尔状态也能正常检测。
或者尝试通过寄存器直接配置为双边沿,上面代码中在
TIM_ICInit(TIM4, &TIM_ICInitStructure);之后有如下被注释代码颗进行双边沿配置。

//Adjust to TIM_IC_POLARITY_BOTHEDGE
// TIM4->CCEN &= (uint32_t) ~((uint32_t)TIM_CCEN_CC1EN);
// TIM4->CCMOD1 |= 0x0003;
// TIM4->CCEN |= 0x000A;
// TIM4->CCEN |= ((uint32_t)TIM_CCEN_CC1EN);

具体参考用户手册。

论坛发现STM32双边沿检测也有类似的问题,需要在硬件设计中注意,且在代码中进行必要调整。


解决方案:

如上代码。


http://www.ppmy.cn/server/151105.html

相关文章

Maven 统一版本:项目依赖管理的智慧之选

Maven 统一版本:项目依赖管理的智慧之选 在 Java 开发的浩瀚星空中,Maven 犹如一颗璀璨的导航星,引领着我们穿越依赖管理的浩瀚宇宙。而其中的“统一版本”概念,就像是为这趟旅程制定的一份精准地图,让我们的项目之路…

快慢指针.原地删除数组重复项

给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。 class Solution { public:in…

Java——网络编程(中)—TCP通讯(上)

一 (网络编程常用类) (Java为了跨平台,在网络应用通信时是不允许直接调用操作系统接口的,而是由java.net包来提供网络功能。下面来介绍几个java.net包中的常用的类) 1 InetAddress类的使用 (封装计算机的IP地址和DNS) (这个类没有构造方法——>如…

【Vue3学习】Vue3+setup语法糖+typeScript中的组件传值

一、父子组件传值 1. 子组件接收父组件的传值(父向子传值) 父组件 <template><div><ChildComponent name"Alice" :age"25" /></div> </template><script setup lang"ts">import ChildComponent from ./C…

计算机视觉中的特征提取算法

摘要&#xff1a; 本文聚焦于计算机视觉中的特征提取算法&#xff0c;深入探讨尺度不变特征变换&#xff08;SIFT&#xff09;算法。详细阐述 SIFT 算法的原理&#xff0c;包括尺度空间构建、关键点检测、方向分配与特征描述子生成等核心步骤。通过 C#、Python 和 C 三种编程语…

[Unity]Unity跨平台开发之Android入门

安卓环境配置 安装依赖项 推荐使用Unity Hub进行安装&#xff0c;安装时勾选Android Build Support、Android SDK & NDK Tools、OpenJDK。或者指定已安装的依赖项。&#xff08;注意&#xff1a;指定的依赖项需要是从UnityHub安装的。比如之前安装Unity2022时勾选了上述依…

JAVA2笔记第六章

第六章&#xff1a;反射设计模式 一、反射 1. 反射 (Reflection) &#xff1a;允许在程序运行状态中&#xff0c;可以获取任意类中的属性和方法&#xff0c;并且可以操作任意对象内部的属 性和方法&#xff0c;这种动态获取类的信息及动态操作对象的属性和方法对应的机制称…

Go vendor

博主在编写Go代码时&#xff0c;遇到了这样一个问题&#xff1a;想要修改某个外部包&#xff0c;添加几个函数&#xff0c;而其余功能继续使用&#xff0c;经过调研&#xff0c;发现可以将Go的外部包源码复制到项目本地&#xff0c;对包的代码进行修改&#xff0c;从而达到目的…