身份证中提取性别:LM3S1138作为下位机,用于电压采集、脉冲发生、电流采集、频率测量、脉冲测量等
来源:百度文库 编辑:九乡新闻网 时间:2024/05/01 16:20:04
转载
这几天培训结束了,在这边也是闲的无聊,就是在电脑边上打发打发时间,坐等下班。哎这样的日子真无聊,今天接到通知,好像内部的培训还要到5月。。我猜怎么着也要到内部培训结束才给定岗。没事干,摆弄摆弄自己的板子,随便搞一搞,用LM3S1138作为下位机,用于电压采集、脉冲发生、电流采集、频率测量、脉冲测量等。
#include "systemInit.h"
#include "uartGetPut.h"
#include
#include
#include
#include
#define PART_LM3S1138
#include
#define ADCSequEnable ADCSequenceEnable
#define ADCSequDisable ADCSequenceDisable
#define ADCSequConfig ADCSequenceConfigure
#define ADCSequStepConfig ADCSequenceStepConfigure
#define ADCSequDataGet ADCSequenceDataGet
volatile tBoolean ADC_EndFlag = false; // 定义ADC转换结束的标志
volatile tBoolean CAP_Flag = false; // 定义捕获标志
unsigned char function,Per,Frequence,num,init_time,second;
unsigned char received_data[3];
unsigned long Time;
volatile unsigned char Channel;
char cc[10];
// ADC初始化
void adcInit(void)
{
SysCtlPeriEnable(SYSCTL_PERIPH_ADC); // 使能ADC模块
SysCtlADCSpeedSet(SYSCTL_ADCSPEED_1MSPS); // 设置ADC采样速率
ADCSequDisable(ADC_BASE, 0); // 配置前先禁止采样序列
// 采样序列配置:ADC基址,采样序列编号,触发事件,采样优先级
ADCSequConfig(ADC_BASE, 0, ADC_TRIGGER_PROCESSOR, 0);
// 采样步进设置:ADC基址,采样序列编号,步值,通道设置
ADCSequStepConfig(ADC_BASE, 0, 0, Channel |
ADC_CTL_END |
ADC_CTL_IE);
ADCIntEnable(ADC_BASE, 0); // 使能ADC中断
IntEnable(INT_ADC0); // 使能ADC采样序列中断
IntMasterEnable(); // 使能处理器中断
ADCSequEnable(ADC_BASE, 0); // 使能采样序列
}
// ADC采样
void adcSample(void)
{
unsigned long ulVal;
unsigned long ulValue;
char cBuf[10];
ADCProcessorTrigger(ADC_BASE, 0); // 处理器触发采样序列
while (!ADC_EndFlag); // 等待采样结束
ADC_EndFlag = false; // 清除ADC采样结束标志
ADCSequDataGet(ADC_BASE, 0, &ulValue); // 读取ADC转换结果
ulVal = (ulValue * 3000) / 1024; // 转换成电压值(mv)
sprintf(cBuf, "%ld", ulVal); // 输出格式化
uartPuts(cBuf); // 通过UART显示结果
}
// 在CCP1管脚产生1KHz方波(N=10,K=2),为Timer2的16位输入边沿定时捕获功能提供时钟源
void pulseInit(unsigned char N,unsigned char K)
{
SysCtlPeriEnable(SYSCTL_PERIPH_TIMER0); // 使能TIMER0模块
SysCtlPeriEnable(CCP1_PERIPH); // 使能CCP1所在的GPIO端口
GPIOPinTypeTimer(CCP1_PORT, CCP1_PIN); // 配置相关管脚为Timer功能
TimerConfigure(TIMER0_BASE, TIMER_CFG_16_BIT_PAIR | // 配置TimerB为16位PWM
TIMER_CFG_B_PWM);
TimerLoadSet(TIMER0_BASE, TIMER_B, 60000/N); // 设置TimerB初值
TimerMatchSet(TIMER0_BASE, TIMER_B, (60000/N)/K); // 设置TimerB匹配值
TimerEnable(TIMER0_BASE, TIMER_B);
}
// 定时器16位输入边沿计数捕获功能初始化
void timerInitCapCount(void)
{
SysCtlPeriEnable(SYSCTL_PERIPH_TIMER1); // 使能Timer模块
SysCtlPeriEnable(CCP2_PERIPH); // 使能CCP2所在的GPIO端口
GPIOPinTypeTimer(CCP2_PORT, CCP2_PIN); // 配置CCP2管脚为脉冲输入
TimerConfigure(TIMER1_BASE, TIMER_CFG_16_BIT_PAIR | // 配置Timer为16位事件计数器
TIMER_CFG_A_CAP_COUNT);
TimerControlEvent(TIMER1_BASE, // 控制TimerA捕获CCP负边沿
TIMER_A,
TIMER_EVENT_NEG_EDGE);
TimerLoadSet(TIMER1_BASE, TIMER_A, 40000); // 设置计数器初值
TimerMatchSet(TIMER1_BASE, TIMER_A, 0); // 设置事件计数匹配值
TimerIntEnable(TIMER1_BASE, TIMER_CAPA_MATCH); // 使能TimerA捕获匹配中断
IntEnable(INT_TIMER1A); // 使能Timer中断
IntMasterEnable(); // 使能处理器中断
}
// 定时器16位输入边沿定时捕获功能初始化
void timerInitCapTime(void)
{
SysCtlPeriEnable(SYSCTL_PERIPH_TIMER2); // 使能Timer模块
SysCtlPeriEnable(CCP4_PERIPH); // 使能CCP4所在的GPIO端口
GPIOPinTypeTimer(CCP4_PORT, CCP4_PIN); // 配置CCP4管脚为脉冲输入
TimerConfigure(TIMER2_BASE, TIMER_CFG_16_BIT_PAIR | // 配置Timer为16位事件定时器
TIMER_CFG_A_CAP_TIME);
TimerControlEvent(TIMER2_BASE, // 控制TimerA捕获CCP正边沿
TIMER_A,
TIMER_EVENT_POS_EDGE);
TimerControlStall(TIMER2_BASE, TIMER_A, true); // 允许在调试时暂停定时器计数
TimerIntEnable(TIMER2_BASE, TIMER_CAPA_EVENT); // 使能TimerA事件捕获中断
IntEnable(INT_TIMER2A); // 使能TimerA中断
IntMasterEnable(); // 使能处理器中断
}
// 测量输入脉冲频率并显示
void pulseMeasure(void)
{
unsigned short i;
unsigned short usVal[2];
char s[10];
TimerLoadSet(TIMER2_BASE, TIMER_A, 0xFFFF); // 设置计数器初值
TimerEnable(TIMER2_BASE, TIMER_A); // 使能Timer计数
for (i = 0; i < 2; i++)
{
while (!CAP_Flag); // 等待捕获输入脉冲
CAP_Flag = false; // 清除捕获标志
usVal[i] = TimerValueGet(TIMER2_BASE, TIMER_A); // 读取捕获值
}
TimerDisable(TIMER2_BASE, TIMER_A); // 禁止Timer计数
sprintf(s, "%d", 6000000/(usVal[0] - usVal[1])); // 输出测定的脉冲频率
uartPuts(s);
}
// 主函数(程序入口)
int main(void)
{
jtagWait(); // 防止JTAG失效,重要!
clockInit(); // 时钟初始化:晶振,6MHz
//adcInit();
uartInit(); // UART初始化
timerInitCapTime(); // Timer初始化:16位定时捕获
timerInitCapCount();
IntPrioritySet(INT_UART2, 0xff); // 设置Uart2中断优先级
//IntPrioritySet(INT_TIMER2A, 0xcf); // 设置Timer2A中断优先级
//IntPrioritySet(INT_ADC0, 0xaf); // 设置ADC0中断优先级
pulseInit(10,2);
for (;;)
{
if( function==0x00)
{
pulseMeasure();
SysCtlDelay(1500 * (TheSysClock / 3000));
}
if( function==0x01)
{
adcInit();
adcSample();
SysCtlDelay(1500 * (TheSysClock / 3000));
}
if( function==0x02)
{
pulseInit(Frequence,Per);
}
if( function==0x03)
{
adcInit();
adcSample();
SysCtlDelay(1500 * (TheSysClock / 3000));
}
if( function==0x04)
{
TimerEnable(TIMER1_BASE, TIMER_A); // 使能Timer计数
SysCtlDelay(second* (TheSysClock / 3)); // 延时stick 秒
TimerDisable(TIMER1_BASE, TIMER_A);
Time = 40000*init_time+(39999-TimerValueGet(TIMER1_BASE, TIMER_A)); // 获取当前的Timer计数值
sprintf(cc, "%ld", Time); // 输出格式化
uartPuts(cc); // 通过UART显示结果
TimerLoadSet(TIMER1_BASE, TIMER_A, 40000); // 重新设置计数器初值
init_time=0;
}
if( function==0x0A)
{
}
}
}
// Timer2的中断服务函数
void Timer2A_ISR(void)
{
unsigned long ulStatus;
ulStatus = TimerIntStatus(TIMER2_BASE, true); // 读取当前中断状态
TimerIntClear(TIMER2_BASE, ulStatus); // 清除中断状态,重要!
if (ulStatus & TIMER_CAPA_EVENT) // 若是TimerA事件捕获中断
{
CAP_Flag = true; // 置位捕获标志
}
}
// ADC采样序列0的中断
void ADC_Sequence_0_ISR(void)
{
unsigned long ulStatus;
ulStatus = ADCIntStatus(ADC_BASE, 0, true); // 读取中断状态
ADCIntClear(ADC_BASE, 0); // 清除中断状态,重要
if (ulStatus != 0) // 如果中断状态有效
{
ADC_EndFlag = true; // 置位ADC采样结束标志
}
}
// UART2中断服务函数
void UART2_ISR(void)
{
unsigned long ulStatus;
ulStatus = UARTIntStatus(UART2_BASE, true); // 读取当前中断状态
UARTIntClear(UART2_BASE, ulStatus); // 清除中断状态
if((ulStatus & UART_INT_RT)||(ulStatus & UART_INT_RX)) // 若是接收中断
{
received_data[num] = UARTCharNonBlockingGet(UART2_BASE);
num++;
if(num==3)
{
num=0;
function=received_data[0];
if(function==0x01)
{
switch(received_data[1]) //采用received_data[1]数据配置电压采集通道
{
case 1:
Channel=ADC_CTL_CH0;
break;
case 2:
Channel=ADC_CTL_CH1;
break;
case 3:
Channel=ADC_CTL_CH2;
break;
case 4:
Channel=ADC_CTL_CH3;
break;
case 5:
Channel=ADC_CTL_CH4;
break;
case 6:
Channel=ADC_CTL_CH5;
break;
case 7:
Channel=ADC_CTL_CH6;
break;
}
}
if(function==0x02)
{
Frequence=received_data[1];
Per=received_data[2];
}
if(function==0x03)
{
Channel=ADC_CTL_CH7; //采用通道八作为电流固定采集端
}
if(function==0x04)
{
second=received_data[1]; //采用received_data[1]作为计数间隔时间
}
}
}
}
// Timer2的中断服务函数
void Timer1A_ISR(void)
{
unsigned long ulStatus;
ulStatus = TimerIntStatus(TIMER1_BASE, true); // 读取当前中断状态
TimerIntClear(TIMER1_BASE, ulStatus); // 清除中断状态,重要!
if (ulStatus & TIMER_CAPA_MATCH) // 若是TimerA捕获匹配中断
{
init_time++;
TimerLoadSet(TIMER1_BASE, TIMER_A, 40000); // 重新设置计数器初值
TimerEnable(TIMER1_BASE, TIMER_A); // TimerA已停止,重新使能
}
}