
本帖最后由 在路上11111111 于 2017-3-2 18:29 编辑 #include "stm32f10x.h" #include "stdio.h" uint8_t Tx_Buffer[520]; uint32_t Rx_length=0; uint32_t Rx_xiaobiao=0; uint32_t Rx_have_done = 0; uint8_t RxBuffer[64]; typedef enum { GPIO_PIN_One, GPIO_PIN_Two, GPIO_PIN_Three, GPIO_PIN_Four, GPIO_PIN_Five, GPIO_PIN_Six, GPIO_PIN_Seven }GPIO; 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}; GPIO_TypeDef* GPIOX[7]={GPIOA,GPIOB,GPIOC,GPIOD,GPIOE,GPIOF,GPIOG}; void Delay(unsigned int nCount) { while(nCount--); } void STM32LED(GPIO gpio,unsigned char pin) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE); 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; } void STM32_USART_Init(void) { USART_InitTypeDef USART_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_AFIO,ENABLE); GPIO_PinRemapConfig(GPIO_Remap_USART2,ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE); USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_Mode = USART_Mode_Rx|USART_Mode_Tx; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOD,&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOD,&GPIO_InitStructure); USART_Init(USART2,&USART_InitStructure); USART_Cmd(USART2,ENABLE); printf("\n\r ############ WWW.ARMJISHU.COM! ############ \n"); } #ifndef MicroLIB #pragma import(__use_no_semihosting) struct __FILE { int handle; }; FILE __stdout; _sys_exit(int x) { x= x; } int fputc(int ch,FILE *f) { while(USART_GetFlagStatus(USART2,USART_FLAG_TC) == RESET) {} USART_SendData(USART2,(uint8_t) ch); return ch; } int ferror(FILE *f) { return EOF; } #endif FILE __stdin; int fgetc(FILE *fp) { int ch = 0; while(USART_GetFlagStatus(USART2,USART_FLAG_RXNE) == RESET) {} ch = (int)USART2->DR & 0XFF; putchar(ch); return ch; } #ifdef USE_FULL_ASSERT void assert_failed(uint8_t* file,uint32_t line { printf("Wrong parameters Value:file %s on line %d\r\n",file,line); while(1) { } }11 #endif void UsartIrqHandlerUser(void) { if(USART_GetITStatus(USART2,USART_IT_RXNE) != RESET) { USART_ClearITPendingBit(USART2,USART_IT_RXNE); RxBuffer[Rx_length] = USART2->DR; Rx_length++; if(USART2->DR == '\r' || Rx_length >= 64) { Rx_have_done = 1; } } // else if(USART_GetITStatus(USART2,USART_IT_TC) != RESET) // { // USART_ClearITPendingBit(USART2,USART_IT_TC); // } } void NVIC_GroupConfig(void) { GPIOD->BRR= GPIO_Pin_4; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); } void NVIC_COMConfiguration(void) { NVIC_InitTypeDef NVIC_InitStructure; GPIOD->BRR= GPIO_Pin_3; USART_ITConfig(USART2,USART_IT_RXNE,ENABLE); NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } uint32_t UsartReadData(uint8_t* Buffer) { uint32_t uartDataLength = 0,i; if(Rx_length != 0) { uartDataLength = Rx_length ; Rx_length = 0; Rx_have_done = 0; for(i=0;i<uartDataLength;i++) { Buffer = RxBuffer; } Buffer = '\0'; } return uartDataLength ; } void USART2_IRQHandler(void) { //__disable_irq(); GPIOD->BRR= GPIO_Pin_2; UsartIrqHandlerUser(); GPIOD->BRR= GPIO_Pin_2; //__enable_irq(); } /*DMA的配置步骤: 1:先打开相关的时钟; 2:然后配置的是DMA结构体的东西,注意的是目标地址和原地址是否要进行地址的自动加的功能; 3:使能DMA(DMA_Cmd()); 4:打开USART的使能; ******/ void STM32_DMA_Init() { DMA_InitTypeDef DMA_InitStructure; RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE); //打开DMA 的使能时钟 DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&USART2->DR; //DMA 的设数据寄存器的基地址;这个可以是目标地址,也可以是原地址; 这里的是使用USART2外设, DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&Tx_Buffer; //DMA 的保存了内存的基地址,这个可以作为传输的源或者目标 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; //保存了DMA数据传输方向,可以选择是外设到内存还是内存到外设。 这里选的是内存到外设 DMA_InitStructure.DMA_BufferSize = 520; //传输数据的大小,这里是520; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址是否要进行自增; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存地址是否要进行自增; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //外设数据单元的大小;这里可以是Byte(uint_8),也可以是halfword(uint_16);也可以是word(uint_32); 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*/ DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //DMA的工作模式;Normal是指只发送完一次数据(你定义发送的数据) // Circular 是指发送完一次数据以后,继续发送(一次数据是指发送完你所定义发送的所有数据 DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //DMA的优先级 DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //DMA 的内存到内存模式 DMA_Init(DMA1_Channel7,&DMA_InitStructure); } int main(void) { unsigned int i;//unsigned int 在printf打印的时候可以以%d或者%u的形式进行打印 uint8_t ucStr[65]; for(i=0;i<520;i++) { Tx_Buffer = 'w'; } STM32LED(GPIO_PIN_Four,2); STM32LED(GPIO_PIN_Four,3); STM32LED(GPIO_PIN_Four,4); STM32LED(GPIO_PIN_Four,7); //配置串口的时候,应该先配置串口方面,再去配置串口的优先级问题; STM32_USART_Init(); NVIC_GroupConfig(); NVIC_COMConfiguration(); //printf("\r\n%s\r\n",Tx_Buffer); STM32_DMA_Init(); DMA_Cmd(DMA1_Channel7,ENABLE); //使能DMA USART_DMACmd(USART2,USART_DMAReq_Tx,ENABLE); //将USART2与DMA1的相捆绑,并且使用的是USART2的Tx功能(USART_DMAReq_Tx); while(1) { if(DMA_GetFlagStatus(DMA1_FLAG_TC7)!=RESET) { DMA_ClearFlag(DMA1_FLAG_TC7); } } } |
十分抱歉,那会早上要上课,所以没怎么弄,十分抱歉。
十分抱歉,那会早上要上课,所以没怎么弄,十分抱歉。