📄 -Ԧ+--+
字号:
#include "systemInit.h"
#include "uartGetPut.h"
#include <adc.h>
#include <stdio.h>
#define ADCSequEnable ADCSequenceEnable
#define ADCSequDisable ADCSequenceDisable
#define ADCSequConfig ADCSequenceConfigure
#define ADCSequStepConfig ADCSequenceStepConfigure
#define ADCSequDataGet ADCSequenceDataGet
// 定义KEY
#define KEY_PERIPH SYSCTL_PERIPH_GPIOD
#define KEY_PORT GPIO_PORTD_BASE
#define KEY_PIN GPIO_PIN_1
tBoolean ADC_EndFlag = false; // 定义ADC转换结束的标志
// ADC外部事件触发初始化(硬件电路上要短接PB4与PB5)
void adcExtTrigInit(void)
{
SysCtlPeriEnable(KEY_PERIPH); // 使能KEY所在的GPIO端口
GPIOPinTypeIn(KEY_PORT, KEY_PIN); // 设置KEY所在管脚为输入
SysCtlPeriEnable(SYSCTL_PERIPH_GPIOB); // 使能GPIOB端口
GPIOPinTypeOut(GPIO_PORTB_BASE, GPIO_PIN_5); // 设置PB5管脚为输出
GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_5, 0x00); // PB5 = 0
GPIOPinTypeIn(GPIO_PORTB_BASE, GPIO_PIN_4); // 设置PB4管脚为输入
GPIOIntTypeSet(GPIO_PORTB_BASE, // 设置PB4的中断类型
GPIO_PIN_4,
GPIO_FALLING_EDGE);
GPIOPinIntEnable(GPIO_PORTB_BASE, GPIO_PIN_4); // 使能PB4管脚中断
IntEnable(INT_GPIOB); // 使能GPIOB端口中断
}
// 等待按键
void keyWait(void)
{
while (GPIOPinRead(KEY_PORT, KEY_PIN)); // 等待KEY按下
SysCtlDelay(10 * (TheSysClock / 3000)); // 延时,以消除按键抖动
while (!GPIOPinRead(KEY_PORT, KEY_PIN)); // 等待KEY抬起
SysCtlDelay(10 * (TheSysClock / 3000)); // 延时,以消除松键抖动
}
// 产生一个短脉冲(PB5管脚)
void pulseGen(void)
{
GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_5, 0xFF);
SysCtlDelay(1 * (TheSysClock / 3000));
GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_5, 0x00);
}
// ADC初始化
void adcInit(void)
{
SysCtlPeriEnable(SYSCTL_PERIPH_ADC); // 使能ADC模块
SysCtlADCSpeedSet(SYSCTL_ADCSPEED_125KSPS); // 设置ADC采样率
ADCSequDisable(ADC_BASE, 0); // 配置前先禁止采样序列
// 采样序列配置:ADC基址,采样序列编号,触发事件,采样优先级
ADCSequConfig(ADC_BASE, 0, ADC_TRIGGER_EXTERNAL, 0);
// 采样步进设置:ADC基址,采样序列编号,步值,通道设置
ADCSequStepConfig(ADC_BASE, 0, 0, ADC_CTL_CH0 |
ADC_CTL_END |
ADC_CTL_IE);
ADCIntEnable(ADC_BASE, 0); // 使能ADC中断
IntEnable(INT_ADC0); // 使能ADC采样序列中断
ADCSequEnable(ADC_BASE, 0); // 使能采样序列
}
// ADC采样
unsigned long adcSample(void)
{
unsigned long ulValue;
while (!ADC_EndFlag); // 等待采样结束
ADC_EndFlag = false; // 清除ADC采样结束标志
ADCSequDataGet(ADC_BASE, 0, &ulValue); // 读取ADC转换结果
return(ulValue);
}
// 主函数(程序入口)
int main(void)
{
unsigned long ulValue;
char cBuf[30];
jtagWait(); // 防止JTAG失效,重要!
clockInit(); // 时钟初始化:PLL,20MHz
uartInit(); // UART初始化
adcExtTrigInit(); // ADC外部事件触发初始化
adcInit(); // ADC初始化
IntMasterEnable(); // 使能处理器中断
for (;;)
{
keyWait(); // 等待按键
pulseGen(); // 产生PB5到PB4的触发脉冲
ulValue = adcSample(); // ADC采样
ulValue = (ulValue * 3000) / 1024; // 转换成电压值
sprintf(cBuf, "ADC0 = %ld(mV)\r\n", ulValue); // 采样值格式化为电压值
uartPuts(cBuf); // 通过UART输出电压值
}
}
// GPIOB的中断服务函数
void GPIO_Port_B_ISR(void)
{
unsigned long ulStatus;
ulStatus = GPIOPinIntStatus(GPIO_PORTB_BASE, true); // 读取中断状态
GPIOPinIntClear(GPIO_PORTB_BASE, ulStatus); // 清除中断状态,重要
if (ulStatus & GPIO_PIN_4) // 如果PB4的中断状态有效
{
}
}
// 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采样结束标志
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -