工具/软件:Code Composer Studio
我正在处理一个项目、在该项目中、我尝试使用 ADC 模块0采样序列发生器3从外部温度传感器(TMP36)读取数据。
我将传感器连接到 AIN13的 PD2
第一个采样由处理器触发、然后我将其设置为在中断处理程序中持续采样。
我多次浏览数据表、不确定我的代码中出现了什么错误。 在我的代码中、我似乎从未进入中断处理程序、因此从传感器中获取数据、但我不确定如何修复。 我使用了一个测试值来查看我是否曾经进入过中断处理程序并且该值从未更新。
此时、我甚至不确定问题可能出在哪里、我已经在调试了一周多、也不确定接下来要做什么。
//此文件假设温度传感器
//使用模拟通道13进行 AD 转换
//反映测量温度的电压
//可以通过读取寄存器 ADC0_SSFIFO3_R 来计算//
其中只有最低的12位可访问
//因为 AN#13与 GPIO 引脚复用 D2
//因此需要相关的 GPIO 端口 D 配置
#include
#include
#include
//为 GPIO 模块
#define SYSCTL_RCGCGPIO_R 提供时钟 (*(volatile unsigned long *) 0x400FE608)
//为 ADC 模块
#define SYSCTL_RCGCADC_R 提供时钟 (*(volatile unsigned long *) 0x400FE638)
// ADC0和 SS3
#define ADC0_ACTS_R (*(volatile unsigned long *) 0x40038000)//启用 SS3
#define ADC0_IM_R (*(volatile unsigned long *) 0x40038008)//中断屏蔽
#define ADC0_ISC_R (*(volatile unsigned long *) 0x4003800C)//中断清除
#define ADC0_EMUX_R (*(volatile unsigned long *) 0x40038014)
#define ADC0_PSSI_R (*(volatile unsigned long *) 0x40038028)
#define ADC0_SAC_R (*(volatile unsigned long *) 0x40038030)//过采样
#define ADC0_SSEMUX3_R (*(volatile unsigned long *) 0x400380B8)
)#define ADC0_SSMUX3_R (*(volatile unsigned long *) 0x400380A0)
#define ADC0_SSCTL3_R (*(volatile unsigned long *) 0x400380A4)
#define ADC0_SSFIFO3_R (*(volatile unsigned long *) 0x400380A8)
#define ADC0_PC_R (*(volatile unsigned long *) 0x40038FC4))
// GPIO 端口 D
#define GPIO_PORTD_AHB_DIR_R (*(volatile unsigned long *) 0x4005B400)#define
GPIO_PORTD_AHBLD_UNsigned LD_R (*(volatile NV5B1C)#define GPIO_#define GPIO_TR_AM420*
(0x400ORTD_AM420*
)#define GPIO_UNATTR_ANTRL (#define GPIO_UNATTR_ANTR_AM5ORTD_AM420*)#define GPIO_UNDP_ANTRL (#FR_ANTRL)*(0x400FALOORTD_AM420_ANTRUART_AFORTD_TRL)*(#FR_ANTR_TR_TR_TRUART_ANTRUART_ANTRUART_ANTRUART_TR
(*((volatile unsigned long *) 0xE000E100))
uint32_t TempData;
//uint32_t Test = 2;
//此函数生成延迟
空延迟(volatile unsigned int delay){
volatile unsigned int i、j;
对于(i = 0;i < delay;i++){
//在16MHz 时引入大约10us 的延迟
对于(j = 0;j < 12;j ++);
}
}//
序列发生器3
的 ADC0中断服务例程 void ADC0SS3_Handler (void){
//测试++;
ADC0_EMUX_R |= 0xF000;
ADC0_ISC_R |= 0x08;
TempData = ADC0_SSFIFO3_R;//& 0x0FFF;
}
// main 函数
int main (void){
易失性浮点温度;
// 1. 启用 ADC0的时钟
SYSCTL_RCGCADC_R |= 0x01;
// 2. 启用端口 D 的时钟
SYSCTL_RCGCGPIO_R |= 0x08;
//端口 D PIN2的配置
GPIO_PORTD_AHB_AFSEL_R |= 0x04;//作为模拟函数使 AIN13工作
GPIO_PORTD_AHB_DEN_R &= 0x00;//禁用数字使能模拟
GPIO_PORTD_AHB_AMSEL_R |= 0x04;//启用模拟
GPIO_PORTD_AHB_DIR_R &= 0x00;// 0表示输入
//启动序列发生器3
ADC0_PSSI_R |= 0x08;
//并通过调用延迟函数引入延迟
延迟(3);
//选择 AIN13 (PD2)作为模拟输入
//第1个采样是序列结束和中断源
ADC0_PC_R |= 0x03; //季度转换率;48*Tadc 周期暂停
ADC0_SAC_R |= 0x04; // 16x 过采样,然后取平均值
//取消屏蔽 ADC0序列3中断
ADC0_IM_R |= 0xF7; //步骤6.
//清除 ADC0序列发生器3的中断
ADC0_ISC_R |= 0x08;
//为序列发生器3启用 ADC0模块
ADC0_ACTSS_R &= 0x00;//步骤1禁用采样序列发生器3
ADC0_EMUX_R &= 0x0000;
ADC0_SSEMUX3_R = 0x0;
ADC0_SSMUX3_R |= 0x0D;//步骤4选择 AIN13
ADC0_SSCTL3_R |= 0x06;//步骤5
ADC0_IM_R |= 0x08; //步骤6.
ADC0_ACTSS_R |= 0x08;//步骤7启用采样序列发生器3
ADC0_ISC_R |= 0x08;
//在 NVIC 中断号中启用 ADC0序列发生器3中断为17
NVIC_EN0_R |= 0x020000;
//等待 ADC 模块执行转换的特定时间
延迟(100);
while (1){
}
}