完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
测试平台为: M453 tiny board
测试代码BSP包为M451SeriesBSP_CMSIS_v3.00.003 测试流程为: 1.配置MODULE4,5,6,7用于转换CHANNEL 0,1,2,3的电压 2.配置MODULE4 为软件启动, MODULE 5,6,7 由MODULE 4 EOC触发 3.PDMA负责搬运ADC中转换结果,由ADC触发 |
|
相关推荐
1个回答
|
|
以下是M453 EADC配置为多通道扫描模式,并通过PDMA将数据存储在指定数组中的示例代码:
首先,我们需要初始化ADC模块并配置所有通道: ```c // Enable ADC clock CLK_EnableModuleClock(ADC_MODULE); // Set ADC clock source and divider CLK_SetModuleClock(ADC_MODULE, ADC_CLK_SRC_PLL, CLK_GetPLLClockFreq() / 4); // Initialize ADC ADC_Open(ADC, ADC_INPUT_MODE_DIFFERENTIAL, ADC_OPERATION_MODE_SINGLE_CYCLE, ADC_SINGLE_ENDSIGNED, ADC_CONTINUOUS_OP_DISABLE, ADC_CONVERSION_SYNC_TRIGGER, ADC_ACCESS_MODE_UNLIMITED); // Configure ADC channels ADC_ConfigAPinChannel(ADC, 4, ADC_CH0, 0); // MODULE4 CHANNEL 0 ADC_ConfigAPinChannel(ADC, 5, ADC_CH1, 0); // MODULE4 CHANNEL 1 ADC_ConfigAPinChannel(ADC, 6, ADC_CH2, 0); // MODULE4 CHANNEL 2 ADC_ConfigAPinChannel(ADC, 7, ADC_CH3, 0); // MODULE4 CHANNEL 3 ``` 接下来,我们需要配置ADC为多通道扫描模式: ```c ADC_SetTriggerSource(ADC, ADC_TRGSRC_SW); // Use software trigger ADC_SET_CONVERSION_MODE(ADC, ADC_SCAN_MODE); // Enable multi-channel scan mode ADC_SET_SCAN_CHANNEL_NUM(ADC, 4); // Scan 4 channels ADC_ConfigScanChannel(ADC, 0, ADC_CH0, ADC_INPUT_MODE_SINGLE_END, 0); // Configure scan channel 0, use single-ended input mode ADC_ConfigScanChannel(ADC, 1, ADC_CH1, ADC_INPUT_MODE_SINGLE_END, 0); // Configure scan channel 1, use single-ended input mode ADC_ConfigScanChannel(ADC, 2, ADC_CH2, ADC_INPUT_MODE_SINGLE_END, 0); // Configure scan channel 2, use single-ended input mode ADC_ConfigScanChannel(ADC, 3, ADC_CH3, ADC_INPUT_MODE_SINGLE_END, 0); // Configure scan channel 3, use single-ended input mode ``` 然后,我们需要配置PDMA以将数据存储在指定数组中: ```c // Enable PDMA clock CLK_EnableModuleClock(PDMA_MODULE); // Configure PDMA PDMA_Open(PDMA0, (1 << ADC_PDMA_CH)); // Enable PDMA channel 0 for ADC PDMA_SetTransferCnt(PDMA0, ADC_PDMA_CH, PDMA_WIDTH_16, ADC_SAMPLE_COUNT); // Transfer ADC_SAMPLE_COUNT words PDMA_SetTransferAddr(PDMA0, ADC_PDMA_CH, (uint32_t)&g_au16AdcData[0], PDMA_SAR_INC, (uint32_t)NULL, PDMA_DAR_FIX); // Transfer data to g_au16AdcData array PDMA_SetTransferMode(PDMA0, ADC_PDMA_CH, PDMA_ADC_RX, FALSE, 0); // Transfer data from ADC PDMA_SetBurstType(PDMA0, ADC_PDMA_CH, PDMA_REQ_SINGLE, PDMA_BURST_1); // Single transfer mode PDMA_EnableInt(PDMA0, ADC_PDMA_CH, PDMA_INT_TRANS_DONE); // Enable PDMA channel 0 transfer done interrupt ``` 最后,我们需要在ADC转换完成时触发PDMA传输: ```c // Enable ADC EOC interrupt to trigger PDMA ADC_EnableInt(ADC, ADC_INTEN_EOC_Msk); // Enable PDMA transfer done interrupt NVIC_EnableIRQ(PDMA0_IRQn); // Start ADC conversion ADC_START_CONV(ADC); ``` 当ADC完成转换时,将触发ADC EOC中断。在中断处理程序中,我们必须清除中断标志并触发PDMA传输: ```c void ADC_IRQHandler(void) { // Clear ADC EOC interrupt flag ADC_CLR_INT_FLAG(ADC, ADC_ISR_ENDIF_Msk); // Trigger PDMA transfer PDMA_Trigger(PDMA0, ADC_PDMA_CH); } ``` 最后,我们需要在PDMA传输完成时处理数据: ```c void PDMA0_IRQHandler(void) { // Check if transfer done if(PDMA_GET_TD_STS(PDMA0) & (1 << ADC_PDMA_CH)) { // Clear transfer done flag PDMA_CLR_TD_FLAG(PDMA0, 1 << ADC_PDMA_CH); // Print ADC data printf("ADC Data: "); for(int i = 0; i < ADC_SAMPLE_COUNT; i++) { printf("%d ", g_au16AdcData[i]); } printf("n"); } } ``` 以上就是在M453微控制器上配置ADC为多通道扫描模式,并通过PDMA传输数据的示例代码。 |
|
|
|
只有小组成员才能发言,加入小组>>
3282 浏览 9 评论
2959 浏览 16 评论
3464 浏览 1 评论
9007 浏览 16 评论
4054 浏览 18 评论
1122浏览 3评论
577浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
572浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2305浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1862浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-27 18:38 , Processed in 1.207822 second(s), Total 79, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号