hc32l130x 测量脉冲宽度进不了TIMER3中断
时间: 2023-09-03 18:11:01 浏览: 100
有可能是以下几个原因导致测量脉冲宽度无法进入TIMER3中断:
1. TIMER3的中断标志位没有清零,导致中断一直被触发,可以在中断服务函数中添加清零中断标志位的代码。
2. TIMER3的中断优先级设置不正确,可以将中断优先级设置为高于其他中断的优先级。
3. TIMER3的初始化配置不正确,可以检查TIMER3的时钟源、计数模式、计数方向、重载值等参数是否设置正确。
4. 测量脉冲宽度的输入引脚配置不正确,可以检查引脚的复用功能是否设置正确,是否开启了输入捕获功能。
5. 测量脉冲宽度的输入信号不满足中断触发条件,可以检查输入信号的电平是否稳定,是否满足中断触发条件。
相关问题
使用HC32L130F8UA测量脉冲宽度,测量标准,每过1分钟测量三次脉冲宽度,并计算第2次和第3次平均值储存
实现这个功能需要涉及到HC32L130F8UA的定时器、外部中断和计算平均值的方法。下面是一个简单的代码框架,你可以根据自己的具体需求进行修改和完善。
```c
#include "hc32l130.h"
/* 定义计数变量 */
volatile uint32_t cnt = 0;
/* 定义脉冲宽度变量和标志位 */
volatile uint32_t pulse_width = 0;
volatile uint8_t pulse_flag = 0;
/* 定义存储变量 */
volatile uint32_t pulse_sum = 0;
volatile uint8_t pulse_count = 0;
/* 定义定时器中断处理函数 */
void TIM_IRQHandler(void)
{
/* 判断是否为计数溢出中断 */
if (Set == TMRA_GetFlag(M0P_TMRA_1, TMRA_FLAG_OVF))
{
TMRA_ClearFlag(M0P_TMRA_1, TMRA_FLAG_OVF);
/* 计数器加1 */
cnt++;
}
}
/* 定义外部中断处理函数 */
void EXINT01_IRQHandler(void)
{
/* 判断是否为上升沿触发 */
if (Set == EXINT_GetExIntSrc(EXINT_CH01))
{
/* 获取脉冲宽度 */
pulse_width = TMRA_GetCntVal(M0P_TMRA_2);
/* 清除计数器 */
TMRA_SetCntVal(M0P_TMRA_2, 0);
/* 设置脉冲标志位 */
pulse_flag = 1;
}
/* 清除中断标志位 */
EXINT_ClrExIntSrc(EXINT_CH01);
}
/* 定义计算平均值函数 */
void calc_average(void)
{
/* 判断是否需要进行计算 */
if (pulse_count == 2)
{
/* 计算平均值 */
pulse_sum = (pulse_sum + pulse_width) / 2;
/* 清空计数器和标志位 */
pulse_count = 0;
pulse_flag = 0;
}
else if (pulse_flag == 1)
{
/* 累加脉冲宽度和计数器 */
pulse_sum += pulse_width;
pulse_count++;
pulse_flag = 0;
}
}
int main(void)
{
/* 初始化定时器 */
TMRA_InitTypeDef tmra_init;
tmra_init.u32ClkSrc = TMRA_CLK_SRC_CLK_HCLK;
tmra_init.u32ClkDiv = TMRA_CLK_DIV1;
tmra_init.u32PeriodVal = SystemCoreClock / 1000 - 1;
tmra_init.u16CntMode = TMRA_MODE_SAWTOOTH;
TMRA_Init(M0P_TMRA_1, &tmra_init);
TMRA_EnableIrq(M0P_TMRA_1, TMRA_IRQ_EN_OVF);
/* 初始化外部中断 */
stc_exint_config_t exint_config;
exint_config.u32ExIntCh = EXINT_CH01;
exint_config.u8ExIntFE = EXINT_FILTER_DISABLE;
exint_config.u8ExIntFClk = EXINT_FCLK_HCLK_DIV8;
exint_config.u8ExIntLvl = EXINT_TRIGGER_RISING;
exint_config.pfnExintCallback = EXINT01_IRQHandler;
EXINT_Init(&exint_config);
/* 初始化计数器 */
cnt = 0;
/* 启动定时器 */
TMRA_Start(M0P_TMRA_1);
while (1)
{
/* 判断是否满足计算平均值的条件 */
if (cnt >= 60000)
{
/* 停止定时器和计数器 */
TMRA_Stop(M0P_TMRA_1);
cnt = 0;
/* 计算平均值 */
calc_average();
/* 启动定时器和计数器 */
TMRA_Start(M0P_TMRA_1);
}
}
}
```
这段代码的主要流程是,在定时器中断中进行计数,并在外部中断中获取脉冲宽度。当计数器累计到60秒时,停止定时器和计数器,计算第2次和第3次的平均值。然后再启动定时器和计数器,继续进行下一轮测量。需要注意的是,计算平均值的函数需要在主循环中调用,否则会影响定时器和外部中断的正常运行。
使用HC32L130F8UA定时器timer3模式 1 脉宽测量 PWC测量高电平脉冲宽度,测量标准,每过1分钟测量两次脉冲宽度,并计算平均值储存,同时写出主循环程序
以下是使用HC32L130F8UA定时器timer3模式1进行PWC脉宽测量的代码,其中每过1分钟测量两次脉冲宽度,并计算平均值储存:
```c
#include "hc32l130.h"
#define PWC_MEASURE_INTERVAL 60000 // 脉冲测量间隔,单位ms
#define PWC_MEASURE_TIMES 2 // 每个间隔内测量的次数
#define TIMER3_CLOCK_DIV 1024 // Timer3时钟分频系数
uint16_t pwc_measure_count = 0; // 当前测量计数
uint32_t pwc_total_width = 0; // 当前间隔内脉冲宽度总和
uint32_t pwc_avg_width = 0; // 当前间隔内脉冲宽度平均值
uint32_t pwc_total_count = 0; // 总测量次数
uint32_t pwc_total_width_all = 0; // 总脉冲宽度值
void timer3_config(void)
{
// 使能Timer3时钟
M0P_CLOCK->APB1EN_f.TIM3CKEN = 1;
// Timer3时钟分频系数为1024
M0P_TIM3->PSCR = TIMER3_CLOCK_DIV - 1;
// Timer3工作在模式1(脉宽测量)下
M0P_TIM3->MDCR = 0x0001;
// Timer3启动
M0P_TIM3->STC = 0x0001;
}
void timer3_isr(void)
{
// 判断是否为脉宽测量完成中断
if (M0P_TIM3->IFR_f.PWMBIF)
{
// 读取当前测量的脉冲宽度值
uint16_t pwc_width = M0P_TIM3->PWCAR;
// 累加当前间隔内脉冲宽度总和
pwc_total_width += (uint32_t)pwc_width;
// 当前间隔内测量次数+1
pwc_measure_count++;
// 如果当前间隔内测量次数达到指定次数,即可计算平均值并储存
if (pwc_measure_count >= PWC_MEASURE_TIMES)
{
// 计算当前间隔内脉冲宽度平均值
pwc_avg_width = pwc_total_width / PWC_MEASURE_TIMES;
// 累加总测量次数
pwc_total_count++;
// 累加总脉冲宽度值
pwc_total_width_all += pwc_avg_width;
// 重置当前间隔内脉冲宽度总和和测量计数
pwc_total_width = 0;
pwc_measure_count = 0;
}
// 清除脉宽测量完成中断标志位
M0P_TIM3->ICLR_f.PWMBIC = 1;
}
}
int main(void)
{
// 定时器Timer3配置
timer3_config();
// 进入主循环
while (1)
{
// 等待1分钟
delay1ms(PWC_MEASURE_INTERVAL);
// 输出当前间隔内平均脉冲宽度值
printf("pwc_avg_width = %d\r\n", pwc_avg_width);
// 输出平均脉冲宽度值的累计次数和总和
printf("pwc_total_count = %d, pwc_total_width_all = %d\r\n", pwc_total_count, pwc_total_width_all);
}
}
```
阅读全文