From cfb40c80bf0c417367391c1eba6b89dee4a02f4e Mon Sep 17 00:00:00 2001 From: dufresne <1625800082@qq.com> Date: Wed, 17 Sep 2025 17:19:20 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9D=A1=E4=BB=B6=E7=BC=96=E8=AF=91DMA?= =?UTF-8?q?=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/settings.json | 3 +- applications/main/main.c | 87 +++++++++++++++------ doc/dma ctl参数.xlsx | Bin 0 -> 9963 bytes drivers/drv_adc.c | 161 +++++++++++++++++++++++---------------- drivers/drv_adc.h | 49 +++++++----- rtthread/board.c | 2 +- 6 files changed, 192 insertions(+), 110 deletions(-) create mode 100644 doc/dma ctl参数.xlsx diff --git a/.vscode/settings.json b/.vscode/settings.json index d10e987..a59f74c 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -13,6 +13,7 @@ "rthw.h": "c", "delay_us.h": "c", "core_cm4.h": "c", - "gd32f4xx_usart.h": "c" + "gd32f4xx_usart.h": "c", + "stdlib.h": "c" } } \ No newline at end of file diff --git a/applications/main/main.c b/applications/main/main.c index 4f29e24..c058cf3 100644 --- a/applications/main/main.c +++ b/applications/main/main.c @@ -41,13 +41,15 @@ OF SUCH DAMAGE. #include "tmp75.h" #include "drv_usart.h" - float voltage; float current; float current_origin; float adc_value; -float tmp; char tiedian_id[3]={0}; +uint32_t ctl_data = 0; + + +uint32_t primask; uint16_t tmp_value = 0; @@ -60,10 +62,13 @@ typedef struct _MB85TEST_ { char ttt; float ggg; + float tmperature; + uint8_t status; }MB85TEST; MB85TEST ttest; + #define MB85TEST_ADD 0x0400 /*! @@ -78,17 +83,19 @@ int main(void) // 其他应用程序初始化代码... + __enable_irq(); gd32_usart_init(); adc_init(); temp75_gpio_init(); + //测试mb铁电读写 memset(&ttest, 0, sizeof(ttest)); // mb85rc64_page_write(); mb85rc64_add_read(MB85TEST_ADD, (unsigned char *)&ttest, sizeof(ttest)); - - ttest.ttt += 3; + ttest.status = 0; + ttest.ttt++; if (ttest.ggg >= 1000) { ttest.ggg -= 2; @@ -105,6 +112,21 @@ int main(void) // 进入主循环或启动其他任务 while (1) { + #ifdef DMAX + ctl_data = DMA_CHCTL(DMAX, USER_DMA_ADC_CHANNEL); + if (ctl_data == 33762576) + { + // dma_channel_enable (DMA1, USER_DMA_ADC_CHANNEL); + ttest.status = 5; + } + else if (ctl_data == 33762577) + { + ttest.status = 4; + + } + + + __asm volatile("mrs %0, primask" : "=r"(primask)); if(SET == g_ADCDataReady) { @@ -122,44 +144,61 @@ int main(void) } } } + rt_thread_mdelay(250); + #endif + + voltage = ptz_Voltage_collect_adc1_task(); + rt_thread_mdelay(500); + current = ptz_Current_collect_adc1_task(); rt_thread_mdelay(500); - - // voltage = ptz_Voltage_collect_adc1_task(); - - // rt_thread_mdelay(250); - - // current = ptz_Current_collect_adc1_task(); - - // rt_thread_mdelay(250); - - tmp = ptz_temperature_collect_tmp75_task(); - //测试mb铁电读写 read_mb_id((uint8_t*)&tiedian_id);//读取铁电ID memset(&ttest, 0, sizeof(ttest)); // mb85rc64_page_write(); mb85rc64_add_read(MB85TEST_ADD, (unsigned char *)&ttest, sizeof(ttest)); + ttest.tmperature = ptz_temperature_collect_tmp75_task(); + // usart_puts(ttest.ttt); // 主循环代码... } } +#ifdef DMAX + /* ***************************************************************************** -* 函数名 : DMA_ADCIRQHandlerCallback +* 函数名 : DMA1_Channel0_IRQHandler * 功能说明: DMA_ADC中断服务回调函数 * 形 参 : 无 * 返回值 : 无 ***************************************************************************** */ -void DMA_ADCIRQHandlerCallback(void) +void DMA1_Channel0_IRQHandler(void) { - if(SET == dma_interrupt_flag_get(DMA1,USER_DMA_ADC_CHANNEL,DMA_INTC_FTFIFC)) - { - dma_interrupt_flag_clear(DMA1,USER_DMA_ADC_CHANNEL,DMA_INTC_FTFIFC); - dma_channel_disable(DMA1, USER_DMA_ADC_CHANNEL); - g_ADCDataReady = SET; - } -} \ No newline at end of file + if(dma_interrupt_flag_get(DMA1, USER_DMA_ADC_CHANNEL, DMA_INT_FLAG_FTF)) { + dma_interrupt_flag_clear(DMA1, USER_DMA_ADC_CHANNEL, DMA_INT_FLAG_FTF); + ttest.status = 1; + // 处理传输完成 + } + + if(dma_interrupt_flag_get(DMA1, USER_DMA_ADC_CHANNEL, DMA_INT_FLAG_HTF)) { + dma_interrupt_flag_clear(DMA1, USER_DMA_ADC_CHANNEL, DMA_INT_FLAG_HTF); + ttest.status = 2; + // 处理半传输完成(如果使能了) + } + + if(dma_interrupt_flag_get(DMA1, USER_DMA_ADC_CHANNEL, DMA_INT_FLAG_FEE)) { + dma_interrupt_flag_clear(DMA1, USER_DMA_ADC_CHANNEL, DMA_INT_FLAG_FEE); + ttest.status = 3; + // 处理错误 + } + if(dma_interrupt_flag_get(DMA1, USER_DMA_ADC_CHANNEL, DMA_INT_FLAG_TAE)) { + dma_interrupt_flag_clear(DMA1, USER_DMA_ADC_CHANNEL, DMA_INT_FLAG_TAE); + ttest.status = 6; + // 处理错误 + } +} + +#endif \ No newline at end of file diff --git a/doc/dma ctl参数.xlsx b/doc/dma ctl参数.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..092b137cfdbc5b158cc42efe6a521f911fd05514 GIT binary patch literal 9963 zcmeHt1#?_U(rt^GnVFd-i=`Rke8eKX^k_X~D! zN8E~v?vv5?R^~aCnWZQT296GZ1V94-01|-lS+<2f2mlZd4gjD5ph0y+?d_aR?VJr% zJseD(^cdZ3ZHNoNL8dm^1aN+;&)QdqB{&SEA>Lq9H)VUsI*D~ z-F=Azch5l_e>`50DQb*PgoUaXhn7WHj1Fi7o+NC^0 z%RL+N>T4+6BW1J5+tX-sR+cng`d8Zw(%?~~UMrZc`bCN)nkqEL%B_x%sj^?4sK2ny z8=8QwF^9%?BCbxXL$-hAB9vpttuKqbF4rE2x2Egz*7f%6qK=KaR(x#Z#IP`6(8&=B zAPJmV04Q2VHDXq=+D-cO31Sq!AHDcSy!u43iH6^|j`yK0CocYjJT|E<{YKGXj+g=u z7j2+#$ zLnOCb?3Gcd=)7djZdIYFj~`v2Xek|2BtBMd_My1W-^|~pOUigqyLQIWR(vVVmmOXw zlbF2}t3#e-)WC&7E5Z-O4aWsb*_m$c_B!JM#k7=N36G3tH+70pgszq?Ww5#9uZu0-;g~I)O9$S?AQR zizT>mwNk$IOgtinzjxc*Ea#)VplznMS3!YE2ZD=tpmR(!50mB-@{wOPYwv86d_prZ zhrMN~;H>1{}0t?|&Ejp4}3uY3! zo_Lv!)vSnx8E0_QV>oiS3A4LaeHJC(Io{F;ir7?!RNlIp&8nP*oG-ktXrD&0##;h{G%pKE~ytUh2lT!s-qD-%l{$3k@WCiK~R^K*-O7EY5N=i*mD5DvP-a zojL0D{U~F~RjaHy4nJr!OGhc@_9oaLv?EN{Z0F1yHhJ5OyIk2Y?bGFBG?M!;Xb|tf z5aNF_CHu@LjIG2_W)bljZcS!tld;-he#O7Dl$%;tXQs=GlA0a!0M0n%(+)`Md3AVY zqyAie4!9e`s_wA88^q-K+R!I_t2aUDgdJKLv~T!j(UXFq@X=z-5oa>62sx99a8l14 z9)YYvbpi8JMf>sQ=f|>bn%vSm0}_FC_S{Y<*wgS@p~sWP%a=+gl9z7bB4dGBiTdj8 zGqhuhZh5g##j^F;^w<#mbo!Hi!tHVSdqknbw|e5`jCFVtT&oq(bIQwW_01cZid@Wr zvKJ38j%?WWS|oJHVYaPP^xJDhN&Kqa*vmOJ@1!&%wMx6_ZFr+FUsowgJ@(7XS?c49tHC*q_7mKVk*~+*<;}`@j3DRF;$NV@B?TdktfD%XGy+ zS#)M1JyAPGf*x+9S*9dm^SxfjqixgE{4UD`W*_QtK0fGr$AP#7hIZ3KR~m^5?ulk| z&I@5bel-pTZG2iq7$^yWhI(>zTyYAAnBj!hDv&TlpM%c5cTY`$6INJEDt6sE6UuHi z!R*3n$ zpY)^G=Vm*@gY)aamHxZSY<^TZgMt76R#5-|Y~U~c&E-xOrl!tLOur8-zma-Y;&SW~ zGjixT-322X*L#P2*y?ydCF>?QmW0ASzEN?%pP%u=@!J|NFJyH2s!{P1w?XYS6%$O>Gu7B{- z-et1!#D}g?m?Vg^EZ#R1A3T40XTHWG(rjbR*uJ_MZ6)C@!1(#wm+ttaY^{YPcl5NK2j4I; zzqP+_#t@hHEg9V;&yX*?$S1n%WsjV7K$SDwB-XnnES@IS8pHA%a#w}sGs;yn%o`gf zpP(E~nz}4y$Rh&1y|u#UZuW$PSpkXcBX?+ffG^4nNaE2l+)%T=8A}%&6F#?k?AM_7 z-46O%s-bPq_X5L%@>t6-|75rlL68;BM049;^Bo6q8l!WejWCyiahdbpDiBnrIoYmw zS3&6utSPTFpS#ehAKm)(D_XeAuH#I<*^bU}<2y;_nC6Z8EpDjMIm=vKf1)uryhoy+uDg$dI)6vJgnmgiF zNL|)BS$FT&4@nRisYP*7-7bfXU1J8M2&@?<`PTJVV7Z+bg8H8-)jykHBK>3Pe7R8j3GUS_Z|3scBFePFmP(b1&{jG@eJ9#==nA(~${eJ(QH&3+3<5rq6 zy08x3gboAlFNJWK6XlM^2723!O1VF%&3o}AQ>U%;5 zLR$Fap60*F>Mcmk3KqmAnUSA47}p3+H7;cHOU<40zuvEHZ=;nh6X_1XXQPqOD75K2 zjNTzj7kf)2ivRFp$I)0KOn{|g8*>+FTZ@!B58~~5?zinIAw@+4{~58;tH-2FyIP^X zi=I)}(XW!w-N1vzqV7P4IiKE*mB(c^KXsQmk3HKb3KJ`Q8uXAQ5A(R+(DiZ=R`Yf_ zynk`Ns&&U=Jf&3d*)EOsV}TcON?y;z1ZYe=9giVsw#oOKymp+fw0PNFlF*_+D7{H8 zKmD7DQ`)uBkhCQdodmqhE?q{fwCs>#g*xt4=cBl9uKWuJT!7-{kA=;zw%0g-9C@S9 zIH~m$dDGX+MzIV5^|E1S@^qz(_X)2{nEQFNCt)tKT_C29$IB-8ZW6trAzXRz>kHrR zo@>|3wA{f)F2)(Wedeq~$l&aSPzr|^IolSkS~7V&!P1?Y&x74EPA3NXbLUsr_h&((Xjv>2ENf%=LYHJ~YVjdpx`<@e_e^Mk#xrOwkgT zD6VxjDENB2-t`3jay;4fb{WOA>aI1=^?ciq>i6=bP!?9Ep0?GmvEKRo+Ky%Lwijmq z)xqK%##=j7!QwsnJ5sCzk~ky(0d!73N7`yCmI&r1atH7>f^tdPdVfi}G2Jf$b#nKb zLMb0X&KYwxbrneKROhCzUZ|V>!?GF#u;js3e)uHQ^J!7Sx$PTk4e8s8WI? zN6}~KT*~mp`U*V8911Q1$;C)sqH|HUuvaCMv|af>tMpLh(p{s7`@GMlOrKJri-*nk z!3{D{XAIo18s!X&Q_5xgQ5v?hBJr)Udra6@B+Yc7-M!4=M46|Dg%0l-P%$L_^8-b( z>53HX#dRQatOOfrk?dZ8|7A*+FOjIRQ`<{?l`$R-I=|B)Uw2mOCsAL{aEGjSJhSAq zCW1-k$OYI0PP>6bj$WY$UKe2Uu5C{&6e;Zn+0cZ-fpjXgpkjhruwhK+sCJWs7?~zp zBdq)=I*UzIrEKpWM?)}{pn{pb1I&Z-B#GW(Uwc?Bb`bk81yd%}v6V)B{enlgT zAx}h=wxRCn_-LB)&1gU5ES*%A+~4ks#;aSsRi;+Z*|{KMjxkO;(b>fjz;@;8=1n+# zx3ZrEoJJNRv{@X9$G^t~|HxRx#vRW|T1;Cx0V_t)J-QTv!n7l){UjV%VW5POEyf-4 zlHYw|%=n?&lSFBR!Uiwhtf5M#`hYW2Ve~$Jvi?-Qp=-ySGD#ET)EA61r`~m;Tp6cr zaRiT}i^HYY)u>tf2YBO&i&WCP2I)C`a_!>*jrb{E^Yc*g!JdMu`5L_@Q`o%bOV|!K zGIyPG<}EXxE)QiCjxT(`tP$4c`51PtQ~qEgn!q>yOK`1miCI7uN^%ie3l`I^@wR z^|kfV*aqpK3KAEbS(4@+>n|msXKi24&>5Q!ELAGaMTHCJeTlw)m)?=FGnD30sRh^T z#z!)m@vw-Tt>y~zG5Hd$0!>)9-pQ=fjWebiVKdMrZ6zI|DoS5CwncgT;WeU+6qE(m zji3Kjj=Q#x{8O|pRPotlvTiBW%47__`|2%g`sA=`@{7LJbjpMsNx%8 z7pq8%)=z3Le1frE|DYWIs&~5s*AOO8ZXAxyhU}p7)<(E0b+B$SyTOE|xH;B*~9^SEWN2Z;0*<_6+hme#& z*G_|{7=0gPPDqTdRcy7RrZxjhF3%>Jn(0!ALWvEer_Dhj1@VtlLjwNTy_U#2ySc(? zw^a%xTQ>nes%YXWR=kfCIo7yxMZoiqRl*})hkC#yL8~0l=X&+IOW{L>8o zj@2NIoUm^Vr|n|Bh`bI~{DWQ{xCyzw$v6SNw5?mKdcG{>&Dg{}ZgOMKhY9#!?e3$l z89Psm+k&Kq{>Xm&$Gqv2O9t|HU=ps53IHJdOZuIhJ#0*!eoK~CG)H5XInh_K4g{fB ztgmZ#mO?)hPel6zER_t4g<2ZL7RBzFsXb{+4j40ir8QQeRA)=BLkXt{O;{9&Arh2Wub;MTIDs7663oXwrA}Li+zDgHQMy<4&}&Jn ziSQf-F++~3Cs9PJ;#w#;(`L3WAoo0h(m;MvE=C=-m=G9q9Oitx# zuI}aVFeEl7aJmen=&-40-T?&%pN4I^f}giZYS4dVcAX!q0rXD}tuG_sBzu3+|D`Kq9sn1da-%H>kwRr$n63)2-VF zb04`0xc3-S3Ix|WpRQ6{$lhu2j<936wsY-Y^}>l4 zEb6w$WNyb!QpX#Y`oj*tQ&Zny-%0S=;F;YM{63t@|8^WS_PuapDGnccsa+kx{jzXM zfzseN`*+`Aoe|f@^6A$Juh!^gV!A zlK5?K5Wc&`;7Uy3<|sNOZOxukhW*-=*&*^!7}HH5iMz&7F%g1bHp_)T+?CR%T&i1S@i-fGNb18=9Pfp@^aQrF zxQ2;WDsVRm2d0dUs-OJk`WL3~h-=s5GO?K69Kqxiul3+8wdo;UL5h^zPttFwN7qxX zsG=5A!S7C)LG`q^t)?31@ybD^)$%+q^iMxTunM6a`TWetL$CFRUli9exi5lH1U?IGV4&r-HvW-K51|%|(FU7y!$bD8RDi2YVAmM|%e+ zCKG!{)8F_M*n0b4wG!xK(Fsbjz0Bw#>kx0E!(N%rg({-U0g3!P$XV21Lw4-otY_lI z+F!h8U5{z6dIndV&fF$D$#aQRF?@nt>c2zCpaqgnbzmyn!(BJ)58P2Z=2-TWYl{ZN zZcKG_bPl)XcQjuZTZ4UqW;4_7hd?|FE0aJi1lKS4@YKZ-v;i)?w^cS3Y;*D{s21NV}?V zIEn$kbnjTGE)qKab|;0b6fXL7VZQ6r=B~}8#6yxuPl@!=vxSl^L(Wn{V0pOfaoOER zID79c(VfVFT~@M>EpO~{K9$<ONCV@3&q)&{xMa`PO|t(`C)a*<%ny zCB|jRAv`#vGK=7Wf>?bVrFNEZrp5^c{aSFiK4S?F^47eji&en38hWMLG<8_;d=r8+ z(Q-WVh@YP?|MSb`+rE8|G?A4Lw;jRYUSZZP0y;jYDjEH<#&KRqDM+|6#OKb@-`|H(FWZrfAEA-ATUWX^rm7k=12+NvyR}S;~oV-g0T$z6r^Fcrvfco>#$BO>5 ze*YQ&;gFG{>|YK1^#H_wfWM8Yz##e4afn}mzcz*cfOY^+TKv)?{uTV!#?>EC06-1) zckutGjrFUYU%MH9SPF;#e}Cd{y^UY3{94xg!%9D}O9Fh9UyFRd8u&Fi_`^Uq&hG~P zNELpC{<^LB1KLCIFX*qEj9)GMRZaiE0|4+u0Knh0^;h^`Iq}c%5RyN^|ILt!vJk-4 R1pr`yAAg{HtC9aU`#%~5j|l(( literal 0 HcmV?d00001 diff --git a/drivers/drv_adc.c b/drivers/drv_adc.c index 91997cf..a359a4f 100644 --- a/drivers/drv_adc.c +++ b/drivers/drv_adc.c @@ -15,27 +15,46 @@ /*全局声明区*/ uint16_t USER_ADC_DMA_DATA_BUFF[16] = {0}; +uint32_t ctl = 0; void adc_init(void) { adc_rcu_config(); adc_gpio_config(); + + #ifdef DMAX adc_dma_config(); + #endif + adc_config(); + + #ifdef DMAX + ctl = DMA_CHCTL(DMAX, USER_DMA_ADC_CHANNEL); + if (ctl == 33762576) + { + // dma_channel_enable (DMA1, USER_DMA_ADC_CHANNEL); + // ttest.status = 5; + dma_channel_enable (DMA1, USER_DMA_ADC_CHANNEL);// enable DMA channel + } + else if (ctl == 33762577) + { + // ttest.status = 4; + + } + #endif } /* 时钟+GPIO */ void adc_rcu_config(void) { /* 启用ADC1时钟 */ rcu_periph_clock_enable(RCU_ADC1); - + #ifdef DMAX /* peripheral clock enable */ rcu_periph_clock_enable(RCU_DMA1);//ADC只能用DMA1 - + #endif /* 启用GPIOC时钟 */ rcu_periph_clock_enable(RCU_GPIOC); - adc_clock_config(ADC_ADCCK_PCLK2_DIV4); } @@ -46,79 +65,44 @@ void adc_gpio_config(void) gpio_mode_set(ADC_GPIO_PORT, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, CURRENT_ADC_PIN); } - +#ifdef DMAX /* DMA配置 */ -static void adc_dma_config(void) +void adc_dma_config(void) { /* ADC_DMA_channel configuration */ dma_single_data_parameter_struct dma_single_data_parameter; //这里使用单数据模式,每次只传输一个数据单元,因为总数据量不大,且数据个数不固定 /* ADC DMA_channel configuration */ - dma_deinit(DMA1, USER_DMA_ADC_CHANNEL); + dma_deinit (DMA1, USER_DMA_ADC_CHANNEL); /* initialize DMA single data mode */ - dma_single_data_parameter.periph_addr = (uint32_t)(&ADC_RDATA(ADCX));//配置外设数据源地址,宏决定ADCx - dma_single_data_parameter.periph_inc = DMA_PERIPH_INCREASE_DISABLE;//关闭外设增量,只需要每次对该数据源寄存器访问 - - dma_single_data_parameter.memory0_addr = (uint32_t)USER_ADC_DMA_DATA_BUFF;//先写死,然后外部用的话需要extern - dma_single_data_parameter.memory_inc = DMA_MEMORY_INCREASE_ENABLE;//开启内存增量,以存放不同通道的ADC数据 - - dma_single_data_parameter.periph_memory_width = DMA_PERIPH_WIDTH_16BIT;//ADC数据为16位的寄存器,数据目的地为16位 - - dma_single_data_parameter.circular_mode = DMA_CIRCULAR_MODE_ENABLE;//循环模式,由ADC通知DMA进行 - /* DMA外设到内存模式不开启 */ - dma_single_data_parameter.direction = DMA_PERIPH_TO_MEMORY;//ADC外设到RAM全局变量 - dma_single_data_parameter.number = CHANNEL_LENGTH;//宏决定传输个数 - dma_single_data_parameter.priority = DMA_PRIORITY_ULTRA_HIGH;//优先级设为超高,可改用宏 - dma_single_data_mode_init(DMA1, USER_DMA_ADC_CHANNEL, &dma_single_data_parameter); + dma_single_data_parameter.periph_addr = (uint32_t)(&ADC_RDATA(ADCX)); //配置外设数据源地址,宏决定ADCx + dma_single_data_parameter.periph_inc = DMA_PERIPH_INCREASE_DISABLE; //关闭外设增量,只需要每次对该数据源寄存器访问 + dma_single_data_parameter.memory0_addr = (uint32_t)USER_ADC_DMA_DATA_BUFF; //先写死,然后外部用的话需要extern + dma_single_data_parameter.memory_inc = DMA_MEMORY_INCREASE_ENABLE; //开启内存增量,以存放不同通道的ADC数据 + dma_single_data_parameter.periph_memory_width = DMA_PERIPH_WIDTH_16BIT; //ADC数据为16位的寄存器,数据目的地为16位 + dma_single_data_parameter.circular_mode = DMA_CIRCULAR_MODE_ENABLE; //循环模式,由ADC通知DMA进行 + dma_single_data_parameter.direction = DMA_PERIPH_TO_MEMORY; //ADC外设到RAM全局变量 DMA外设到内存模式开启 + dma_single_data_parameter.number = CHANNEL_LENGTH; //宏决定传输个数 + dma_single_data_parameter.priority = DMA_PRIORITY_ULTRA_HIGH; //优先级设为超高,可改用宏 + dma_single_data_mode_init (DMA1, USER_DMA_ADC_CHANNEL, &dma_single_data_parameter); /* 配置 dma 子连接 */ - dma_channel_subperipheral_select(DMA1, USER_DMA_ADC_CHANNEL, USER_DMA_ADC_SUBPERI); + dma_channel_subperipheral_select (DMA1, USER_DMA_ADC_CHANNEL, USER_DMA_ADC_SUBPERI); /* enable DMA circulation mode */ - dma_circulation_enable(DMA1, USER_DMA_ADC_CHANNEL);// 开启循环模式 - - /* enable DMA channel */ - dma_channel_enable(DMA1, USER_DMA_ADC_CHANNEL); + dma_circulation_enable (DMA1, USER_DMA_ADC_CHANNEL);// 开启循环模式 /* enable DMA it */ - dma_interrupt_enable(DMA1,USER_DMA_ADC_CHANNEL,DMA_INT_FTF);//DMA传输完成标志位 打开全部完成中断 - nvic_irq_enable(DMA_ADC_IRQn, DMA_ADC_PRIORITY_PRE, DMA_ADC_PRIORITY_SUB); + dma_interrupt_enable (DMA1,USER_DMA_ADC_CHANNEL,DMA_INT_FTF);//DMA传输完成标志位 打开全部完成中断 + dma_interrupt_enable (DMA1,USER_DMA_ADC_CHANNEL,DMA_INT_TAE); + dma_interrupt_enable (DMA1,USER_DMA_ADC_CHANNEL,DMA_INT_FEE); + nvic_irq_enable (DMA_ADC_IRQn, DMA_ADC_PRIORITY_PRE, DMA_ADC_PRIORITY_SUB); + + dma_channel_enable (DMA1, USER_DMA_ADC_CHANNEL);// enable DMA channel } -void adc_config(void) -{ - adc_deinit();// 复位ADC配置(可选,但建议初始化时做一次) - - adc_special_function_config(ADCX, ADC_SCAN_MODE, SCAN_STATUS);// 打开扫描模式 - adc_special_function_config(ADCX, ADC_CONTINUOUS_MODE, CONTINUOUS_STATUS);// 禁止连续模式 -> 单次转换模式 - - adc_data_alignment_config(ADCX, ADC_DATAALIGN_RIGHT);// 配置数据对齐方式为右对齐 - adc_resolution_config(ADCX, ADC_RESOLUTION_12B);// 配置ADC分辨率:12位 - - /* 设置转换通道序列 */ - adc_channel_length_config(ADCX, SEQUENCE_CHANNEL, CHANNEL_LENGTH);// 配置规则序列的长度:2个通道 - - adc_routine_channel_config(ADCX, 0, VOLTAGE_ADC_CHANNEL, ADC_SAMPLETIME_480); - adc_routine_channel_config(ADCX, 1, CURRENT_ADC_CHANNEL, ADC_SAMPLETIME_480); - - - /* 使能外部触发:这里使用软件触发,所以先禁用硬件触发 */ - adc_external_trigger_source_config(ADCX, SEQUENCE_CHANNEL, ADC_EXTTRIG_ROUTINE_T0_CH0); - adc_external_trigger_config(ADCX, SEQUENCE_CHANNEL, DISABLE); - - /* ADC dma config */ - adc_dma_request_after_last_enable(ADCX); - adc_dma_mode_enable(ADCX); - - adc_enable(ADCX);// 开启ADC - rt_thread_mdelay(50);// 等待ADC稳定后续接校准 - adc_calibration_enable(ADCX);// 执行ADC自校准 - - adc_software_trigger_enable(ADCX, SEQUENCE_CHANNEL);// 软件触发使能 后续接读取 -} - /** * @brief 根据转换序列的序列号,获取转换序列中的ADC测量值 * @param 配置ADC通道结构体中的成员序号 @@ -130,6 +114,56 @@ uint16_t BSP_ADCDataAcquire(uint8_t _index) return USER_ADC_DMA_DATA_BUFF[_index]; } +/* +***************************************************************************** +* 函数名 : DMA1_Channel0_IRQHandler +* 功能说明: DMA_ADC中断服务回调函数 +* 形 参 : 无 +* 返回值 : 无 +***************************************************************************** +*/ +__weak void DMA1_Channel0_IRQHandler(void) +{ + +} + +#endif + + +void adc_config(void) +{ + adc_deinit();// 复位ADC配置(可选,但建议初始化时做一次) + + adc_special_function_config (ADCX, ADC_SCAN_MODE, SCAN_STATUS);// 扫描模式 + adc_special_function_config (ADCX, ADC_CONTINUOUS_MODE, CONTINUOUS_STATUS);// 连续模式 + + adc_data_alignment_config (ADCX, ADC_DATAALIGN_RIGHT);// 配置数据对齐方式为右对齐 + adc_resolution_config (ADCX, ADC_RESOLUTION_12B);// 配置ADC分辨率:12位 + + /* 设置转换通道序列 */ + adc_channel_length_config (ADCX, SEQUENCE_CHANNEL, CHANNEL_LENGTH);// 配置规则序列的长度:2个通道 + + adc_routine_channel_config (ADCX, 0, VOLTAGE_ADC_CHANNEL, ADC_SAMPLETIME_480); + adc_routine_channel_config (ADCX, 1, CURRENT_ADC_CHANNEL, ADC_SAMPLETIME_480); + + + /* 使能外部触发:这里使用软件触发,所以先禁用硬件触发 */ + // adc_external_trigger_source_config(ADCX, SEQUENCE_CHANNEL, ADC_EXTTRIG_ROUTINE_T0_CH0); + adc_external_trigger_config (ADCX, SEQUENCE_CHANNEL, DISABLE); + + #ifdef DMAX + /* ADC dma config */ + adc_dma_request_after_last_enable (ADCX); + adc_dma_mode_enable (ADCX); + #endif + adc_enable (ADCX); // 开启ADC + rt_thread_mdelay(50); // 等待ADC稳定后续接校准 + adc_calibration_enable (ADCX); // 执行ADC自校准 + + #ifdef DMAX + adc_software_trigger_enable (ADCX, SEQUENCE_CHANNEL); // 软件触发使能 后续接读取 + #endif +} /* ---------------------------------------------------------------------------------------------------------------- */ @@ -170,11 +204,11 @@ float ptz_Voltage_collect_adc1_task() } } } - for(uint8_t i = 1; i < LB_V_TIMES - 1; i++) + for(uint8_t i = LB_V_DEL; i < LB_V_TIMES - LB_V_DEL; i++) { curadc1 = curadc1 + adc1_v[i]; } - curadc1 = curadc1 /((float)(LB_V_TIMES - 2));// 去掉一个最大值和一个最小值求平均值 + curadc1 = curadc1 /((float)(LB_V_TIMES - LB_V_DEL * 2));// 去掉一个最大值和一个最小值求平均值 // g_ptz.Voltage = curadc1; memset(adc1_v, 0, sizeof(adc1_v));// adc1_v 快速清零 curadc1_out_v = curadc1; @@ -220,16 +254,15 @@ float ptz_Current_collect_adc1_task() } } } - for(uint8_t i = 1; i < LB_I_TIMES - 1; i++) + for(uint8_t i = LB_I_DEL; i < LB_I_TIMES - LB_I_DEL; i++) { curadc1 = curadc1 + adc1_i[i]; } - curadc1 = curadc1 /((float)(LB_I_TIMES - 2));//去掉一个最大值和一个最小值求平均值 + curadc1 = curadc1 /((float)(LB_I_TIMES - LB_I_DEL * 2));//去掉一个最大值和一个最小值求平均值 // g_ptz.Voltage = curadc1; memset(adc1_i, 0, sizeof(adc1_i));//adc1_i 快速清零 curadc1_out_i = curadc1; } - return curadc1_out_i; } diff --git a/drivers/drv_adc.h b/drivers/drv_adc.h index 4abcef7..7d69767 100644 --- a/drivers/drv_adc.h +++ b/drivers/drv_adc.h @@ -7,7 +7,7 @@ #include "gd32f4xx.h" #include "gd32f4xx_adc.h" #include "gd32f4xx_dma.h" -#include "rtthread.h" +// #include "rtthread.h" /* 自定义宏,方便修改通道和引脚 */ #define ADCX ADC1 @@ -19,6 +19,8 @@ #define LB_V_TIMES 7 //电压采样滤波次数 #define LB_I_TIMES 12 //电流采样滤波次数 #define LB_T_TIMES 7 //温度采样滤波次数 +#define LB_V_DEL 1 //电压滤波最高最低各删除个数 +#define LB_I_DEL 2 //电流滤波最高最低各删除个数 /* @@ -26,28 +28,33 @@ adc模式配置参数 ENABLE DISABLE */ -#define CONTINUOUS_STATUS ENABLE// 是否开启连续转换 -#define SEQUENCE_CHANNEL ADC_ROUTINE_CHANNEL// 注入组还是规则组 -#define SCAN_STATUS ENABLE// 是否开启扫描模式 -#define DMA_STATUS ENABLE// 是否开启dma -#define CHANNEL_LENGTH 2// 通道数量:1~16 +#define CONTINUOUS_STATUS DISABLE // 是否开启连续转换 +#define SEQUENCE_CHANNEL ADC_ROUTINE_CHANNEL // 注入组还是规则组 +#define SCAN_STATUS DISABLE // 是否开启扫描模式 +#define CHANNEL_LENGTH 1 // 通道数量:1~16 + + /* adc dma */ -#define USER_DMA_ADC_CHANNEL DMA_CH3 //DMA通道:ADC0:DMA_CH0 DMA_CH4 - // ADC1:DMA_CH2 DMA_CH3 - // ADC2:DMA_CH0 DMA_CH3 +// #define DMAX DMA1 -#define USER_DMA_ADC_SUBPERI DMA_SUBPERI1 //DMA外设源:ADC0:DMA_SUBPERI0 - // ADC1:DMA_SUBPERI1 - // ADC2:DMA_SUBPERI2 - -#define DMA_ADC_IRQn DMA1_Channel0_IRQn //DMA1_Channel0_IRQn - //DMA1_Channel1_IRQn - //DMA1_Channel2_IRQn - //DMA1_Channel3_IRQn - //DMA1_Channel4_IRQn -#define DMA_ADC_PRIORITY_PRE 0 //抢占优先级 -#define DMA_ADC_PRIORITY_SUB 1 //子优先级 +#ifdef DMAX +#define DMA_STATUS DISABLE // 是否开启dma +#define USER_DMA_ADC_CHANNEL DMA_CH3 //DMA通道:ADC0:DMA_CH0 DMA_CH4 + // ADC1:DMA_CH2 DMA_CH3 + // ADC2:DMA_CH0 DMA_CH3 +#define USER_DMA_ADC_SUBPERI DMA_SUBPERI1 //DMA外设源:ADC0:DMA_SUBPERI0 + // ADC1:DMA_SUBPERI1 + // ADC2:DMA_SUBPERI2 +#define DMA_ADC_IRQn DMA1_Channel0_IRQn //DMA1_Channel0_IRQn + //DMA1_Channel1_IRQn + //DMA1_Channel2_IRQn + //DMA1_Channel3_IRQn + //DMA1_Channel4_IRQn +#define DMA_ADC_PRIORITY_PRE 0 //抢占优先级 +#define DMA_ADC_PRIORITY_SUB 1 //子优先级 + +#endif void adc_init(void); void adc_rcu_config(void); @@ -57,6 +64,8 @@ void adc_config(void); float ptz_Voltage_collect_adc1_task(); float ptz_Current_collect_adc1_task(); float ptz_temperature_collect_tmp75_task(); +__weak void DMA1_Channel0_IRQHandler(void); + #endif diff --git a/rtthread/board.c b/rtthread/board.c index 4cd1f6d..afc0f85 100644 --- a/rtthread/board.c +++ b/rtthread/board.c @@ -9,7 +9,7 @@ */ #include #include -#include +// #include #include "drv_usart.h" #include