你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

关于stm32l431rct6的LPTIM计数模式

[复制链接]
B1rthday 提问时间:2025-2-7 15:43 / 未解决
我想实现通过lptim的输入引脚gpio0电平变化产生脉冲,通过lptim的计数,达到设定值后进入中断,进行操作,但每次初始化就进入中断,不知道哪里有问题麻烦大佬们帮我看一下。

void Lptim_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};

// 修改对应时钟
__HAL_RCC_GPIOC_CLK_ENABLE();

// 配置 正确的引脚为外部中断输入(或者配置为外部触发信号引脚)
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

HAL_NVIC_SetPriority(EXTI0_IRQn,1, 2);
HAL_NVIC_EnableIRQ(EXTI0_IRQn);
}
void MX_LPTIM1_Init(void)
{
__HAL_RCC_LPTIM1_CLK_ENABLE();
hlptim1.Instance = LPTIM1;
hlptim1.Init.Clock.Source = LPTIM_CLOCKSOURCE_APBCLOCK_LPOSC; // 使用内部低速时钟
hlptim1.Init.Clock.Prescaler = LPTIM_PRESCALER_DIV1; // 不分频
hlptim1.Init.Trigger.Source = LPTIM_TRIGSOURCE_SOFTWARE; // 软件触发
hlptim1.Init.OutputPolarity = LPTIM_OUTPUTPOLARITY_HIGH; // 输出极性
hlptim1.Init.UpdateMode = LPTIM_UPDATE_IMMEDIATE; // 立即更新
hlptim1.Init.CounterSource = LPTIM_COUNTERSOURCE_EXTERNAL; // 外部时钟源(GPIO0电平变化)
hlptim1.Init.Input1Source = LPTIM_INPUT1SOURCE_GPIO; // GPIO0作为输入源
hlptim1.Init.Input2Source = LPTIM_INPUT2SOURCE_GPIO; // 不使用

if (HAL_LPTIM_Init(&hlptim1) != HAL_OK)
{
Error_Handler();
}

HAL_NVIC_SetPriority(LPTIM1_IRQn, 1, 1);
HAL_NVIC_EnableIRQ(LPTIM1_IRQn);
HAL_LPTIM_Counter_Start_IT(&hlptim1,30);
}

void LPTIM1_IRQHandler(void)
{
Uart3_SendCmdStr((uint8_t *)"PTIM1_IRQHandler\r\n");
HAL_LPTIM_IRQHandler(&hlptim1);

}

void HAL_LPTIM_AutoReloadMatchCallback(LPTIM_HandleTypeDef *hlptim)
{
if(hlptim->Instance == LPTIM1)
{
//        HAL_LPTIM_Counter_Stop_IT(&hlptim1);
pulse_count = HAL_LPTIM_ReadCounter(&hlptim1); // 获取当前计数器值
uint8_t data_pulse[50] = {0};
snprintf(data_pulse,sizeof(data_pulse),"pluse_data2:%d\r\n",pulse_count);
Uart3_SendCmdStr(data_pulse);
Uart3_SendCmdStr((uint8_t *)"timeover\r\n");
Clear_Buffer3();
//HAL_LPTIM_Counter_Start_IT(&hlptim1,10);
}
}
void EXTI0_IRQHandler(void)
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);

}
赞 收藏 评论11 发布时间:2025-2-7 15:43

举报

11个回答
xmshao 回答时间:2025-2-8 17:05:01
我看你开启了PC0的外部中断和LPTIM的中断,你指的是 哪个中断?


另外,在使能相关中断 前 先 对相应的中断标志清下零无妨。
butterflyspring 回答时间:2025-2-8 17:45:21
注意到选择了PC0 作为 LPTIM1_IN1 , 但是使能了它的外部中断。

所以有外部脉冲在上面的话,很容易使能后就进入外部中断。

你测试一下看看。

STM32L431RCT6 LPTIM1.PNG
STM32L431RCT6 LPTIM1.PNG
B1rthday 回答时间:2025-2-10 15:53:23

xmshao 发表于 2025-2-8 17:05
我看你开启了PC0的外部中断和LPTIM的中断,你指的是 哪个中断?</p>
<p>

谢谢你的回答,我是想说进不去lptim的中断,hal库函数已经包涵了清标志的代码,所以可以直接调用

B1rthday 回答时间:2025-2-10 15:55:04

butterflyspring 发表于 2025-2-8 17:45
注意到选择了PC0 作为 LPTIM1_IN1 , 但是使能了它的外部中断。</p>
<p>所以有外部脉冲在上面的话,很容易使能后 ...

谢谢你的回答,所以是不使能pc0的外部中断的意思吗,使能了pc0的外部中断,确实直接就进入了lptim的中断

另外,外部脉冲在pc0上

xmshao 回答时间:2025-2-10 16:09:06

B1rthday 发表于 2025-2-10 15:53
谢谢你的回答,我是想说进不去lptim的中断,hal库函数已经包涵了清标志的代码,所以可以直接调用
[/m ...

[md]你从PC0引入时钟,同时又开启基于该脚的外部中断,是什么目的呢?

你这样的话每个脉冲都会触发EXTI 中断。如果他的中断优先级又高于LPTIM的,会影响LPTIM中断的响应。若EXTI中断频率会远高于LPTIM中断,感觉LPTIM中断很难得到响应。

如果不是必要的话,建议关闭PC0的外部中断。若实在需要,可以将LPTIM的中断优先级调高点。

B1rthday 回答时间:2025-2-10 16:23:34

xmshao 发表于 2025-2-10 16:09
你从PC0引入时钟,同时又开启基于该脚的外部中断,是什么目的呢?</p>
<p>

[md]我只是想为了记录pc0的产生的脉冲数,然后lptim的中断去读取个数,所以是可以关闭的吗,那我采用lptim的计数模式,callback函数应该用哪一个呢?是comparematchCallBack还是trggirerCallBack函数呢,我有点分不太清楚了

B1rthday 回答时间:2025-2-10 16:50:55

xmshao 发表于 2025-2-10 16:09
你从PC0引入时钟,同时又开启基于该脚的外部中断,是什么目的呢?</p>
<p>

[md]谢谢,我的目的是为了记录pc0产生的脉冲数,然后lptim达到设定值进入lptim的中断,读出计数器值,然后目前进不去callback函数,pc0的中断应该是不必要的,那我的callback函数应该使用哪一个呢,comparematchCallBack和trggierCallback我分不清楚了

xmshao 回答时间:2025-2-11 11:47:01
你既然要使用LPTIM对外来脉冲进行计数,还要基于管脚的外部中断方式做脉冲计数应该是多此一举了。


但是你只是计数吗?不需要跟时间关联起来?


你说分不清 comparematchCallBack还是trggirerCallBack函数的使用,一个是基于比较匹配事件产生中断后
可以使用的回调函数,一个是基于外部信号触发中断后可以使用的回调函数。到底用哪个你根据需求来。
xmshao 回答时间:2025-2-11 11:56:55

B1rthday 发表于 2025-2-10 16:50
谢谢,我的目的是为了记录pc0产生的脉冲数,然后lptim达到设定值进入lptim的中断,读出计数器值,然 ...

[md]image.png

B1rthday 回答时间:2025-2-11 14:09:58

xmshao 发表于 2025-2-11 11:47
你既然要使用LPTIM对外来脉冲进行计数,还要基于管脚的外部中断方式做脉冲计数应该是多此一举了。</p>
<p>

我只是需要计数,现在当我启动HAL_LPTIM_Counter_Start_IT(&hlptim1,20);这个函数后,就直接调用了: image.png

输出的调试信息也是正常输出了 但并不会去执行回调函数: image.png 我现在把pc0引脚的中断关了,现在配置为image.png

xmshao 回答时间:2025-2-12 15:00:01
感觉你有些误会,建议适当看看手册。这里给些提醒:


1、你现在似乎想在trigger中断里读取计数器的值,那么你就要使能trigger中断,并清楚trigger源是什么,它可以有8种源,
比方ETR脚的脉冲边沿事件、RTC事件、比较器输出事件;


2、看你给出的代码,通过HAL_LPTIM_ReadAutoReload()函数获取当前计数的值,这里读取的是ARR值,一般来讲,在每个计数周期它是固定的。


如果想读当前计数器的值,应该是 HAL_LPTIM_ReadCounter();


3、STM32库了的中断回调 函数往往跟中断事件关联的,即什么样的中断事件对应相应的用户回调函数。这些回调函数其实是库设计人员
留给STM32用户的软件接口,让用户因应不同需求具体编写相应的中断处理代码。换句话说,即使我们不使用这些回调接口也没事,但我们一定
要清楚我们开启了哪些中断、并基于不同中断做相应的处理即可。


4、你现在说程序不会执行某回调函数,你要确认到底使能了相关中断没有、有无相关中断事件发生。


5、鉴于前面第2点,你可能要理一理,到底如何对脉冲进行计数。比方什么时候开始计数、什么时候停止。

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版