_el_expressionfactory=_jspxFactory.此行报NullPointerException

本文探讨了在项目中遇到的_el_expressionfactory=null的NullPointerException问题,指出这通常与项目中jsp-api.jar的配置有关。文章建议检查项目及Tomcat lib目录下是否正确包含jsp-api.jar,必要时进行删除以解决冲突。

_el_expressionfactory=_jspxFactory.此行报NullPointerException

请检查项目中jar包。与tomcat中lib中的jar包是否均存在jsp-api.jar。如果存在运行时请删除。
源码报错空指针,可以优先检查jar包是否冲突。毕竟代码也不知道该找谁。

import pygame import random import math from pygame.locals import * class Particle: def __init__(self, pos, angle, speed, color): self.pos = list(pos) self.angle = angle self.speed = speed * random.uniform(0.8, 1.2) self.color = color self.age = 0 self.lifetime = random.randint(40, 60) self.gravity = 0.5 self.alpha = 255 def update(self): self.pos[0] += math.cos(self.angle) * self.speed self.pos[1] += math.sin(self.angle) * self.speed + self.gravity self.speed *= 0.95 self.age += 1 self.alpha = max(0, 255 - (255 * self.age / self.lifetime)) def draw(self, surface): if self.alpha > 0: size = max(2, int(4 * (1 - self.age/self.lifetime))) pygame.draw.circle(surface, self.color + (self.alpha,), (int(self.pos[0]), int(self.pos[1])), size) class Firework: def __init__(self, screen_width, screen_height): self.particles = [] self.screen_width = screen_width self.screen_height = screen_height hue = random.randint(0, 360) self.color = pygame.Color(0) self.color.hsla = (hue, 100, 50, 100) # 初始发射位置 start_pos = (random.randint(100, screen_width-100), screen_height) for _ in range(200): angle = random.uniform(0, 2*math.pi) speed = random.uniform(2, 8) self.particles.append(Particle(start_pos, angle, speed, self.color)) def update(self): return [p for p in self.particles if p.age < p.lifetime] def main(): pygame.init() WIDTH, HEIGHT = 800, 600 screen = pygame.display.set_mode((WIDTH, HEIGHT)) clock = pygame.time.Clock() fireworks = [] running = True while running: screen.fill((0, 0, 0)) # 随机生成新烟花 if random.random() < 0.05: fireworks.append(Firework(WIDTH, HEIGHT)) 28行有错,如何
03-15
;==================================================================== ; lst_gui_tool.pro ; ; 功能:地表温度遥感反演可视化系统 ; 包含: ; - 单通道算法 (SC) ; - 单窗算法 (MW) ; - GUI 界面 ; - ENVI DOIT 调用接口 ;==================================================================== ;----------------------------------------- ; 主函数入口 ;----------------------------------------- PRO lst_gui_tool__define ; 结构定义用于封装 GUI 状态 END PRO lst_gui_tool base = WIDGET_BASE(TITLE='Land surface temperature remote sensing retrieval system', /COLUMN) file_pick = WIDGET_BUTTON(base, VALUE='Select the image file') sc_btn = WIDGET_BUTTON(base, VALUE='Single-channel algorithm') mw_btn = WIDGET_BUTTON(base, VALUE='Single-window algorithm') exit_btn = WIDGET_BUTTON(base, VALUE='quit') WIDGET_CONTROL, base, /REALIZE ; 存储当前状态 state = {filename: '', work_dir: ''} WHILE 1 DO BEGIN event = WIDGET_EVENT() CASE event.id OF file_pick: BEGIN filename = DIALOG_PICKFILE(GET_PATH=work_dir) IF N_ELEMENTS(filename) GT 0 THEN BEGIN state.filename = filename state.work_dir = work_dir PRINT, 'Input files selected:', filename ENDIF END sc_btn: BEGIN IF state.filename NE '' THEN BEGIN out_name = DIALOG_PICKFILE(/WRITE, TITLE='Save single-channel results') result_file = do_lst_sc(state.filename, state.work_dir, OUT_NAME=out_name) PRINT, 'Single-channel results have been saved to:', result_file ENDIF ELSE BEGIN PRINT, 'Please select the input file first' ENDELSE END mw_btn: BEGIN IF state.filename NE '' THEN BEGIN out_name = DIALOG_PICKFILE(/WRITE, TITLE='Save the results of a single window') result_file = do_lst_mw(state.filename, state.work_dir, OUT_NAME=out_name) PRINT, 'Single-window results have been saved to:', result_file ENDIF ELSE BEGIN PRINT, 'Please select the input file first' ENDELSE END exit_btn: BREAK ENDCASE ENDWHILE WIDGET_CONTROL, base, /DESTROY END ;==================================================================== ; FUNCTION: DO_LST_SC ; ; PURPOSE: 执行单通道算法的地表温度反演,并保存结果 ;==================================================================== FUNCTION do_lst_sc, fn, work_dir, OUT_NAME=out_name COMPILE_OPT idl2 envi_open_file, fn, r_fid=fid envi_file_query, fid, ns=ns, nl=nl, nb=nb, dims=dims, $ data_type=data_type, interleave=interleave, offset=offset map_info = envi_get_map_info(fid=fid) b6 = envi_get_data(fid=fid, dims=dims, pos=5) b3 = envi_get_data(fid=fid, dims=dims, pos=2) b4 = envi_get_data(fid=fid, dims=dims, pos=3) b2 = envi_get_data(fid=fid, dims=dims, pos=1) b5 = envi_get_data(fid=fid, dims=dims, pos=4) L = 0.055158 * b6 + 1.2378 Tb = 1260.56 / alog(1 + 607.76 / L) NDVI = (float(b4) - b3) / (float(b4) + b3) MNDWI = (float(b2) - b5) / (float(b2) + b5) emiss = cal_Emiss(NDVI, MNDWI) b2 = !null & b3 = !null & b4 = !null & b5 = !null NDVI = !null & MNDWI = !null w = 2.49 T0 = 21 + 273.15 LST_result = cal_LST_sc(Tb, L, w, emiss) IF N_ELEMENTS(out_name) EQ 0 THEN out_name = DIALOG_PICKFILE(/WRITE, TITLE='Save the results of the single-channel algorithm') envi_write_envi_file, LST_result, OUT_NAME=out_name, $ NS=ns, NL=nl, NB=1, DATA_TYPE=4, INTERLEAVE=interleave, $ MAP_INFO=map_info RETURN, out_name END ;==================================================================== ; FUNCTION: DO_LST_MW ; ; PURPOSE: 执行单窗算法的地表温度反演,并保存结果 ;==================================================================== FUNCTION do_lst_mw, fn, work_dir, OUT_NAME=out_name COMPILE_OPT idl2 envi_open_file, fn, r_fid=fid envi_file_query, fid, ns=ns, nl=nl, nb=nb, dims=dims, $ data_type=data_type, interleave=interleave, offset=offset map_info = envi_get_map_info(fid=fid) b6 = envi_get_data(fid=fid, dims=dims, pos=5) b3 = envi_get_data(fid=fid, dims=dims, pos=2) b4 = envi_get_data(fid=fid, dims=dims, pos=3) b2 = envi_get_data(fid=fid, dims=dims, pos=1) b5 = envi_get_data(fid=fid, dims=dims, pos=4) L = 0.055158 * b6 + 1.2378 Tb = 1260.56 / alog(1 + 607.76 / L) NDVI = (float(b4) - b3) / (float(b4) + b3) MNDWI = (float(b2) - b5) / (float(b2) + b5) emiss = cal_Emiss(NDVI, MNDWI) b2 = !null & b3 = !null & b4 = !null & b5 = !null NDVI = !null & MNDWI = !null w = 2.49 T0 = 21 + 273.15 LST_result = cal_LST_mw(Tb, T0, w, emiss) IF N_ELEMENTS(out_name) EQ 0 THEN out_name = DIALOG_PICKFILE(/WRITE, TITLE='Save the results of the single-window algorithm') envi_write_envi_file, LST_result, OUT_NAME=out_name, $ NS=ns, NL=nl, NB=1, DATA_TYPE=4, INTERLEAVE=interleave, $ MAP_INFO=map_info RETURN, out_name END ;==================================================================== ; FUNCTION: CAL_EMISS ; ; PURPOSE: 计算比辐射率 ;==================================================================== FUNCTION cal_Emiss, NDVI, MNDWI result = 1.0094 + 0.047 * ALOG(NDVI) w = WHERE(NDVI LT 0.157, count) IF count GT 0 THEN result[w] = 0.923 w = WHERE(NDVI GT 0.727, count) IF count GT 0 THEN result[w] = 0.994 w = WHERE(MNDWI GT 0, count) IF count GT 0 THEN result[w] = 0.995 RETURN, result END ;==================================================================== ; FUNCTION: CAL_LST_SC ; ; PURPOSE: 单通道算法计算地表温度 ;==================================================================== FUNCTION cal_LST_sc, Tb, L, w, Emiss c1 = 1.19104E8 c2 = 14387.7 x1 = 0.14714D * w^2 - 0.15583 * w + 1.1234 x2 = -1.1836D * w^2 - 0.37607 * w - 0.52894 x3 = -0.04554D * w^2 + 1.8719 * w - 0.39071 Y = (Tb^2) / (c2 * L * (11.457^4 * L / c1 + 1 / 11.457)) Z = -Y * L + Tb Result = Y * ((x1 * L + x2) / Emiss + x3) + Z RETURN, FLOAT(result) END ;==================================================================== ; FUNCTION: CAL_LST_MW ; ; PURPOSE: 单窗算法计算地表温度 ;==================================================================== FUNCTION cal_LST_mw, Tb, T0, w, Emiss a = -67.35535 b = 0.458608 Trans = 1.031412 - 0.11536D * w Ta = 16.011 + 0.91118 * T0 C = Trans * Emiss D = (1 - Trans) * (1 + Trans * (1 - Emiss)) result = (a * (1 - C - D) + (b * (1 - C - D) + C + D) * Tb - D * Ta) / C RETURN, FLOAT(result) END ;==================================================================== ; PRO: LST_SC_DOIT ; ; PURPOSE: ENVI_DOIT 兼容接口 - 单通道算法 ;==================================================================== PRO lst_sc_doit, input_raster, output_raster COMPILE_OPT idl2 input_fn = input_raster[0].input_filename work_dir = FILE_DIRNAME(input_fn) result_file = do_lst_sc(input_fn, work_dir, OUT_NAME=output_raster) envi_open_file, result_file, /NO_REALIZE envi_add_files_to_view, result_file END ;==================================================================== ; PRO: LST_MW_DOIT ; ; PURPOSE: ENVI_DOIT 兼容接口 - 单窗算法 ;==================================================================== PRO lst_mw_doit, input_raster, output_raster COMPILE_OPT idl2 input_fn = input_raster[0].input_filename work_dir = FILE_DIRNAME(input_fn) result_file = do_lst_mw(input_fn, work_dir, OUT_NAME=output_raster) envi_open_file, result_file, /NO_REALIZE envi_add_files_to_view, result_file END运行该代码出现以下结果% Compiled module: LST_GUI_TOOL__DEFINE. result_file = do_lst_sc(state.filename, state.work_dir, OUT_NAME=out_name) ^ % Syntax error. At: C:\Users\李家成\Desktop\lst_gui_tool.pro, Line 47 result_file = do_lst_mw(state.filename, state.work_dir, OUT_NAME=out_name) ^ % Syntax error. At: C:\Users\李家成\Desktop\lst_gui_tool.pro, Line 57
06-25
#include "stm32f10x.h" #include <stdio.h> // 硬件配置 #define PWM_TIM TIM1 #define PWM_PORT GPIOA #define PWM_PIN GPIO_Pin_8 #define PWM_CHANNEL TIM_Channel_1 #define INT_PORT GPIOA #define INT_PIN GPIO_Pin_0 #define CAPTURE_TIM TIM2 #define CAPTURE_TIM_IRQn TIM2_IRQn // 全局变量 volatile uint32_t rise_time = 0; volatile uint32_t fall_time = 0; volatile uint8_t capture_done = 0; volatile uint8_t capture_state = 0; // 0:等待上升沿 1:已捕获上升沿 // 重定向printf到串口 int fputc(int ch, FILE *f) { USART_SendData(USART1, (uint8_t)ch); while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); return ch; } // 初始化USART1用于printf输出 void USART1_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; // 使能时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE); // 配置TX(PA9)和RX(PA10)引脚 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); // 配置USART1 USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Tx; USART_Init(USART1, &USART_InitStructure); USART_Cmd(USART1, ENABLE); } // PWM初始化(方波输出) void PWM_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; // 使能时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_TIM1, ENABLE); // 配置PWM引脚 GPIO_InitStructure.GPIO_Pin = PWM_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(PWM_PORT, &GPIO_InitStructure); // 定时器基础配置 TIM_TimeBaseStructure.TIM_Period = 1000 - 1; // 自动重装载值 TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1; // 预分频值 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(PWM_TIM, &TIM_TimeBaseStructure); // PWM模式配置 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 500; // 50%占空比 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OCInit(PWM_TIM, PWM_CHANNEL, &TIM_OCInitStructure); // 启动定时器 TIM_CtrlPWMOutputs(PWM_TIM, ENABLE); TIM_OC1PreloadConfig(PWM_TIM, TIM_OCPreload_Enable); TIM_ARRPreloadConfig(PWM_TIM, ENABLE); TIM_Cmd(PWM_TIM, ENABLE); } // 外部中断初始化 void EXTI_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; // 使能时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); // 配置中断引脚 GPIO_InitStructure.GPIO_Pin = INT_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 上拉输入 GPIO_Init(INT_PORT, &GPIO_InitStructure); // 配置外部中断线 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); EXTI_InitStructure.EXTI_Line = EXTI_Line0; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; // 双边沿触发 EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); // 配置NVIC NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } // 捕获定时器初始化 void Capture_Timer_Init(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure; // 使能时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // 定时器基础配置 TIM_TimeBaseStructure.TIM_Period = 0xFFFFFFFF; // 最大计数值 TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1; // 72MHz/72 = 1MHz (1us分辨率) TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(CAPTURE_TIM, &TIM_TimeBaseStructure); // 启动定时器 TIM_Cmd(CAPTURE_TIM, ENABLE); } // 外部中断服务函数 void EXTI0_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line0) != RESET) { // 上升沿检测 if(GPIO_ReadInputDataBit(INT_PORT, INT_PIN) == SET) { rise_time = TIM_GetCounter(CAPTURE_TIM); capture_state = 1; // 标记已捕获上升沿 } // 下降沿检测(且已捕获上升沿) else if(capture_state == 1) { fall_time = TIM_GetCounter(CAPTURE_TIM); capture_done = 1; // 标记完成捕获 capture_state = 0; // 重置状态 } EXTI_ClearITPendingBit(EXTI_Line0); } } int main(void) { // 初始化系统时钟 SystemInit(); // 初始化各模块 USART1_Init(); PWM_Init(); EXTI_Init(); Capture_Timer_Init(); printf("系统启动完成\r\n"); printf("方波频率: 1kHz, 占空比: 50%%\r\n"); while(1) { if(capture_done) { // 计算高电平时间(考虑定时器溢出) uint32_t high_time; if(fall_time >= rise_time) { high_time = fall_time - rise_time; } else { // 处理定时器溢出情况 high_time = (0xFFFFFFFF - rise_time) + fall_time; } // 转换为微秒输出 printf("高电平时间: %lu us\r\n", high_time); capture_done = 0; // 重置标志 } } } #include "stm32f10x.h" #include <stdio.h> // 硬件配置 #define PWM_TIM TIM1 #define PWM_PORT GPIOA #define PWM_PIN GPIO_Pin_8 #define PWM_CHANNEL TIM_Channel_1 #define INT_PORT GPIOA #define INT_PIN GPIO_Pin_0 #define CAPTURE_TIM TIM2 #define CAPTURE_TIM_IRQn TIM2_IRQn // 全局变量 volatile uint32_t rise_time = 0; volatile uint32_t fall_time = 0; volatile uint8_t capture_done = 0; volatile uint8_t capture_state = 0; // 0:等待上升沿 1:已捕获上升沿 // 重定向printf到串口 int fputc(int ch, FILE *f) { USART_SendData(USART1, (uint8_t)ch); while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); return ch; } // 初始化USART1用于printf输出 void USART1_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; // 使能时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE); // 配置TX(PA9)和RX(PA10)引脚 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); // 配置USART1 USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Tx; USART_Init(USART1, &USART_InitStructure); USART_Cmd(USART1, ENABLE); } // PWM初始化(方波输出) void PWM_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; // 使能时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_TIM1, ENABLE); // 配置PWM引脚 GPIO_InitStructure.GPIO_Pin = PWM_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(PWM_PORT, &GPIO_InitStructure); // 定时器基础配置 TIM_TimeBaseStructure.TIM_Period = 1000 - 1; // 自动重装载值 TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1; // 预分频值 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(PWM_TIM, &TIM_TimeBaseStructure); // PWM模式配置 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 500; // 50%占空比 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OCInit(PWM_TIM, PWM_CHANNEL, &TIM_OCInitStructure); // 启动定时器 TIM_CtrlPWMOutputs(PWM_TIM, ENABLE); TIM_OC1PreloadConfig(PWM_TIM, TIM_OCPreload_Enable); TIM_ARRPreloadConfig(PWM_TIM, ENABLE); TIM_Cmd(PWM_TIM, ENABLE); } // 外部中断初始化 void EXTI_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; // 使能时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); // 配置中断引脚 GPIO_InitStructure.GPIO_Pin = INT_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 上拉输入 GPIO_Init(INT_PORT, &GPIO_InitStructure); // 配置外部中断线 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); EXTI_InitStructure.EXTI_Line = EXTI_Line0; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; // 双边沿触发 EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); // 配置NVIC NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } // 捕获定时器初始化 void Capture_Timer_Init(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure; // 使能时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // 定时器基础配置 TIM_TimeBaseStructure.TIM_Period = 0xFFFFFFFF; // 最大计数值 TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1; // 72MHz/72 = 1MHz (1us分辨率) TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(CAPTURE_TIM, &TIM_TimeBaseStructure); // 启动定时器 TIM_Cmd(CAPTURE_TIM, ENABLE); } // 外部中断服务函数 void EXTI0_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line0) != RESET) { // 上升沿检测 if(GPIO_ReadInputDataBit(INT_PORT, INT_PIN) == SET) { rise_time = TIM_GetCounter(CAPTURE_TIM); capture_state = 1; // 标记已捕获上升沿 } // 下降沿检测(且已捕获上升沿) else if(capture_state == 1) { fall_time = TIM_GetCounter(CAPTURE_TIM); capture_done = 1; // 标记完成捕获 capture_state = 0; // 重置状态 } EXTI_ClearITPendingBit(EXTI_Line0); } } int main(void) { // 初始化系统时钟 SystemInit(); // 初始化各模块 USART1_Init(); PWM_Init(); EXTI_Init(); Capture_Timer_Init(); printf("系统启动完成\r\n"); printf("方波频率: 1kHz, 占空比: 50%%\r\n"); while(1) { if(capture_done) { // 计算高电平时间(考虑定时器溢出) uint32_t high_time; if(fall_time >= rise_time) { high_time = fall_time - rise_time; } else { // 处理定时器溢出情况 high_time = (0xFFFFFFFF - rise_time) + fall_time; } // 转换为微秒输出 printf("高电平时间: %lu us\r\n", high_time); capture_done = 0; // 重置标志 } } }#include "stm32f10x.h" #include <stdio.h> // 硬件配置 #define PWM_TIM TIM1 #define PWM_PORT GPIOA #define PWM_PIN GPIO_Pin_8 #define PWM_CHANNEL TIM_Channel_1 #define INT_PORT GPIOA #define INT_PIN GPIO_Pin_0 #define CAPTURE_TIM TIM2 #define CAPTURE_TIM_IRQn TIM2_IRQn // 全局变量 volatile uint32_t rise_time = 0; volatile uint32_t fall_time = 0; volatile uint8_t capture_done = 0; volatile uint8_t capture_state = 0; // 0:等待上升沿 1:已捕获上升沿 // 重定向printf到串口 int fputc(int ch, FILE *f) { USART_SendData(USART1, (uint8_t)ch); while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); return ch; } // 初始化USART1用于printf输出 void USART1_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; // 使能时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE); // 配置TX(PA9)和RX(PA10)引脚 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); // 配置USART1 USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Tx; USART_Init(USART1, &USART_InitStructure); USART_Cmd(USART1, ENABLE); } // PWM初始化(方波输出) void PWM_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; // 使能时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_TIM1, ENABLE); // 配置PWM引脚 GPIO_InitStructure.GPIO_Pin = PWM_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(PWM_PORT, &GPIO_InitStructure); // 定时器基础配置 TIM_TimeBaseStructure.TIM_Period = 1000 - 1; // 自动重装载值 TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1; // 预分频值 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(PWM_TIM, &TIM_TimeBaseStructure); // PWM模式配置 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 500; // 50%占空比 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OCInit(PWM_TIM, PWM_CHANNEL, &TIM_OCInitStructure); // 启动定时器 TIM_CtrlPWMOutputs(PWM_TIM, ENABLE); TIM_OC1PreloadConfig(PWM_TIM, TIM_OCPreload_Enable); TIM_ARRPreloadConfig(PWM_TIM, ENABLE); TIM_Cmd(PWM_TIM, ENABLE); } // 外部中断初始化 void EXTI_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; // 使能时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); // 配置中断引脚 GPIO_InitStructure.GPIO_Pin = INT_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 上拉输入 GPIO_Init(INT_PORT, &GPIO_InitStructure); // 配置外部中断线 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); EXTI_InitStructure.EXTI_Line = EXTI_Line0; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; // 双边沿触发 EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); // 配置NVIC NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } // 捕获定时器初始化 void Capture_Timer_Init(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure; // 使能时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // 定时器基础配置 TIM_TimeBaseStructure.TIM_Period = 0xFFFFFFFF; // 最大计数值 TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1; // 72MHz/72 = 1MHz (1us分辨率) TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(CAPTURE_TIM, &TIM_TimeBaseStructure); // 启动定时器 TIM_Cmd(CAPTURE_TIM, ENABLE); } // 外部中断服务函数 void EXTI0_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line0) != RESET) { // 上升沿检测 if(GPIO_ReadInputDataBit(INT_PORT, INT_PIN) == SET) { rise_time = TIM_GetCounter(CAPTURE_TIM); capture_state = 1; // 标记已捕获上升沿 } // 下降沿检测(且已捕获上升沿) else if(capture_state == 1) { fall_time = TIM_GetCounter(CAPTURE_TIM); capture_done = 1; // 标记完成捕获 capture_state = 0; // 重置状态 } EXTI_ClearITPendingBit(EXTI_Line0); } } int main(void) { // 初始化系统时钟 SystemInit(); // 初始化各模块 USART1_Init(); PWM_Init(); EXTI_Init(); Capture_Timer_Init(); printf("系统启动完成\r\n"); printf("方波频率: 1kHz, 占空比: 50%%\r\n"); while(1) { if(capture_done) { // 计算高电平时间(考虑定时器溢出) uint32_t high_time; if(fall_time >= rise_time) { high_time = fall_time - rise_time; } else { // 处理定时器溢出情况 high_time = (0xFFFFFFFF - rise_time) + fall_time; } // 转换为微秒输出 printf("高电平时间: %lu us\r\n", high_time); capture_done = 0; // 重置标志 } } } 在上述代码中出现main.c(170): error: #165: too few arguments in function call的错怎么解决
07-27
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值