MSP430单片机Timer_B模块详解

需积分: 9 2 下载量 97 浏览量 更新于2024-07-14 收藏 1.25MB PPT 举报
"各模块简要介绍—Timer_B-msp430简易教程" MSP430单片机是一种由美国德州仪器(TI)推出的16位超低功耗混合信号处理器,自1996年问世以来,因其独特的特性和广泛应用而备受青睐。MSP430系列单片机的主要特点是低功耗、高集成度、易用性和代码安全性。 在低功耗方面,MSP430可以在掉电模式下仅消耗0.1微安的电流,等待模式下消耗0.8安培,而在1MIPS运行速度下,每秒时钟唤醒时间只需250微安。此外,其端口漏电流仅为50纳安,这使得它非常适合电池供电或对电源效率有严格要求的应用。 MSP430的高集成度体现在其芯片内集成了多种模拟和数字电路,如10位和12位SAR ADC(采样保持型模数转换器),最高可达200ksps的采样率,12位DAC(数模转换器)、运算放大器、程序可配置增益放大器、LCD驱动器,以及硬件乘法器、DMA等功能。此外,MSP430单片机采用16位RISC架构的CPU,拥有27条核心指令和7种寻址模式,使其执行效率高且编程灵活。 在易用性方面,MSP430支持基于JTAG的嵌入式仿真,简化了调试过程。同时,市场上有相对便宜的开发工具,且TI提供了丰富的应用文档,便于开发者学习和使用。为了保证代码安全,MSP430具有硬件熔丝结构,支持BSL(Boot Loader Security)升级,并能在密码错误时自动擦除数据,确保了代码的安全性。 MSP430家族有多个子系列,例如MSP4304xx系列专为LCD应用设计,提供1.8伏至3.6伏的工作电压和高达120kB的闪存/ROM。MSP4303xx系列是ROM/OTP产品,工作电压范围为2.5伏至5.5伏,最大32kB存储空间。MSP430x1xx系列同样基于闪存/ROM,适用于1.8伏至3.6伏电压,提供60kB存储和8MIPS。MSP430F2xx和MSP430F5xx系列则具备掉电复位功能,分别支持6MIPS和8MIPS的速度。 关于Timer_B模块,它是MSP430单片机中的一个重要定时器,具备7个捕捉比较模块。与Timer_A相比,Timer_B的计数长度更为灵活,可选择8位、10位、12位或16位。其独特之处在于捕捉比较寄存器TBCCRx采用了双缓冲结构,允许不同寄存器之间的组合,从而实现精确同步的比较输出,这对需要高精度定时和同步控制的应用非常有价值。 MSP430单片机凭借其卓越的低功耗性能、高度集成的硬件资源、强大的处理能力以及便捷的开发环境,广泛应用于各种领域,如位移测量装置等。Timer_B模块的特性则进一步增强了其在实时控制和精确计时应用中的实用性。对于学习和开发MSP430的工程师来说,理解并熟练运用Timer_B的功能至关重要。

重写下面代码;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 上传