21ic问答首页 - Work_BenchMark创建工程遇到的问题
Work_BenchMark创建工程遇到的问题
本帖最后由 zhjb1 于 2025-4-20 16:08 编辑
采用Work_BenchMark1.1.0.8————最新版遇到的问题仅仅以ADC为例,本工程需要4路ADC加上测温一共5路,简化操作仅用ADC1.也从工程SysClock开始:

采用外部晶振8MHz,sysClock=240MHz见图。
ADC的设置见下图:

设置了6个,实际只用5个,因为想用DAC1,2,所以ADC4实际指向IN6:IN1,IN2,IN3,IN6,这4个GPIO口作为ADC的4路输入。
DMA设置如下图:

为了防止出错,本设置除了XMC之外仅仅设置了ADC1的DMA,默认为DMA1_CHANNEL5通道。
主要代码如下(为了省事与ADC无关的都顺序集中到一行):
//main function.
int main(void){
//system clock config.
wk_system_clock_config(); wk_periph_clock_config(); wk_debug_config(); wk_nvic_config(); wk_timebase_init();
//init dma1 channel5
wk_dma1_channel5_init();
//config dma channel transfer parameter
//user need to modify define values DMAx_CHANNELy_XXX_BASE_ADDR and DMAx_CHANNELy_BUFFER_SIZE in at32xxx_wk_config.h
//wk_dma_channel_config(DMA1_CHANNEL5,(uint32_t)&ADC1->odt,DMA1_CHANNEL5_MEMORY_BASE_ADDR,DMA1_CHANNEL5_BUFFER_SIZE);
wk_dma_channel_config(DMA1_CHANNEL5,(uint32_t)&ADC1->odt,(uint32_t)adcx,6);
dma_channel_enable(DMA1_CHANNEL5, TRUE);
//init dma1 channel7
wk_dma1_channel7_init();
//config dma channel transfer parameter
//user need to modify define values DMAx_CHANNELy_XXX_BASE_ADDR and DMAx_CHANNELy_BUFFER_SIZE in at32xxx_wk_config.h
wk_dma_channel_config(DMA1_CHANNEL7,DMA1_CHANNEL7_PERIPHERAL_BASE_ADDR,DMA1_CHANNEL7_MEMORY_BASE_ADDR,DMA1_CHANNEL7_BUFFER_SIZE);
dma_channel_enable(DMA1_CHANNEL7, TRUE);
//init wk_xmc_gpio function.
wk_xmc_gpio_init(); wk_xmc_bank1_nor_sram1_init(); wk_usart1_init(); wk_spi2_init(); wk_i2c1_init(); wk_adc1_init(); wk_rtc_init(); wk_exint_config(); wk_tmr1_init(); wk_tmr2_init(); wk_tmr3_init(); wk_tmr4_init(); wk_acc_init(); wk_usbfs_init(); wk_dac_init(); wk_gpio_config();
printf("Test AT32F407VGT7 programes ...\n\r");
adc_enable(ADC1,TRUE);
adc_calibration_start(ADC1);
while(1){
printf("ADC1:4%d ADC2=%d ADC3=%d ADC4=%d ADC5=%d \r\n",adcx[0],adcx[1],adcx[2],adcx[3],adcx[4]);
}
}
上边两行加粗的如果没有,测出来所有的数值均为40?不知道为何。有了就正常监测到了,尽管数值有相当大的误差,但已经有了。但也是系统数值,不同的是后几位的变化。下图是串口截取的数据:

从数据上看ADC1-3大概其是数据,ADC4-5为0。
没有重新改工程为只有ADC1-3进行测试。
以上是参考了老师:ArterySW的几篇文章进行的设置。在设置过程中有些地方做过更改,最后最好的结果就是以上几张图片。
不清楚是哪里有问题?还是Work_BenchMark只能设置3个ADC————因为参考文章最多也只有3路ADC。
百忙之中不吝赐教万分感谢。
需要分或什么的尽管说,圣人敛财取之有道,我学您教受之无愧!
采用Work_BenchMark1.1.0.8————最新版遇到的问题仅仅以ADC为例,本工程需要4路ADC加上测温一共5路,简化操作仅用ADC1.也从工程SysClock开始:

采用外部晶振8MHz,sysClock=240MHz见图。
ADC的设置见下图:

设置了6个,实际只用5个,因为想用DAC1,2,所以ADC4实际指向IN6:IN1,IN2,IN3,IN6,这4个GPIO口作为ADC的4路输入。
DMA设置如下图:

为了防止出错,本设置除了XMC之外仅仅设置了ADC1的DMA,默认为DMA1_CHANNEL5通道。
主要代码如下(为了省事与ADC无关的都顺序集中到一行):
//main function.
int main(void){
//system clock config.
wk_system_clock_config(); wk_periph_clock_config(); wk_debug_config(); wk_nvic_config(); wk_timebase_init();
//init dma1 channel5
wk_dma1_channel5_init();
//config dma channel transfer parameter
//user need to modify define values DMAx_CHANNELy_XXX_BASE_ADDR and DMAx_CHANNELy_BUFFER_SIZE in at32xxx_wk_config.h
//wk_dma_channel_config(DMA1_CHANNEL5,(uint32_t)&ADC1->odt,DMA1_CHANNEL5_MEMORY_BASE_ADDR,DMA1_CHANNEL5_BUFFER_SIZE);
wk_dma_channel_config(DMA1_CHANNEL5,(uint32_t)&ADC1->odt,(uint32_t)adcx,6);
dma_channel_enable(DMA1_CHANNEL5, TRUE);
//init dma1 channel7
wk_dma1_channel7_init();
//config dma channel transfer parameter
//user need to modify define values DMAx_CHANNELy_XXX_BASE_ADDR and DMAx_CHANNELy_BUFFER_SIZE in at32xxx_wk_config.h
wk_dma_channel_config(DMA1_CHANNEL7,DMA1_CHANNEL7_PERIPHERAL_BASE_ADDR,DMA1_CHANNEL7_MEMORY_BASE_ADDR,DMA1_CHANNEL7_BUFFER_SIZE);
dma_channel_enable(DMA1_CHANNEL7, TRUE);
//init wk_xmc_gpio function.
wk_xmc_gpio_init(); wk_xmc_bank1_nor_sram1_init(); wk_usart1_init(); wk_spi2_init(); wk_i2c1_init(); wk_adc1_init(); wk_rtc_init(); wk_exint_config(); wk_tmr1_init(); wk_tmr2_init(); wk_tmr3_init(); wk_tmr4_init(); wk_acc_init(); wk_usbfs_init(); wk_dac_init(); wk_gpio_config();
printf("Test AT32F407VGT7 programes ...\n\r");
adc_enable(ADC1,TRUE);
adc_calibration_start(ADC1);
while(1){
printf("ADC1:4%d ADC2=%d ADC3=%d ADC4=%d ADC5=%d \r\n",adcx[0],adcx[1],adcx[2],adcx[3],adcx[4]);
}
}
上边两行加粗的如果没有,测出来所有的数值均为40?不知道为何。有了就正常监测到了,尽管数值有相当大的误差,但已经有了。但也是系统数值,不同的是后几位的变化。下图是串口截取的数据:

从数据上看ADC1-3大概其是数据,ADC4-5为0。
没有重新改工程为只有ADC1-3进行测试。
以上是参考了老师:ArterySW的几篇文章进行的设置。在设置过程中有些地方做过更改,最后最好的结果就是以上几张图片。
不清楚是哪里有问题?还是Work_BenchMark只能设置3个ADC————因为参考文章最多也只有3路ADC。
百忙之中不吝赐教万分感谢。
需要分或什么的尽管说,圣人敛财取之有道,我学您教受之无愧!




赞0
再次感谢
评论
2025-04-23
赞0
首先
严格按照下面这个帖子,配置一下,不要加入自己的东西,先把ADC和DMA正常跑起来,保证运行效果和帖子展示的效果一致
AT32 WorkBench常用功能34--AT32F403A ADC普通组转换多通道配置(序列模式,用DMA)
https://bbs.21ic.com/icview-3446700-1-1.html
第二
ADC和DMA正常跑起来后,在你这个模式只用DMA中断就行,不需要ADC中断,如果你需要DMA中断,需要调用这个函数dma_interrupt_enable(DMA1_CHANNEL1,DMA_FDT_INT,TRUE)开启
然后你需要自己建一个中断函数void DMA1_Channel1_IRQHandler(void)
{
if(dma_interrupt_flag_get(DMA1_FDT1_FLAG) != RESET)
{
dma_flag_clear(DMA1_FDT1_FLAG);
}
}
第三
建议网上学习一下32单片机使用的基础,比如中断如何使用,如何配置中断函数,如何设置中断优先级等,先学习一下基础,会对后面的开发事半功倍
评论
2025-04-22
赞0
1. 在at32f403a_407_wk_config.c这个函数中的ADC初始化语句中有一条注释:
/**
* Users need to configure ADC1 interrupt functions according to the actual application.
* 1. Call the below function to enable the corresponding ADC1 interrupt.
* --adc_interrupt_enable(...)
* 2. Add the user's interrupt handler code into the below function in the at32f403a_407_int.c file.
* --void ADC1_2_IRQHandler(void)
*/需要配置两条函数
adc_interrupt_enable(...)
void ADC1_2_IRQHandler(void)
遍历工程找不到此函数,而在STM生成的工程中可以搜到对应的函数。
2.还是此函数的DMA配置中也有:
/**
* Users need to configure DMA1 interrupt functions according to the actual application.
* 1. Call the below function to enable the corresponding DMA1 interrupt.
* --dma_interrupt_enable(...)
* 2. Add the user's interrupt handler code into the below function in the at32f403a_407_int.c file.
* --void DMA1_Channel5_IRQHandler(void)
*/
针对DMA的中断允许和中断向量声明。
前者在main中已有了,后者没有。
我想是否缺少这两个 声明!
但网上的案例也没有这2个声明。
能否解惑答疑一下呢?
谢谢
评论
2025-04-22
赞0
AT32 WorkBench常用功能34--AT32F403A ADC普通组转换多通道配置(序列模式,用DMA)
https://bbs.21ic.com/icview-3446700-1-1.html
评论
2025-04-21
您需要登录后才可以回复 登录 | 注册