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

关于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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版