
我想实现通过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 *)" ![]() 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); } |
VDD下电后使用VBAT引脚供电时LSE停振?
STM32L476VGT6 100P的可以直接用stm32u575vg 100P的替换到板子上吗?为啥烧录程序时无法连接?
使用STM32L451CEU6型号的芯片,在用usart(PA9、PA10)进行串口通信时,发送0x55在PC端可以收到正确的数据,但是发送0x80会收到0x00的数据,发送0x01会收到0x7F的数据,串口助手的配置和CubeMX上的配置参数是一样的(都是115200,8N1),请问各位这个是什么原因呀?
两块SRAM分别位于不同的基地址,有什么方法可以使这两块区域SRAM当成一块使用
串口接收函数跑几天就进不去了
STM32L476 HAL_FLASHEx_Erase() 问题
SD卡格式化出错
STM32用户手册哪里下载 哪里有分类的
怎么将HAL库转为LL库。
为什么STM32L496RG第一次烧写程序后需要重新上下电才能正常执行程序?
另外,在使能相关中断 前 先 对相应的中断标志清下零无妨。
所以有外部脉冲在上面的话,很容易使能后就进入外部中断。
你测试一下看看。
谢谢你的回答,我是想说进不去lptim的中断,hal库函数已经包涵了清标志的代码,所以可以直接调用
谢谢你的回答,所以是不使能pc0的外部中断的意思吗,使能了pc0的外部中断,确实直接就进入了lptim的中断
另外,外部脉冲在pc0上
[md]你从PC0引入时钟,同时又开启基于该脚的外部中断,是什么目的呢?
你这样的话每个脉冲都会触发EXTI 中断。如果他的中断优先级又高于LPTIM的,会影响LPTIM中断的响应。若EXTI中断频率会远高于LPTIM中断,感觉LPTIM中断很难得到响应。
如果不是必要的话,建议关闭PC0的外部中断。若实在需要,可以将LPTIM的中断优先级调高点。
[md]我只是想为了记录pc0的产生的脉冲数,然后lptim的中断去读取个数,所以是可以关闭的吗,那我采用lptim的计数模式,callback函数应该用哪一个呢?是comparematchCallBack还是trggirerCallBack函数呢,我有点分不太清楚了
[md]谢谢,我的目的是为了记录pc0产生的脉冲数,然后lptim达到设定值进入lptim的中断,读出计数器值,然后目前进不去callback函数,pc0的中断应该是不必要的,那我的callback函数应该使用哪一个呢,comparematchCallBack和trggierCallback我分不清楚了
但是你只是计数吗?不需要跟时间关联起来?
你说分不清 comparematchCallBack还是trggirerCallBack函数的使用,一个是基于比较匹配事件产生中断后
可以使用的回调函数,一个是基于外部信号触发中断后可以使用的回调函数。到底用哪个你根据需求来。
[md]
我只是需要计数,现在当我启动HAL_LPTIM_Counter_Start_IT(&hlptim1,20);这个函数后,就直接调用了:
输出的调试信息也是正常输出了 但并不会去执行回调函数:
我现在把pc0引脚的中断关了,现在配置为
1、你现在似乎想在trigger中断里读取计数器的值,那么你就要使能trigger中断,并清楚trigger源是什么,它可以有8种源,
比方ETR脚的脉冲边沿事件、RTC事件、比较器输出事件;
2、看你给出的代码,通过HAL_LPTIM_ReadAutoReload()函数获取当前计数的值,这里读取的是ARR值,一般来讲,在每个计数周期它是固定的。
如果想读当前计数器的值,应该是 HAL_LPTIM_ReadCounter();
3、STM32库了的中断回调 函数往往跟中断事件关联的,即什么样的中断事件对应相应的用户回调函数。这些回调函数其实是库设计人员
留给STM32用户的软件接口,让用户因应不同需求具体编写相应的中断处理代码。换句话说,即使我们不使用这些回调接口也没事,但我们一定
要清楚我们开启了哪些中断、并基于不同中断做相应的处理即可。
4、你现在说程序不会执行某回调函数,你要确认到底使能了相关中断没有、有无相关中断事件发生。
5、鉴于前面第2点,你可能要理一理,到底如何对脉冲进行计数。比方什么时候开始计数、什么时候停止。