复旦微电子FM1702SL-QFN读卡机芯片TIMER控制机制解析

需积分: 8 9 下载量 30 浏览量 更新于2024-08-10 收藏 931KB PDF 举报
"这篇文档主要介绍了和利时DCS控制系统中K系列TIMER的应用。TIMER作为一个自减计数器,其工作原理、启动与停止条件、时钟周期计算以及与微处理器的交互进行了详细阐述。此外,文档还提及了FM1702SL和FM1702QFN通用读卡机芯片的相关信息,包括产品说明书和版本历史。" 在和利时DCS控制系统K系列中,TIMER是核心组件之一,它用于实现精确的时间控制和定时功能。TIMER包含一个自减计数器,当AutoRestart设置为1时,计数器在不为0的情况下持续自减。当计数器减到1时,它会在下一个时钟脉冲到来时自动加载TimerReload寄存器的值,然后重新开始计数。TIMER的启动可以由TxBegin、TxEnd事件触发,也可以由微处理器设置的TStartNow标志启动。 TIMER的停止则可以通过RxBegin、RxEnd事件,或者当计数器减到0且TAutoRestart为0,或者是微处理器设置的TStopNow标志来实现。值得注意的是,修改TimerReload寄存器的值并不会立即影响计数器,只有在TIMER下次重新开始时,新的初始值才会生效。 TIMER的时钟周期由13.56MHz的系统时钟分频得到,分频数由TPreScaler寄存器决定,范围从0到21,对应的TimerClock时钟频率从74ns到150ms。因此,TIMER的工作时间范围可以从74ns到40s,具体计算公式为TimerLoadValue - TimerValue / TimerClockFrequency。 文档中还提到了FM1702SL和FM1702QFN通用读卡机芯片,这是上海复旦微电子集团股份有限公司的产品,适用于读卡机应用。该芯片提供了数字接口,如SPI接口,能与微处理器进行通信,并且具有自动检测微处理器接口类型的功能。文档还包含了芯片的结构图、管脚信息和版本历史,为用户提供了全面的技术参考。 在使用这些技术时,用户需要根据实际需求综合评估所有信息,确保系统兼容性和稳定性。同时,需要注意的是,复旦微电子的产品不应用于化学、救生及生命维持系统,且未经授权,不得复制或翻印相关资料。用户应关注公司发布的最新信息,以获取最新的产品更新和技术支持。

重写下面代码;timer_handle_t itcs_timer_init(timer_handle_t handle, timer_event_cb_t cb_event) { timer_priv_t *timer_priv = handle; if (timer_priv->idx < 0 || timer_priv->idx >= CONFIG_TIMER_NUM) { return NULL; } set_clock_type("cpu-pclk"); // printf("enter timer init fun in driver\n"); uint32_t tempreg = 0; switch (timer_priv->idx) { case 0: timer_priv->base = ITCS_TIMER0_BASE; break; case 1: timer_priv->base = ITCS_TIMER1_BASE; break; default: break; } // printf("unit %d ,timeridx %d, base addr // %08x\n",timer_priv->idx,timer_priv->timeridx,timer_priv->base); switch (timer_priv->timeridx) { case 1: tempreg = readl(timer_priv->base + TIMER_CCR_CONTROL_C1); tempreg |= CCR_RST_ENABLE; writel(tempreg, timer_priv->base + TIMER_CCR_CONTROL_C1); tempreg = readl(timer_priv->base + TIMER_IER_C1); tempreg &= ~(IER_EVNT_ENABLE | IER_ITRV_ENABLE | IER_M1_ENABLE | IER_M2_ENABLE | IER_M3_ENABLE); writel(tempreg, timer_priv->base + TIMER_IER_C1); if (timer_priv->idx == 0) { timer_priv->irq = TTC0_TIMER1_IRQn; request_irq(TTC0_TIMER1_IRQn, itcs_timer_irq, "itcs_timer_irq01", timer_priv); } else { timer_priv->irq = TTC1_TIMER1_IRQn; request_irq(TTC1_TIMER1_IRQn, itcs_timer_irq, "itcs_timer_irq11", timer_priv); } break; case 2: tempreg = readl(timer_priv->base + TIMER_CCR_CONTROL_C2); tempreg |= CCR_RST_ENABLE; writel(tempreg, timer_priv->base + TIMER_CCR_CONTROL_C2); tempreg = readl(timer_priv->base + TIMER_IER_C2); tempreg &= ~(IER_EVNT_ENABLE | IER_ITRV_ENABLE | IER_M1_ENABLE | IER_M2_ENABLE | IER_M3_ENABLE); writel(tempreg, timer_priv->base + TIMER_IER_C2); if (timer_priv->idx == 0) { timer_priv->irq = TTC0_TIMER2_IRQn; request_irq(TTC0_TIMER2_IRQn, itcs_timer_irq, "itcs_timer_irq02", timer_priv); } else { timer_priv->irq = TTC1_TIMER2_IRQn; request_irq(TTC1_TIMER2_IRQn, itcs_timer_irq, "itcs_timer_irq12", timer_priv); } break; case 3: tempreg = readl(timer_priv->base + TIMER_CCR_CONTROL_C3); tempreg |= CCR_RST_ENABLE; writel(tempreg, timer_priv->base + TIMER_CCR_CONTROL_C3); tempreg = readl(timer_priv->base + TIMER_IER_C3); tempreg &= ~(IER_EVNT_ENABLE | IER_ITRV_ENABLE | IER_M1_ENABLE | IER_M2_ENABLE | IER_M3_ENABLE); writel(tempreg, timer_priv->base + TIMER_IER_C3); if (timer_priv->idx == 0) { timer_priv->irq = TTC0_TIMER3_IRQn; request_irq(TTC0_TIMER3_IRQn, itcs_timer_irq, "itcs_timer_irq03", timer_priv); // printf("unit timer1 ret=%08x , request irq3 success!\n",ret); } else { timer_priv->irq = TTC1_TIMER3_IRQn; request_irq(TTC1_TIMER3_IRQn, itcs_timer_irq, "itcs_timer_irq13", timer_priv); // printf("unit timer1 ret=%08x , request irq3 success!\n",ret); } break; default: return NULL; } timer_priv->cb_event = cb_event; // printf("init status irq id num:%d\n",timer_priv->irq); // printf("INIT TIMER %d Timer Count No %d SUCCESS\n", timer_priv->idx, // timer_priv->timeridx); return (timer_handle_t)timer_priv; }

2023-02-17 上传
2023-02-18 上传