21年电赛仪器仪表类a题要求必须使用TI公司生产的单片机,且不能使用片外AD,当时暑期的时候在电赛官网上有答题签到领板卡的活动,所以我们当时有两块MSP432E401Y型号的开发板在手上,查过资料后发现MSP432E401Y的ad是12位,采样率能到1M,最后定了用这个型号。
整体下来这款型号的单片机能满足题目要求,而且IDE比较好上手,且不用很复杂的插线,板卡上自带调试芯片,只用插上一根线就能在CCS上进入调试,所以最后也是相对比较顺利的做完了比赛。唯一的缺点就是MSP432E401Y这款芯片网上的资料少之又少,所以最开始上手的时候简直是折磨,所以准备寒假期间重新整理一下相关资料和我们比赛的源码,简单写一些关于MSP432E401Y的AD方面的文章。
目录
MSP432E401Y的介绍
MSP432E401Y这款板卡在官方给的参考手册里的描述是“以太网微控制器”,也就是说这款板卡开发出来主要是为了网络相关方面的应用,关于网络的部分本人了解很少,所以这里只挑出来关于AD方面有用的部分。
以下部分来自于中文参考手册,我会附在文章后。
- 120MHz ARM® Cortex® - 具有浮点运算单元 (FPU) 的 M4F 处理器内核
- 2个基于 12 位 SAR 的 ADC 模块,每个模块支 持高达 200 万次/秒的采样率 (2Msps)
- 3 个独立的模拟比较器控制器
- 16 个数字比较器
可以看到,在AD采样方面这款板卡的配置不低,以我目前的水平采样率能设置到1Msps,至于手册上2Msps的采样率我目前是没有完全的研究明白,虽然可以通过两个AD交叉采样实现,但是有传言说通过更改时钟单个AD也可以实现2Msps的采样率,这也是我写学习笔记的这几天里希望能研究明白的东西。
关于MSP432E401Y时钟和AD的初始化
首先是关于时钟的初始化
uint32_t systemClock;
/* 使能系统时钟到120 MHz */
systemClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | SYSCTL_OSC_MAIN |
SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480),
120000000);
这里是关于板卡的系统主频(120MHz)、无源晶振(XTAL)、有源晶振(OSC)、锁相环(PLL)和压控振荡器(VCO)的配置和使能。
然后是关于GPIO的初始化
/* 使能GPIOE的时钟并等待其使能完成 */
MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
while(!(MAP_SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOE)))
{
}
/* 设置PE3作为AD的输入IO */
MAP_GPIOPinTypeADC(GPIO_PORTE_BASE, GPIO_PIN_3);
现在是关于AD的初始化
/* 使能ADC0的时钟并等待其使能完毕 */
MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0);
while(!(MAP_SysCtlPeripheralReady(SYSCTL_PERIPH_ADC0)))
{
}
/* 使能ADC0采样序列2通道3 */
MAP_ADCSequenceStepConfigure(ADC0_BASE, 2, 0, ADC_CTL_CH3 | ADC_CTL_IE |
ADC_CTL_END);
/* 使能ADC0为定时器触发,当定时器触发后进行单次采样 */
MAP_ADCSequenceConfigure(ADC0_BASE, 2, ADC_TRIGGER_TIMER, 2);
/* 在使能之前清除中断状态标志位,这一步是为了确保中断标志位在我们采样时是保持清除状态 */
MAP_ADCIntClearEx(ADC0_BASE, ADC_INT_DMA_SS2);
MAP_ADCIntEnableEx(ADC0_BASE, ADC_INT_DMA_SS2);
/* 使能ADC0采样序列2的DMA请求 */
MAP_ADCSequenceDMAEnable(ADC0_BASE, 2);
/* ADC0采样序列2的配置已经完成,现在进行使能 */
MAP_ADCSequenceEnable(ADC0_BASE, 2);
/* 使能ADC0采样序列2的中断 */
MAP_IntEnable(INT_ADC0SS2);
最后是关于DMA的初始化
/* 使能DMA并为其配置通道 */
MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_UDMA);
while(!(SysCtlPeripheralReady(SYSCTL_PERIPH_UDMA)))
{
}
MAP_uDMAEnable();
/* 指向控制表,用于通道控制结构 */
MAP_uDMAControlBaseSet(pui8ControlTable);
/* 映射ADC0通道2到DMA上 */
MAP_uDMAChannelAssign(UDMA_CH16_ADC0_2);
/* 配置DMA属性为已知状态,默认情况下为失能 */
MAP_uDMAChannelAttributeDisable(UDMA_CH16_ADC0_2,
UDMA_ATTR_ALTSELECT | UDMA_ATTR_USEBURST |
UDMA_ATTR_HIGH_PRIORITY |
UDMA_ATTR_REQMASK);
/* 为ADC0采样序列2的优先级控制结构体设置控制参数,优先级控制结构体是用来从ADC0采样序列2的
FIFO中复制数据到数组srcBuffer,这个传输数据大小为16位,源地址不增加,目的地址16位步进 */
MAP_uDMAChannelControlSet(UDMA_CH16_ADC0_2 | UDMA_PRI_SELECT,
UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 |
UDMA_ARB_4);
/* 为ADC0采样序列2设置优先级控制结构体,模式为BASIC */
MAP_uDMAChannelTransferSet(UDMA_CH16_ADC0_2 | UDMA_PRI_SELECT,
UDMA_MODE_BASIC,
(void *)&ADC0->SSFIFO2, (void *)&srcBuffer,
sizeof(srcBuffer)/2);
/* ADC0采样序列2的uDMA已经准备就绪,当通道使能后,定时器触发ADC采样,ADC完成采样之后发送
一个DMA请求,之后数据传输就会开始 */
MAP_uDMAChannelEnable(UDMA_CH16_ADC0_2);