|
本帖最后由 在路上11111111 于 2017-3-2 18:29 编辑 #include "stm32f10x.h"' a2 t' x8 b) E# r" P* ^( f #include "stdio.h" uint8_t Tx_Buffer[520]; uint32_t Rx_length=0; uint32_t Rx_xiaobiao=0; uint32_t Rx_have_done = 0;9 [0 O/ `/ k5 K6 ~( b uint8_t RxBuffer[64]; typedef enum) i8 S6 K1 l5 D4 a% p3 V {* t8 R% h- v$ @& F3 b6 x2 y$ w" o- b GPIO_PIN_One,$ a! e9 @5 Y7 Z8 U* m* g+ o5 E! v- l GPIO_PIN_Two, GPIO_PIN_Three,% b5 F- z" u6 L" j GPIO_PIN_Four, GPIO_PIN_Five,8 C K9 Q( S+ B8 ?' Q5 h k; R+ j GPIO_PIN_Six, GPIO_PIN_Seven9 I9 _8 G" Z: |" F* [ A" j8 S }GPIO;+ V q* ~1 V# j1 J* M 2 x7 Z) y1 N7 Y9 g Z1 z uint16_t PIN[16]={GPIO_Pin_0,GPIO_Pin_1,GPIO_Pin_2,GPIO_Pin_3,GPIO_Pin_4,GPIO_Pin_5,GPIO_Pin_6,GPIO_Pin_7,GPIO_Pin_8,GPIO_Pin_9,GPIO_Pin_10,GPIO_Pin_11,GPIO_Pin_12,GPIO_Pin_13,GPIO_Pin_14,GPIO_Pin_15};7 R, \. Y+ w, q L GPIO_TypeDef* GPIOX[7]={GPIOA,GPIOB,GPIOC,GPIOD,GPIOE,GPIOF,GPIOG};) X: H* y# H' \1 [* a9 d! C) ^' s void Delay(unsigned int nCount)* M* ~7 u" X; |! B6 |( K { while(nCount--);: o5 d3 ?. ?2 m, s6 q$ e" g }/ r9 n q5 A. W: \, r: a void STM32LED(GPIO gpio,unsigned char pin) {2 k, Q! R7 O* ?- @9 E+ [& Q GPIO_InitTypeDef GPIO_InitStructure; ~* ]! O; J# M4 q5 R1 M- _ & n% u9 d' O* L& @ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);! X) X, ^$ h9 F1 ^; A3 ^# [ 1 T0 N: A2 \4 g( g GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Pin = PIN[pin]; GPIO_Init(GPIOX[gpio],&GPIO_InitStructure); GPIOD->BSRR = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_7;& \+ w4 {1 z2 G, f) T0 D" U } void STM32_USART_Init(void)) c* x" H: \$ h; y2 c/ v { USART_InitTypeDef USART_InitStructure;3 l+ |( a$ p2 @: t' H0 f/ ` GPIO_InitTypeDef GPIO_InitStructure;( D" \' O/ G3 y RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_AFIO,ENABLE);+ l4 Y# r7 p! g N' c# a } . c# I2 T; [9 { GPIO_PinRemapConfig(GPIO_Remap_USART2,ENABLE);0 A# |& }! B$ Y4 Y8 N& x RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE); USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength = USART_WordLength_8b;$ g- y, J" |0 r Y- _+ g+ k7 \ USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;- n+ T/ \! d# {; m F USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;0 j$ N' n3 [! `* n9 L6 M - B+ O. U8 |% w# W+ h! ] GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;# \1 ^3 f5 F1 \0 B3 `5 \ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;; W* [3 K7 G D2 J# ` GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOD,&GPIO_InitStructure); 3 ~0 a7 f+ S# |8 N2 d GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;' q3 T5 B3 m! M. h0 h" [ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOD,&GPIO_InitStructure);: [8 M" |" f8 [6 ?7 c1 C" l: s USART_Init(USART2,&USART_InitStructure);# e+ r. V- ]7 x( ?& M- J" T USART_Cmd(USART2,ENABLE);7 X! j2 F* e" a( J/ |* Y8 A printf("\n\r ############ WWW.ARMJISHU.COM! ############ \n"); 4 t( N0 r$ s7 d' s/ V) s } % a7 l0 g C5 i1 c( s. s6 H #ifndef MicroLIB* d' f- ?2 ^0 U" h2 j #pragma import(__use_no_semihosting)$ H; U% o. {$ t/ P+ d4 h) c3 Y4 x' O* ? struct __FILE {, H# s7 H% A1 b; ?! p1 R* T+ y5 s# [ int handle; }; i% F& N- Z0 P8 [( ^' {: T FILE __stdout; _sys_exit(int x)6 Q- ` W; j/ L2 E8 d {6 ]$ h/ J* m5 b% o x= x;' u- C" Y: M2 \' @7 z, \# h }2 h0 K) X- u$ ~; }6 p int fputc(int ch,FILE *f) { while(USART_GetFlagStatus(USART2,USART_FLAG_TC) == RESET) {} USART_SendData(USART2,(uint8_t) ch);$ {, m% U. @: b3 x return ch;3 g- g6 J- G0 {3 z }( d9 z7 }/ M1 e/ e: }( [ . ^5 a! g" x0 b* l' P' O int ferror(FILE *f) { return EOF;: P& U' P$ j* p* m; n" H/ ?+ } } #endif1 Y4 h. L4 q, I1 z$ Z. g FILE __stdin; 0 ]0 m/ x; N* E' D. o) R H4 @ int fgetc(FILE *fp) { int ch = 0;" N- ?4 _0 u" z4 t& L5 D9 m1 W while(USART_GetFlagStatus(USART2,USART_FLAG_RXNE) == RESET)* F1 Z9 ]+ i' x {} ch = (int)USART2->DR & 0XFF; putchar(ch); return ch; } #ifdef USE_FULL_ASSERT - S: a' f0 [, H, \8 @ void assert_failed(uint8_t* file,uint32_t line { printf("Wrong parameters Value:file %s on line %d\r\n",file,line);2 \" X# Z5 _+ ?* E- k while(1) { }+ x' I9 h( s" h+ b8 s" s8 Y( H }11 #endif# C7 O" Z5 [! `/ ` $ _" o/ V* |+ C5 f7 D X void UsartIrqHandlerUser(void) {- E; J* O, G: V; D* e8 b: d; ]7 v if(USART_GetITStatus(USART2,USART_IT_RXNE) != RESET)( Y* Y$ F! f3 W- f4 c ~ { USART_ClearITPendingBit(USART2,USART_IT_RXNE);/ J: ~ v7 H5 s' m2 c, _+ q1 j6 I/ \+ \: O$ B RxBuffer[Rx_length] = USART2->DR;2 J# G( k& s ~ Rx_length++; if(USART2->DR == '\r' || Rx_length >= 64) {* p; J% l' [$ _* k0 {; L Rx_have_done = 1; } } Z- Q5 t# s* z. q8 p; [2 ?6 K // else if(USART_GetITStatus(USART2,USART_IT_TC) != RESET) // { // USART_ClearITPendingBit(USART2,USART_IT_TC);& w5 s6 l+ x* a // }+ \7 f0 [7 _! r1 O$ }2 ` : i) @! }1 J @6 e/ g4 I1 S7 ` " C4 P# ^8 [- a } void NVIC_GroupConfig(void) { GPIOD->BRR= GPIO_Pin_4; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);) S2 [ Y% e3 \- v! ^ }3 c- x% d: J) S# H void NVIC_COMConfiguration(void)+ q2 J$ o' Y1 T { NVIC_InitTypeDef NVIC_InitStructure; GPIOD->BRR= GPIO_Pin_3;6 g9 X: @5 J+ h2 D- k2 R USART_ITConfig(USART2,USART_IT_RXNE,ENABLE); NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;8 v2 ]" R, h7 q) C: v h NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; # n m; d9 R; | V+ Z NVIC_Init(&NVIC_InitStructure);; F* G7 y" a4 I2 d }: Y; s; R( H3 u7 A" j2 \ uint32_t UsartReadData(uint8_t* Buffer)3 ~" Q* z5 j+ w8 G { uint32_t uartDataLength = 0,i; if(Rx_length != 0) { uartDataLength = Rx_length ; Rx_length = 0; Rx_have_done = 0;& |& a# k3 e. q5 o' Q, e5 ` for(i=0;i<uartDataLength;i++), G4 F& Y( {' Z" B c! T0 n7 ~ {+ `' o/ [, k% s" B( l; S Buffer = RxBuffer;; n4 D) @) ], Z }5 I* h( U: z' ~1 m& @6 Z! \ Buffer = '\0'; }/ i" O9 [) d; t, m/ S, }1 t/ Z1 O return uartDataLength ; } void USART2_IRQHandler(void)& N$ V. Y6 \( ~7 z {* h8 e. d1 @# O5 A! W( O/ i //__disable_irq(); GPIOD->BRR= GPIO_Pin_2; UsartIrqHandlerUser();! x8 K/ [" B& e3 x6 n9 O; j' C! y) W GPIOD->BRR= GPIO_Pin_2;/ r3 T- F0 K4 s. J, a' | //__enable_irq(); } /*DMA的配置步骤: 1:先打开相关的时钟;/ F) g) L# f& Q& F+ ~ 2:然后配置的是DMA结构体的东西,注意的是目标地址和原地址是否要进行地址的自动加的功能; 3:使能DMA(DMA_Cmd());$ F S7 C7 U3 B- E. A/ ~ 4:打开USART的使能;: }0 ^- g+ Z# r T4 E ******/7 N& Y3 C$ q- x5 V4 K void STM32_DMA_Init()5 H; N! C2 V* q/ G- C/ o { x/ Z: u* J# z DMA_InitTypeDef DMA_InitStructure; RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);# S7 i! o) M! L //打开DMA 的使能时钟 DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&USART2->DR; //DMA 的设数据寄存器的基地址;这个可以是目标地址,也可以是原地址;8 K$ q `1 o2 x- l9 y' e 这里的是使用USART2外设,; v1 g* u+ s% ~: w' F DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&Tx_Buffer; //DMA 的保存了内存的基地址,这个可以作为传输的源或者目标" l, J( t1 v# l' S* O! _- s5 @ DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; //保存了DMA数据传输方向,可以选择是外设到内存还是内存到外设。 这里选的是内存到外设0 Z, A4 i, A% F DMA_InitStructure.DMA_BufferSize = 520; //传输数据的大小,这里是520; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;8 K+ `8 R g3 H, Z+ e# k! q //外设地址是否要进行自增; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;: Y) V# x1 x8 ?' E; |6 O- a //内存地址是否要进行自增; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;* N3 r/ h" u1 J# l0 d //外设数据单元的大小;这里可以是Byte(uint_8),也可以是halfword(uint_16);也可以是word(uint_32);! d7 p3 v5 K& O+ d9 M* P DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //内存数据单元的大小;这里可以是Byte(uint_8),也可以是halfword(uint_16);也可以是word(uint_32); /*uint8_t 代表的是一个Byte,uint16_t 代表的是一个halfword,uint32_t 代表的是一个word*/( } P& [; Q' y; U5 e( r DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;" j4 e+ G+ b2 l( `/ |! }2 U; C& k0 w //DMA的工作模式;Normal是指只发送完一次数据(你定义发送的数据) // Circular 是指发送完一次数据以后,继续发送(一次数据是指发送完你所定义发送的所有数据7 K% f- s1 Z3 D% `& V' }/ H DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //DMA的优先级9 g& q. [" u5 Q/ U DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //DMA 的内存到内存模式 DMA_Init(DMA1_Channel7,&DMA_InitStructure);( \4 |+ }; [9 U6 e 7 _6 H" H) q; M }3 W' K, U5 q0 w int main(void); w& P" n$ o* T0 S+ G, S& Y" b' K$ L/ F { unsigned int i;//unsigned int 在printf打印的时候可以以%d或者%u的形式进行打印& i8 U, Q: [ u! ^7 O l7 \ * j- c- }& v$ D1 g2 t uint8_t ucStr[65];" q3 J6 {+ o/ w$ [& a- y) l for(i=0;i<520;i++) {* m+ q! }: g1 m# \7 O; a Tx_Buffer = 'w';6 S, \4 U1 n% H } STM32LED(GPIO_PIN_Four,2); STM32LED(GPIO_PIN_Four,3); STM32LED(GPIO_PIN_Four,4);1 ^6 _$ a3 V- { STM32LED(GPIO_PIN_Four,7);8 g: \9 V( g" \1 _' V# A8 _: x+ O) K$ V //配置串口的时候,应该先配置串口方面,再去配置串口的优先级问题;, `7 g# }! b% i6 H T. m STM32_USART_Init();0 j2 R; b' T2 j7 t4 L1 E NVIC_GroupConfig(); NVIC_COMConfiguration(); //printf("\r\n%s\r\n",Tx_Buffer); ) _8 U2 q" `- e" i+ |$ p/ o STM32_DMA_Init(); # }# N8 ?% v# P$ X, E6 D: m' K% M DMA_Cmd(DMA1_Channel7,ENABLE); //使能DMA USART_DMACmd(USART2,USART_DMAReq_Tx,ENABLE);: _ u( J/ \; m- _% v7 p3 ?$ n //将USART2与DMA1的相捆绑,并且使用的是USART2的Tx功能(USART_DMAReq_Tx); while(1)+ M4 E' Y2 e7 {9 l+ E G { if(DMA_GetFlagStatus(DMA1_FLAG_TC7)!=RESET); I2 T1 v8 x! }7 e0 N9 Y4 B/ A { DMA_ClearFlag(DMA1_FLAG_TC7); } } }3 q4 P% j e3 ^" `, C+ d4 E X7 x b, s4 t3 ~. t0 I& L2 s6 z |
微信公众号
手机版
十分抱歉,那会早上要上课,所以没怎么弄,十分抱歉。
十分抱歉,那会早上要上课,所以没怎么弄,十分抱歉。