From 103d9b2600358ebc1e090ccacde40ae23156cc9c Mon Sep 17 00:00:00 2001 From: eddyem Date: Thu, 24 Jul 2014 12:22:26 +0400 Subject: [PATCH] Added one channel ADC through DMA --- with_opencm3/cdcacm.c | 16 +++++------ with_opencm3/hardware_ini.c | 52 ++++++++++++++++++++++++++++++++++ with_opencm3/hardware_ini.h | 4 +++ with_opencm3/ircontroller.bin | Bin 7452 -> 8652 bytes with_opencm3/main.c | 10 +++++-- with_opencm3/main.h | 2 ++ with_opencm3/user_proto.c | 7 +++++ 7 files changed, 80 insertions(+), 11 deletions(-) diff --git a/with_opencm3/cdcacm.c b/with_opencm3/cdcacm.c index c2c32fa..5cccba1 100644 --- a/with_opencm3/cdcacm.c +++ b/with_opencm3/cdcacm.c @@ -195,9 +195,9 @@ static int cdcacm_control_request(usbd_device *usbd_dev, struct usb_setup_data * switch (req->bRequest) { case SET_CONTROL_LINE_STATE:{ -//P("SET_CONTROL_LINE_STATE\r\n", uart1_send); -//print_int(req->wValue, uart1_send); -//newline(uart1_send); +P("SET_CONTROL_LINE_STATE\r\n", uart1_send); +print_int(req->wValue, uart1_send); +newline(uart1_send); if(req->wValue){ // terminal is opened USB_connected = 1; //P("\r\n\tUSB connected!\r\n", uart1_send); @@ -222,11 +222,11 @@ static int cdcacm_control_request(usbd_device *usbd_dev, struct usb_setup_data * usbd_ep_write_packet(usbd_dev, 0x83, local_buf, 10); }break; case SET_LINE_CODING: -//P("SET_LINE_CODING, len=", uart1_send); +P("SET_LINE_CODING, len=", uart1_send); if (!len || (*len != sizeof(struct usb_cdc_line_coding))) return 0; -//print_int(*len, uart1_send); -//newline(uart1_send); +print_int(*len, uart1_send); +newline(uart1_send); memcpy((void *)&lc, (void *)*buf, *len); // Mark & Space parity don't support by hardware, check it if(lc.bParityType == USB_CDC_MARK_PARITY || lc.bParityType == USB_CDC_SPACE_PARITY){ @@ -240,10 +240,10 @@ static int cdcacm_control_request(usbd_device *usbd_dev, struct usb_setup_data * if(len && *len == sizeof(struct usb_cdc_line_coding)) memcpy((void *)*buf, (void *)&linecoding, sizeof(struct usb_cdc_line_coding)); //usbd_ep_write_packet(usbd_dev, 0x83, (char*)&linecoding, sizeof(linecoding)); -//P("GET_LINE_CODING\r\n", uart1_send); +P("GET_LINE_CODING\r\n", uart1_send); break; default: -//P("UNKNOWN\r\n", uart1_send); +P("UNKNOWN\r\n", uart1_send); return 0; } return 1; diff --git a/with_opencm3/hardware_ini.c b/with_opencm3/hardware_ini.c index f3d03e8..d36d520 100644 --- a/with_opencm3/hardware_ini.c +++ b/with_opencm3/hardware_ini.c @@ -22,6 +22,8 @@ #include "main.h" #include "hardware_ini.h" +volatile uint16_t ADC_value; // ADC DMA value + /** * GPIO initialisaion: clocking + ports setup */ @@ -38,4 +40,54 @@ void SysTick_init(){ systick_counter_enable(); } +void ADC_init(){ + rcc_peripheral_enable_clock(&RCC_APB2ENR, RCC_APB2ENR_ADC1EN); // enable clocking + rcc_periph_clock_enable(RCC_ADC1); + rcc_set_adcpre(RCC_CFGR_ADCPRE_PCLK2_DIV4); + rcc_periph_clock_enable(RCC_GPIOB); // clocking for ADC port + gpio_set_mode(GPIOB, GPIO_MODE_INPUT, GPIO_CNF_INPUT_ANALOG, GPIO0); // ADC8 - PB0 + // Make sure the ADC doesn't run during config + adc_off(ADC1); + + // first configure DMA1 Channel1 (ADC1) + rcc_periph_clock_enable(RCC_DMA1); // RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); + dma_channel_reset(DMA1, DMA_CHANNEL1); //DMA_DeInit(DMA1_Channel1); + dma_set_peripheral_address(DMA1, DMA_CHANNEL1, (uint32_t) &(ADC_DR(ADC1))); // DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; + dma_set_memory_address(DMA1, DMA_CHANNEL1, (uint32_t)&ADC_value); // DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADC_value; + dma_set_number_of_data(DMA1, DMA_CHANNEL1, 1); // DMA_InitStructure.DMA_BufferSize = 1; + dma_set_read_from_peripheral(DMA1, DMA_CHANNEL1); // DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; + dma_disable_memory_increment_mode(DMA1, DMA_CHANNEL1); // DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable; + dma_disable_peripheral_increment_mode(DMA1, DMA_CHANNEL1); // DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; + dma_set_peripheral_size(DMA1, DMA_CHANNEL1, DMA_CCR_PSIZE_16BIT); // DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; + dma_set_memory_size(DMA1, DMA_CHANNEL1, DMA_CCR_MSIZE_16BIT); // DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; + dma_enable_circular_mode(DMA1, DMA_CHANNEL1); // DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; + dma_set_priority(DMA1, DMA_CHANNEL1, DMA_CCR_PL_HIGH); // DMA_InitStructure.DMA_Priority = DMA_Priority_High; + dma_enable_channel(DMA1, DMA_CHANNEL1); // DMA_Cmd(DMA1_Channel1, ENABLE); + + // Configure ADC as continuous scan mode with DMA + adc_set_dual_mode(ADC_CR1_DUALMOD_IND); // ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; + adc_enable_scan_mode(ADC1); // ADC_InitStructure.ADC_ScanConvMode = ENABLE; + adc_set_continuous_conversion_mode(ADC1); // ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; + adc_disable_external_trigger_regular(ADC1); // ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; + adc_set_right_aligned(ADC1); // ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; + //adc_set_sample_time_on_all_channels(ADC1, ADC_SMPR_SMP_239DOT5CYC); // ADC_SampleTime_239Cycles5 + adc_set_sample_time(ADC1, ADC_CHANNEL8, ADC_SMPR_SMP_239DOT5CYC); // ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 1, ADC_SampleTime_239Cycles5); + adc_enable_dma(ADC1); // ADC_DMACmd(ADC1, ENABLE); + adc_power_on(ADC1); // ADC_Cmd(ADC1, ENABLE); +} + +/** + * Starts ADC calibration & after it runs ADC in continuous conversion mode + * First call ADC_init(), than wait a little and call this function + */ +void ADC_calibrate_and_start(){ + uint8_t channel_array[16]; + // adc_set_regular_sequence 1 channel -- 0 // ADC_InitStructure.ADC_NbrOfChannel = 1; + channel_array[0] = ADC_CHANNEL8; + adc_set_regular_sequence(ADC1, 1, channel_array); + adc_reset_calibration(ADC1); + adc_calibration(ADC1); + adc_start_conversion_regular(ADC1); // ADC_SoftwareStartConvCmd(ADC1, ENABLE); + adc_start_conversion_direct(ADC1); +} diff --git a/with_opencm3/hardware_ini.h b/with_opencm3/hardware_ini.h index 3578585..d1ecc09 100644 --- a/with_opencm3/hardware_ini.h +++ b/with_opencm3/hardware_ini.h @@ -23,7 +23,11 @@ #ifndef __HARDWARE_INI_H__ #define __HARDWARE_INI_H__ +extern volatile uint16_t ADC_value; // ADC DMA value + void GPIO_init(); void SysTick_init(); +void ADC_init(); +void ADC_calibrate_and_start(); #endif // __HARDWARE_INI_H__ diff --git a/with_opencm3/ircontroller.bin b/with_opencm3/ircontroller.bin index ae457dce1f31c6c2ab69306c1fc8d8b1a3ec55ae..4975fe64d525a82270a1a5cc78cb08d862a3c387 100755 GIT binary patch delta 2979 zcmb7Fe{2)?6@TCJ**-f-W8x4TCxo*dXo3w*14#*##qp7g6T2}#(k?&|2?)5gtV{UO zrKpolqgJ7867*JyA()25A8p2}geVi)aMNx>s?@HEH>MIgHK%n`X*6jU8nE%N+q<)& z9c*K>^}g?YKkvu)z3-2AXV!kig<&JGMT>zcKr-D&aNke0QAveW{x|c3KKI9X$UOYO zq7QNSpX`5N0_GUfn@ImX-o}R+{J(m!lQ^kCRy;tm;SZJov*OD{s57vTw+}@4V!o2M zPbl%jih&0SmbnIWZez?JsO4>f5+7DJ1SqGyuQgC1fcyJXEgcI6NbSKG?O4#)+)>M0 zgi~$%C0oMa1<&587Ejrf`C5@@=M;6#?AadMF1bDHrdD{KiG53I_qY-Dg*_W%4r!OC zeCn_#5L+wN@{jqI_)=ve0Z_|FE-LYUrIvRiR-s(iFeNT1HM|mEqO6vd`9t%OO(3t& zu9RGPxhY#CIRbr^6BXVKr0K&1)G6^|rO~!nDht>LsO7d8anh1ilS^XFG*)Ag%KWt$ zayGj#P%%(3u~3_Ro-Nh*Octc(YL*$Pa79&C~ zj?o)ya4&BC3MOq9$_uz-P>2MSSKU2z7nh6|1Q{1SOeHMqiQ_pf>6UOxT`rzf$E-FU z(va!olBgQQI&KMI?IPv$x@fc+%@hUDR(!>wA|St=0T+lYKj_doEjT}yF`(Yz2s^2f z-0?j3?iB+tM~%SzLJy2QUdaarULA3`jeHSb#xL!ja=NK0*1b2jLTdCs(XPbb%Lqda z$REkB!mE2F^ZZb~xSnnZufavguo)LQlxdKheim)s$j}oF5<6t9sgG6S{LdLX`iL3w z*5iV6h{#t{XA`D6-8$lSPA_UFr=kglJ)1DsF+HzGj`v&fu#YE-rLIxekP%<1Rd}Rh zfl%Iaa_A?KH(om3U+6bt%$^KkY013FPvc}89*llOj>6=3@pATJgH$i;YbX=su!eZg zp!^OJjGr7)w^`jKXNK^$QGusAl=z341tWm|y+$!f+jmT+%|W(@9W}LsoK{#t`GOv? zpn5rmd)Wbu1w+*#VN+)Rjap>_X&ZNQR>QjA(^R^en zetm^rom~)5>KAQWlz#gq^`IY3yOEQ1pI#*H)04#=^$Dv5)C-<|{u{XY9$uA3FVrtX zUg*f(H2YXv z4jY`*Z&TvOhLzNnw3sz?P)Ac@hq2zQZf85v(`NBC zP>>QEna=Rc9VI@Iwqe_XUXV{E)mB!Dr}<{G6wiMotHhUQ_1KlJq?P!18m(x|_Q`at zAn$QBsl=Ny=1w)FF11Ris2IC-BpjdCX^oJ+b>tAp2a^BzLhUT-pvsAz? zkZ`@dhl#4-pzx_tcXd$UWTG4F>1!Jlt{ZiK`g*RKTR0nPV3Nl7G$^>{Bi5WH%rO)v zGw5d(%8lu(s&@{fHLP31OtskhWSy?y+E&i!(k01PR5DEF=U8BC>9s^vMO9Ny zMQ;91P&M2vMc(hRL~+4^YY4oa7gh}cX z!C9t|tp4jovP$3ZL*FOUq$xN{Hod>gxSQV{y&(_gYo3p2HE*YK`=F+(CWuLe3_`0A zx-Gp7)gigq%q8i#Xg57OHeebiBrUoMeBq{2mo7zg;5^-P46gUsd$;u#JEY@?u zuJK)4%LBIL9)iVydb7GGsoq?YIb<3UA0h+`-pUo$sU?u!zOj7;dSX6X0!#|&sCDec z!o3D6=ny|EsiGh+T+>6VBu4g)Rmyuooc(_ zOa2iiNAO7lKJ7}iaZtdj^9O0nSN;rTWm`6I?2Eno5ARva0_$NnY+ft=xWX6qsvQsj zJB0S@#_3)8bCgXq>L`jp0w)TR70tG^cJ1Uson4zl!JWbO&eok~wgi_Drr1GvzJ z_RcmByMNCM>!A(Jzk#CN)186N(6>8L5>1t>DJLs7S1v6w;N!0Y79fP>i~W_ZFt|}# zjPwLjF2S$InKEET^SBB5CswqfFb05OK?N|;MZmNo|2=YI!>?K;V#x0x9V^Fgg8g4( YQt%tKa^@0NIfe8YiyaP1j(|%41hMCkBLDyZ delta 1759 zcmb7FU2GIp6h8Ov-|VoIX&2h1yU5ILL29Q3R*QvNyB0d^56}{Y2NIHE#H?aWi)peo z!1D7_Ln6T&2_g`AG0(?y`sIb5n zGd0+<%Ogt_S5(gp>CF-9t?gYFaYvzHQ^p^zjFI|{S+i8xyCl3+5u%4zcd2vpmH^11 zOrzYCv0j}icVrsmx(qM3W!uz{JUc_LcF0d>dG$q^#xwo0KP#!eVAsU%^`QAnvMNsN zO{Ilu)N|<;M}n)!@^ABy&~s1djV`y^8lw$0S>iKIX;oRXueDcDox!Dwp0nvy5qHde zu5!u(U6_)kGN|o!qLNrmn$4=Y>w4bx!S%eHhYxgK(rr5ok<}=Bw*AV@R=3R)|O^Q#BK%HUddPjt+NC^V4|{5GI<5G+e+4ms7O-W zOA~)T#F`p21NW{4xO$ZHlWSs<+?w&qG$YEZFpH5vAN$4994ABjBpw;0l20{_xCd*lO}vA zKEekH+wG&w9^%7%1hfN_{2H-G9JYr*yHXaT`VE5~(u{vNx@h3WbtTW0t3 z{rFAVjCh4(+wDiHe=U$@ch9yr<;Gy4Sv|3N5prECFfYGOX)Nfux9(NrK)@Ezq6K3} zs<2#J3spfqmnh>vlyT3DvzjK)l(I9XJvZRFo%i^42Gvgm_Bmf&rxgCUVYH}Gxlaj* zTvE@~muaLnO8m7wT*_Eu8y(vzz{q9C5FxwR8x #include #include +#include +#include #include "user_proto.h" diff --git a/with_opencm3/user_proto.c b/with_opencm3/user_proto.c index 14b89a4..5946133 100644 --- a/with_opencm3/user_proto.c +++ b/with_opencm3/user_proto.c @@ -22,6 +22,7 @@ #include "cdcacm.h" #include "main.h" #include "uart.h" +#include "hardware_ini.h" // integer value given by user static volatile int32_t User_value = 0; @@ -60,6 +61,12 @@ void parce_incoming_buf(char *buf, int len, sendfun s){ command = buf[i]; if(!command) continue; // omit zero switch (command){ + case 'A': // show ADC value + //adc_start_conversion_direct(ADC1); + P("\r\n ADC value: ", s); + print_int(ADC_value, s); + newline(s); + break; case 'b': // turn LED off gpio_set(GPIOC, GPIO12); break;