利用MSP430F5529定时器捕获功能,实现信号周期或频率的测量
// 这个程序利用TIMER A0生成1KHz的方波,从引脚P1.3输出,送到引脚P7.4,
// 再利用TIMER B0测量周期。为测试方便,引脚P1.0输出32KHz的ACLK,
// 引脚P2.2输出12MHz的SMCLK.
// ACLK = LFXT1 = 32kHz; SMCLK = MCLK = 12MHz
//
// MSP430F5529
// -------------------------
// /|\| XT1IN|-
// | | | 32kHz
// --|RST XT1OUT|-
// | |
// | P7.4/TB0.2|<-- CCI2A <-|
// | P1.3/TA0.2|--> CCR2 -->|
// | |
// | | MCLK = 12MHz DCO
// | P2.2|--> SMCLK = 12MHz DCO
// | P1.0|--> ACLK = 32kHz LFXT1
// --------------------------
//******************************************************************************
#include "driverlib.h"
uint16_t REdge1, REdge2, Period, InterCount = 0;
void main(void)
{
// Stop WDT
WDT_A_hold(WDT_A_BASE);
// Configure XT1
GPIO_setAsPeripheralModuleFunctionInputPin(
GPIO_PORT_P5,
GPIO_PIN4 + GPIO_PIN5
);
UCS_turnOnLFXT1 (UCS_XT1_DRIVE_3,
UCS_XCAP_3
);
// Increase Vcore setting to level1 to support fsystem=12MHz
// NOTE: Change core voltage one level at a time..
PMM_setVCore (PMM_CORE_LEVEL_1);
// Initialize DCO to 12MHz
UCS_initFLLSettle(12000,
374);
// Setup Port Pins
//P1.0 --> ACLK
GPIO_setAsPeripheralModuleFunctionOutputPin(
GPIO_PORT_P1,
GPIO_PIN0
);
//P2.2 --> SMCLK
GPIO_setAsPeripheralModuleFunctionOutputPin(
GPIO_PORT_P2,
GPIO_PIN2
);
// Configure ports TB0.2 input and TA0.2 output
// TB0.2 input
// TB0.2 option select
// TA0.2 output
// TA0.2 option select
GPIO_setAsPeripheralModuleFunctionOutputPin(
GPIO_PORT_P1,
GPIO_PIN3
);
GPIO_setAsPeripheralModuleFunctionInputPin(
GPIO_PORT_P7,
GPIO_PIN4
);
// Configure TA0.2 compare output, 1kHz freq, 50% dutycycle
Timer_A_initCompareModeParam initCompParam = {0};
initCompParam.compareRegister = TIMER_A_CAPTURECOMPARE_REGISTER_2;
initCompParam.compareInterruptEnable = TIMER_A_CAPTURECOMPARE_INTERRUPT_DISABLE;
initCompParam.compareOutputMode = TIMER_A_OUTPUTMODE_TOGGLE;
initCompParam.compareValue = 16;
Timer_A_initCompareMode(TIMER_A0_BASE, &initCompParam);
Timer_A_initUpModeParam initUpParam = {0};
initUpParam.clockSource = TIMER_A_CLOCKSOURCE_ACLK;
initUpParam.clockSourceDivider = TIMER_A_CLOCKSOURCE_DIVIDER_1;
initUpParam.timerPeriod = 16;
initUpParam.timerInterruptEnable_TAIE = TIMER_A_TAIE_INTERRUPT_DISABLE;
initUpParam.captureCompareInterruptEnable_CCR0_CCIE =
TIMER_A_CAPTURECOMPARE_INTERRUPT_DISABLE;
initUpParam.timerClear = TIMER_A_DO_CLEAR;
initUpParam.startTimer = false;
Timer_A_initUpMode(TIMER_A0_BASE, &initUpParam);
Timer_A_startCounter(TIMER_A0_BASE,
TIMER_A_UP_MODE
);
Timer_B_initContinuousModeParam initContParam = {0};
initContParam.clockSource = TIMER_B_CLOCKSOURCE_SMCLK;
initContParam.clockSourceDivider = TIMER_B_CLOCKSOURCE_DIVIDER_1;
initContParam.timerInterruptEnable_TBIE = TIMER_B_TBIE_INTERRUPT_DISABLE;
initContParam.timerClear = TIMER_B_DO_CLEAR;
Timer_B_initContinuousMode(TIMER_B0_BASE, &initContParam);
Timer_B_startCounter(TIMER_B0_BASE,
TIMER_B_CONTINUOUS_MODE
);
Timer_B_clearCaptureCompareInterrupt(TIMER_B0_BASE,
TIMER_B_CAPTURECOMPARE_REGISTER_2);
Timer_B_initCaptureModeParam initCapParam = {0};
initCapParam.captureRegister = TIMER_B_CAPTURECOMPARE_REGISTER_2;
initCapParam.captureMode = TIMER_B_CAPTUREMODE_RISING_EDGE;
initCapParam.captureInputSelect = TIMER_B_CAPTURE_INPUTSELECT_CCIxA;
initCapParam.synchronizeCaptureSource = TIMER_B_CAPTURE_SYNCHRONOUS;
initCapParam.captureInterruptEnable = TIMER_B_CAPTURECOMPARE_INTERRUPT_ENABLE;
initCapParam.captureOutputMode = TIMER_B_OUTPUTMODE_OUTBITVALUE;
Timer_B_initCaptureMode(TIMER_B0_BASE, &initCapParam);
while(1)
{
__bis_SR_register(LPM0_bits + GIE); // Enter LPM0
__no_operation(); // For debugger
}
}
// Timer0_B1 Interrupt Vector
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector=TIMER0_B1_VECTOR
__interrupt
#elif defined(__GNUC__)
__attribute__((interrupt(TIMER0_B1_VECTOR)))
#endif
void TIMER0_B1_ISR (void)
{
switch(TB0IV)
{
case 0x04://捕捉比较中断2
if(InterCount == 0)
{
REdge1 = Timer_B_getCaptureCompareCount(TIMER_B0_BASE,
TIMER_B_CAPTURECOMPARE_REGISTER_2);
InterCount ++;
}
else
{
REdge2 = Timer_B_getCaptureCompareCount(TIMER_B0_BASE,
TIMER_B_CAPTURECOMPARE_REGISTER_2);
InterCount = 0;
Period = (REdge2 - REdge1);
}
break;
default:
break;
}
__bic_SR_register_on_exit(LPM0_bits); // Exit LPM0
}
利用MSP430F5529定时器捕获功能,实现信号周期或频率的测量相关推荐
- 基于定时器捕获功能的红外解码程序(NEC协议)
文章目录 前言 一.红外协议简介 1. ITT Protocol 2. NEC 协议 3. Nokia NRC17 协议 二.红外解码程序(NEC协议) 1. 软硬件环境及红外解码状态图 2. 基于定 ...
- stm32上升沿采样_定时器捕获外部上升沿信号,DMA读取GPIO口数据的问题
小弟新手,最近在做STM32采集片外AD信号的程序 现在用了Tim2的ch3捕获功能监控外部触发采样的信号,片外AD输出8位并行数据接GPIO口,当外部采样信号到来时,DMA读取GPIO口数据并保存到 ...
- 使用c++ 实现定时触发键盘事件_基于定时器捕获测量脉宽的应用示例
我们知道,利用单片机定时器捕获功能测量脉冲信号宽度及占空比是种很常见的做法.这里以STM32的定时器为例来介绍基于其捕获功能实现对脉宽的测量的思路及过程. 一般来讲,使用STM32定时器的捕获功能来实 ...
- 基于定时器捕获测量脉宽的应用示例
我们知道,利用单片机定时器捕获功能测量脉冲信号宽度及占空比是种很常见的做法.这里以STM32的定时器为例来介绍基于其捕获功能实现对脉宽的测量的思路及过程. 一般来讲,使用STM32定时器的捕获功能来实 ...
- STM32F103定时器输入捕获功能
STM32F103单片机的定时器不仅能输出PWM波,而且还能捕获输入的PWM波.可以通过定时器的捕获功能测量输入PWM波的周期和占空比.其中定时器的输入捕获功能如下: 在输入捕获模式下,当检测 ...
- STM32笔记——定时器输入捕获功能(测量PWM的频率和占空比)
目录 一.概述 二.输入捕获功能 2.1 输入捕获简介 2.2 输入捕获通道 三.输入捕获功能测量PWM波的频率和占空比 3.1 测量频率的方法 3.2 测量过程 一.概述 主要介绍通用定时器的输入捕 ...
- 利用STM32的定时器中断功能编写线阵CCD(ILX554B)的驱动时序
利用STM32的定时器中断功能编写线阵CCD(ILX554B)的驱动时序 1.利用定时器完成线阵CCDILX554B的驱动时序,采用两个管脚1个用于产生ROG信号,一个用于产生CLK信号 2.使用一个 ...
- 如何使用定时器捕获一路PWM波信号的频率和占空比
本次实验将采用定时器2的通道2产生两路频率和占空比均可调的PWM信号,然后使用定时器3的通道1来捕获其中的一路PWM波的频率和占空比. 1.首先来看下产生PWM波的程序,也就是和上篇博客是一样的,只不 ...
- STM32f103C8定时器输出PWM波信号
利用stm32高级定时器输出PWM,模拟呼吸灯的效果带刹车功能.由于没有示波器查看输出的pwm波形图,所以本次实验使用普通直流电机模拟的. 本文章为学习笔记,其中有些地方解释的不是那么的好,即本笔记可 ...
最新文章
- ICRA 2021自动驾驶相关论文汇总 | 科研党看过来,全文干货
- celery 运行时 (from . import async, base)SyntaxError: invalid syntax 异常的解决方案
- python3+scapy扫描获取局域网主机ip和mac
- uva 10161 Ant on a Chessboard 蛇形矩阵 简单数学题
- 如何判断文本文件的编码格式?
- 科学与技术名词解释计算机病毒,名词解释计算机病毒
- 为Xen虚拟机扩容根文件系统(LVM)
- Leetcode 647.回文子串
- cutftp连接server-U中文乱码问题解决
- 网络安全实验室之基础关
- mysql 数据库和实例_mysql中数据库和数据库实例的概念区别
- 一文读懂海姆达尔Heimdallr经济模型,解析链游明星的价值优势
- 传奇中添加NPC及功能脚本
- apple id两步验证服务器,apple id两步验证 苹果Apple ID两步式验证设置使用教程
- 网易企业邮箱服务器没有响应,网易邮箱企业邮箱无法收发信是怎么回事
- 搭建个人网站--域名申请
- go 格式化占位符详解
- PEPC丨磷酸烯醇丙酮酸羧化酶应用实例展示
- python高精度定时器中断_0015 高精度定时器
- 我才20岁,要接受自己的平庸吗?