STM32用串口DMA进行蓝牙通讯c语言源码.docx_第1页
STM32用串口DMA进行蓝牙通讯c语言源码.docx_第2页
STM32用串口DMA进行蓝牙通讯c语言源码.docx_第3页
STM32用串口DMA进行蓝牙通讯c语言源码.docx_第4页
STM32用串口DMA进行蓝牙通讯c语言源码.docx_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

#include stm32f10x_rcc.h#include include.h/#include delay.h/#include usart2.h#include stdarg.h #include stdio.h #include string.h / /本程序只供学习使用,未经作者许可,不得用于其它任何用途/All rights reserved / _align(8) u8 USART2_SEND_DATA512; _align(8) u8 USART2_RECEIVE_DATAUSART1_MAX_RECV_LEN; _align(8) u8 USART2_RECEIVE_DATA2USART1_MAX_RECV_LEN; u8 USART2_TX_Finish;/ USART1发送完成标志量u8 USART2_RXDATA_Finish;/ USART1发送完成标志量u8 USART2_RXDATA2_Finish;/ USART1发送完成标志量u8 USART2_RXBUF_InUSE;/ USART1发送完成标志量u8 USART2_RXBUF2_InUSE;/ USART1发送完成标志量u8 USART2_RXBUF_DataLen=0;u8 USART2_RXBUF2_DataLen=0;u8 BT_AT_CMD_OK=0;u8 USART2_Data_temp=0;u8 USART2_RX_CNT=0;/ USART1接收字节数/初始化IO 串口2/pclk1:PCLK1时钟频率(Mhz)/bound:波特率 void USART2_Init_BT(u32 pclk1,u32 bound) DMA_InitTypeDef DMA_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;GPIO_InitTypeDef GPIO_InitStructure; /* DMA1 clock enable Luke Liu*/ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);/* 第1步:打开GPIO和USART部件的时钟 */RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);/* 第2步:将USART Tx的GPIO配置为推挽复用模式 */GPIO_InitStructure.GPIO_Pin = USART2_TxPin;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);/* 第3步:将USART Rx的GPIO配置为浮空输入模式由于CPU复位后,GPIO缺省都是浮空输入模式,因此下面这个步骤不是必须的但是,我还是建议加上便于阅读,并且防止其它地方修改了这个口线的设置参数*/GPIO_InitStructure.GPIO_Pin = USART2_RxPin;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, &GPIO_InitStructure);/ uart configuration:USART_InitStructure.USART_BaudRate = 9600;/9600 is for BluetoothUSART_InitStructure.USART_WordLength = USART_WordLength_8b;USART_InitStructure.USART_StopBits = USART_StopBits_1;USART_InitStructure.USART_Parity = USART_Parity_No;USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;USART_Init(USART2, &USART_InitStructure);/空闲中断/USART_ITConfig(USART1, USART_IT_IDLE , ENABLE);/ 第5步:使能 USART, 配置完毕 /USART_Cmd(USART2, ENABLE); / CPU的小缺陷:串口配置好,如果直接Send,则第1个字节发送不出去如下语句解决第1个字节无法正确发送出去的问题 /USART_ClearFlag(USART2, USART_FLAG_TC);/ 清发送外城标志,Transmission Complete flag /DMA configuration:/* DMA1 Channel7 (triggered by USART2 Tx event) Config must and only can UART2 TX triged*/DMA_DeInit(DMA1_Channel7); DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&USART2-DR;/(u32)&USART2-DR;/(u32)&USART1-DR;/0x40013804;/(u32)&USART1-DR;DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)USART2_SEND_DATA;DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;DMA_InitStructure.DMA_BufferSize = 512;DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;DMA_InitStructure.DMA_Priority = DMA_Priority_High;DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;DMA_Init(DMA1_Channel7, &DMA_InitStructure);DMA_ITConfig(DMA1_Channel7, DMA_IT_TC, ENABLE);DMA_ITConfig(DMA1_Channel7, DMA_IT_TE, ENABLE);/* Enable USART2 DMA TX request */USART_DMACmd(USART2, USART_DMAReq_Tx, ENABLE);DMA_Cmd(DMA1_Channel7, DISABLE);/* DMA1 Channel6 (triggered by USART2 Rx event) Config */DMA_DeInit(DMA1_Channel6); DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&USART2-DR;/(u32)(&(USART1-DR);/(u32)&USART1-DR;/0x40013804;/(u32)&USART1-DR;DMA_InitStructure.DMA_MemoryBaseAddr = (u32)USART2_RECEIVE_DATA;DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;DMA_InitStructure.DMA_BufferSize = USART1_MAX_RECV_LEN;DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;DMA_InitStructure.DMA_Priority = DMA_Priority_High;DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;DMA_Init(DMA1_Channel6, &DMA_InitStructure); USART_ClearFlag(USART2, USART_FLAG_RXNE); USART_DMACmd(USART2, USART_DMAReq_Rx, ENABLE); DMA_ITConfig(DMA1_Channel6, DMA_IT_TC, ENABLE);USART2_RXBUF_InUSE=1;USART2_RXDATA_Finish=0;USART2_RXBUF2_InUSE=0;USART2_RXDATA2_Finish=0; DMA_Cmd(DMA1_Channel6, ENABLE);/NVIC configuration:/* Configure one bit for preemption priority */NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); /* Enable the USART1 Interrupt */NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);/Enable DMA Channel6 Interrupt NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel6_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);/*Enable DMA Channel7 Interrupt */NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel7_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);u8 BT_get_at_ok()u8 retry=50,t; u8 temp=0;while(retry-)if(BT_AT_CMD_OK=1)BT_AT_CMD_OK=0;temp=1;return temp;Delay_ms(20);return temp;u8 BT_Module_init()u8 retry=10,t; u8 temp=0;USART2_RXBUF_InUSE=1;USART2_RXDATA_Finish=0;USART2_RXBUF2_InUSE=0;USART2_RXDATA2_Finish=0;while(retry-)&(temp=0)printf(AT+CGPSPWR=1rn);/发送AT测试指令BT_u2_printf_BT(AT+CGPSPWRrn);if(BT_AT_CMD_OK=1)BT_AT_CMD_OK=0;temp =1;Delay_ms(500);if(temp=1)temp=0;retry=10;while(retry-)&(temp=0)printf(AT+CGPSRST=1rn);/发送AT测试指令BT_u2_printf_BT(AT+CGPSRSTrn);if(BT_AT_CMD_OK=1)BT_AT_CMD_OK=0;temp =1;Delay_ms(500);if(temp=1)temp=0;retry=10;while(retry-)&(temp=0)printf(AT+CGPSOUT=32rn);/发送AT测试指令BT_u2_printf_BT(AT+CGPSOUT=32rn);if(BT_AT_CMD_OK=1)BT_AT_CMD_OK=0;temp =1;Delay_ms(500);return temp; /串口2,printf 函数/确保一次发送数据不超过USART2_MAX_SEND_LEN字节void BT_u2_printf_BT(char* fmt) /while(DMA1_Channel7-CNDTR!=0);/等待通道7传输完成 /while(USART2_TX_Finish=1)UART_DMA_Enable_BT(DMA1_Channel7,fmt,strlen(fmt); /通过dma发送出去 /开启一次DMA传输void UART_DMA_Enable_BT(DMA_Channel_TypeDef*DMA_CHx,uint8_t *Buf,u8 len)/USART用DMA传输替代查询方式发送,克服被高优先级中断而产生丢帧现象。DMA_Cmd(DMA_CHx, DISABLE); /改变datasize前先要禁止通道工作DMA_CHx-CMAR = (uint32_t)Buf;DMA_CHx-CNDTR=len; /DMA1,传输数据量USART2_TX_Finish=0;/DMA传输开始标志量DMA_Cmd(DMA_CHx, ENABLE); void DMA1_Channel6_IRQHandler(void)uint8_t test=DMA6irq;/USART1_RX_CNT=DMA1_Channel5-CNDTR; DMA_ClearITPendingBit(DMA1_IT_TC6);DMA_ClearITPendingBit(DMA1_IT_TE6);DMA_Cmd(DMA1_Channel6, DISABLE);/关闭DMA,防止处理其间有数据if(USAR

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论