timer 公司内部用法

init中

WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);

			//创建 线程
			Timer timer = new Timer();
			timer.schedule(new ReinitializationSerialNumber(wac), getDayTime(),24 * 60 * 60 * 1000);

public Date getDayTime() {
		Calendar calendar = Calendar.getInstance();
		calendar.set(Calendar.HOUR_OF_DAY, 23);
		calendar.set(Calendar.MINUTE, 59);
		calendar.set(Calendar.SECOND, 59);
		return calendar.getTime();
		
	}

继承TimerTask创建类

package gts.erp.timer;

import gts.erp.service.ERPUtilServiceImpl;

import java.util.TimerTask;

import org.springframework.web.context.WebApplicationContext;

public class ReinitializationSerialNumber extends TimerTask{
	
	private WebApplicationContext wac;
	
	public ReinitializationSerialNumber(WebApplicationContext wac) {
		this.wac = wac;
	}
	
	public void run() {
		ERPUtilServiceImpl erpUtilServiceImpl = (ERPUtilServiceImpl)wac.getBean("erpUtilService");
		erpUtilServiceImpl.reinitializationSerialNumber();
		
	}

}


执行的方法

public void reinitializationSerialNumber() {
		// 读取数据 --> TN_SERIAL_NUMBER
		TableBean serialNumberTablebean = new TableBean();
		serialNumberTablebean = this.getBaseDAO().queryForTableBean(new ClassPOJO("TN_SERIAL_NUMBER"));
		// CN_CYCLE_FLAG 是否    年
		boolean isYear = isYearStart();
		// CN_CYCLE_FLAG 是否    月
		boolean isMonth = isMonthStart();
		// CN_CYCLE_FLAG 是否    周
		boolean isWeek = isWeekStart();
		//定义 更新的TableBean
		TableBean updateTableBean = new TableBean("TN_SERIAL_NUMBER");
		//说明该TableBean 是用于更新
		updateTableBean.setDbTableDataOperationId(TriangleDefinition.DATABASE_TABLE_DATA_OPERATION_UPDATE);
		for (int i = 0; i < serialNumberTablebean.size(); i++) {
			RowBean rowBean = serialNumberTablebean.get(i);
			String cycleFlag = rowBean.getCellBeanValue("CR_CYCLE_FLAG");
			//类型是年 且当前日期符合  将rowBean添加到TableBean中
			if (ERPDefinition.LOOKUP_SERIAL_NUMBER_CYCLE_YEAR.equals(cycleFlag) && isYear) {
				rowBean.setCellBeanValue("CN_SN", "0");
				updateTableBean.addRowBean(rowBean);
			} else if (ERPDefinition.LOOKUP_SERIAL_NUMBER_CYCLE_MONTH.equals(cycleFlag) && isMonth) {
				rowBean.setCellBeanValue("CN_SN", "0");
				updateTableBean.addRowBean(rowBean);
			} else if (ERPDefinition.LOOKUP_SERIAL_NUMBER_CYCLE_WEEK.equals(cycleFlag) && isWeek) {
				rowBean.setCellBeanValue("CN_SN", "0");
				updateTableBean.addRowBean(rowBean);
			} else if (ERPDefinition.LOOKUP_SERIAL_NUMBER_CYCLE_DAY.equals(cycleFlag)) {
				rowBean.setCellBeanValue("CN_SN", "0");
				updateTableBean.addRowBean(rowBean);
			}
		}
		this.getBaseDAO().saveOrUpdateTableBean(updateTableBean);
	}
应用

 * 根据key cycleFlag(周期标志) 查询流水号
	 * 存在 根据key 更新流水号
	 * 不存在 插入 
	 * @param String key,String cycleFlag(周期性标志)
	 * @return returnData 流水号
	 */
	public synchronized String getSerialNumber(String key, int cycleFlag) {
		String currentTime = String.valueOf(ERPBLHelper.getCurrentTime());
		String sn_default = "1";
		String returnData = sn_default;
		try {
			CondSetBean csb = new CondSetBeanJustAnd();
			csb.addCondBean(new CondBeanEqual("CN_NAME", key));
			csb.addCondBean(new CondBeanEqual("CR_CYCLE_FLAG", String.valueOf(cycleFlag)));
			FormBean serialNumberFB = this.getBaseDAO().queryForFormBean(new ClassPOJO("TN_SERIAL_NUMBER"), csb);
			if (serialNumberFB != null && serialNumberFB.size() > 0) {
				returnData = String.valueOf(Long.parseLong(serialNumberFB.getCellBeanValue("CN_SN")) + 1);
				serialNumberFB.setCellBeanValue("CN_SN", returnData);
			} else {
				// 得到一个默认管理员的ID
				CondSetBean csbUser = new CondSetBeanJustAnd();
				csbUser.addCondBean(new CondBeanEqual("CR_TYPE_ID", TriangleDefinition.USER_TYPE_ADMIN_META));
				TableBean userTableBean = this.getBaseDAO().queryForTableBean(new ClassPOJO("ST_USER"), csbUser);
				String userId = userTableBean.get(0).getCellBeanValue(TriangleDefinition.COLUMN_NAME_CN_ID);

				serialNumberFB = new FormBean("TN_SERIAL_NUMBER");
				serialNumberFB.addCellBean(new CellBean("CN_NAME", key));
				serialNumberFB.addCellBean(new CellBean("CR_CYCLE_FLAG", String.valueOf(cycleFlag)));
				serialNumberFB.addCellBean(new CellBean("CN_SN", sn_default));
				serialNumberFB.addCellBean(new CellBean("CR_CREATE_USER_ID", userId));
				serialNumberFB.addCellBean(new CellBean("CN_CREATE_DATETIME", currentTime));
				serialNumberFB.addCellBean(new CellBean("CR_MODIFY_USER_ID", userId));
				serialNumberFB.addCellBean(new CellBean("CN_MODIFY_DATETIME", currentTime));
			}
			this.getBaseDAO().saveOrUpdateFormBean(serialNumberFB);
		} catch (Exception e) {
			TriangleBLHelper.printExceptionLog(log, e);
			e.printStackTrace();
			throw new RuntimeException("**** Run time Exception!****");
		}
		return returnData;
	}




### 使用 TIMER内部低速时钟(LSI)进行校准的方法 为了减少 LSI 作为 RTC 或 FWDGT 的时钟源时产生的误差,可以利用外部精确的时钟源(如 HSE 或 LSE),通过定时器测量 LSI 的实际频率并对其进行校准。以下是具体实现方式: #### 定义原理 由于每颗 MCU 的 LSI 频率可能存在一定范围内的波动(通常在 30 kHz 到 60 kHz 之间[^2]),因此需要一种机制来测量其真实频率。此过程可以通过计数器功能完成,其中使用高精度时钟源(例如 HSE 或 LSE)作为参考时钟。 #### 实现方法 1. **启用相关外设** 启用所需的时钟源以及 TIM 外设的相关寄存器。这包括开启 LSI 和 HSE/LSE,并确保它们处于稳定工作状态。 2. **配置输入捕获通道** 将 TIM 的某个通道配置为输入捕获模式,用于捕捉由 LSI 提供的信号边沿变化情况。此时需注意选择合适的滤波参数以提高抗干扰能力。 3. **设定时间基准** 基于选定的高频参考时钟(HSE 或 LSE),定义一个已知周期的时间间隔,在该时间段内统计来自 LSI 的脉冲数量。这个操作能够间接反映当前环境下 LSI 的实际运行速度。 4. **执行测量与计算** 开始一次完整的测量流程之后,读取记录下来的高低电平转换次数数据;再依据所采用的标准时基长度推导出最终测得的 LSI 频率值。 5. **调整预分频系数** 根据上述得出的结果重新设定涉及 LSI 应用场景下的任何必要比例因子——比如针对实时闹钟模块或者窗口看护狗电路中的除法运算部分做出相应修改,从而补偿原始估计值同实测值得差异带来的影响。 下面给出一段基于 STM32 微控制器平台上的伪代码示例说明这一逻辑框架的具体编码形式: ```c // 初始化函数:初始化TIMx及其GPIO端口配置等基础环境搭建工作省略... void Init_Timer_For_Calibration(void){ // ...其他必要的硬件资源初始化代码... /* 设置自动重装载寄存器ARR */ TIM_SetAutoreload(TIMx, ReferenceClockPeriod); /* 输入捕获比较单元IC1映射到TI1引脚上*/ GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.Pin = GPIO_PIN_x; HAL_GPIO_Init(GPIO_PORTx,&GPIO_InitStruct); /* 配置TIMx_CH1为上升沿触发模式 */ TIM_ICInitStructure.TIM_Channel=TIM_CHANNEL_1 ; TIM_ICInitStructure.TIM_ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING; TIM_ICInitStructure.TIM_ICSelection = TIM_ICSELECTION_DIRECTTI; TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; TIM_ICInitStructure.TIM_ICFilter = 0xF;//适当增加数字过滤效果更佳 TIM_ICInit(TIMx, &TIM_ICInitStructure); } uint32_t Measure_LSI_Frequency(void){ uint32_t IC_Val1, IC_Val2; /* 清零标志位准备接收第一次有效中断到来后的采样数据 */ __HAL_TIM_SET_CAPTUREPOLARITY(TIMx,TIM_CHANNEL_1,TIM_INPUTCHANNELPOLARITY_RISING); while(__HAL_TIM_GET_FLAG(TIMx,TIM_IT_CC1)==RESET){} ;//等待第一个事件发生 IC_Val1=__HAL_TIM_GetCounter(TIMx);//获取此刻计数值 /* 继续监视直至再次满足条件为止*/ while(__HAL_TIM_GET_FLAG(TIMx,TIM_IT_CC1)==SET){} IC_Val2=__HAL_TIM_GetCounter(TIMx)-IC_Val1 ; return ((ReferenceFrequency*IC_Val2)/ReferenceClockPeriod); } ``` 以上片段展示了如何借助嵌入式开发工具链提供的 API 接口简化复杂度的同时实现了预期目标的功能需求。 --- #### 注意事项 - 如果项目中有可用晶体振荡器,则优先考虑将其当作参照标准而非依赖内部高速RC振荡器(HSI),因为后者同样存在个体间不一致性问题。 - 在某些特殊应用场景下如果允许的话也可以尝试直接切换至更加稳定的LSE替代原本计划使用的LSI路径上来规避此类麻烦事前预防总是优于事后补救措施!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值