| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313 |
- /*--------------------------------------------------------------------------------------
- * @file USARTSetup.c
- * @author ZhangJing
- * @version base on stm32f0x
- * @date 2015.09.11
- * @brief 串口驱动
- ---------------------------------------------------------------------------------------*/
- #include "stm32f10x_gpio.h"
- #include "TypeDefine.h"
- #include "USARTSetup.h"
- #include "stm32f10x_dma.h"
- uint8_t usart1XmitBuffer[USART1_XMIT_LEN]; //USART1发送缓冲
- uint8_t usart1RecvBuffer[USART1_RECV_LEN]; //USART1接收缓冲
- uint8_t usart1RecvCnt = 0; //USART1接收计数
- uint8_t usart2XmitBuffer[USART2_XMIT_LEN]; //USART2发送缓冲
- uint8_t usart2RecvBuffer[USART2_RECV_LEN]; //USART2接收缓冲
- uint8_t usart2RecvCnt = 0; //USART2接收计数
- uint8_t usart3XmitBuffer[USART3_XMIT_LEN]; //USART3发送缓冲
- uint8_t usart3RecvBuffer[USART3_RECV_LEN]; //USART3接收缓冲
- uint8_t usart3RecvCnt = 0; //USART3接收计数
- /*******************************************************************************
- * Function: USART2_DMAinit()
- * Object: 串口1初始化函数
- * 输入: 无
- * 输出: 无
- * 备注: 与PC通信
- ********************************************************************************/
- void USART2_DMAinit(void)
- {
- /*DMA_InitTypeDef DMA_InitStructure;
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
- // DMA channel6configuration
- DMA_DeInit(DMA1_Channel6);
- DMA_InitStructure.DMA_PeripheralBaseAddr =(u32)(&USART2->DR); //外设地址
- DMA_InitStructure.DMA_MemoryBaseAddr =(u32)usart2RecvBuffer;
- DMA_InitStructure.DMA_DIR =DMA_DIR_PeripheralSRC; //外设作为目的地址 //DMA_DIR_PeripheralSRC; //外设作为DMA的源端
- DMA_InitStructure.DMA_BufferSize =50; //BufferSize; //传输大小
- DMA_InitStructure.DMA_PeripheralInc =DMA_PeripheralInc_Disable; //外设递增模式禁止 DMA_PeripheralInc_Enable; //外设地址增加
- DMA_InitStructure.DMA_MemoryInc =DMA_MemoryInc_Enable; //内存地址自增
- DMA_InitStructure.DMA_PeripheralDataSize =DMA_PeripheralDataSize_Byte; //传输方式:字节 DMA_PeripheralDataSize_Word; //字(32位)
- DMA_InitStructure.DMA_MemoryDataSize =DMA_PeripheralDataSize_Byte; //内存存储方式:字节 DMA_MemoryDataSize_Word;
- DMA_InitStructure.DMA_Mode =DMA_Mode_Normal; //DMA_Mode_Normal 正常模式,只传送一次; DMA_Mode_Circular:循环模式,不停的传送;
- DMA_InitStructure.DMA_Priority =DMA_Priority_High;
- DMA_InitStructure.DMA_M2M =DMA_M2M_Disable; //DMA_M2M_Enable;
- DMA_Init(DMA1_Channel6,&DMA_InitStructure);
- // Enable DMA Channel4Transfer Complete interrupt
- // DMA_ITConfig(DMA1_Channel6,DMA_IT_TC, ENABLE);
- //采用DMA方式发送
- // USART_DMACmd(USART2,USART_DMAReq_Rx,ENABLE);
- // DMA_ITConfig(DMA1_Channel6,DMA_IT_TC, ENABLE);
- // DMA_Cmd(DMA1_Channel6,ENABLE); //启动通道6*/
-
- }
- /********************************************************************************
- * Function: USART1Init
- * Object: 串口1初始化函数
- * 输入: 无
- * 输出: 无
- * 备注: 与PC通信
- *********************************************************************************/
- void USART1_Init(uint32_t BaudRate)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- USART_InitTypeDef USART_InitStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
-
- //USART1配置
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1,ENABLE);//复位串口1
- RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1,DISABLE);//停止复位
-
- USART_InitStructure.USART_BaudRate = BaudRate;//一般设置为9600;
- USART_InitStructure.USART_WordLength = USART_WordLength_8b;//8位数据长度
- 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(USART1, &USART_InitStructure); //初始化串口1
-
- NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //使能串口1中断
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; //先占优先级2级
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级2级
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
- NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
-
- USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启中断
- USART_Cmd(USART1, ENABLE); //使能串口
-
-
- }
- /********************************************************************************
- * Function: USART2Init
- * Object: 串口2初始化函数
- * 输入: 无
- * 输出: 无
- * 备注: 与Zigbee通信
- *********************************************************************************/
- void USART2_Init(uint32_t BaudRate)
- {
- /*GPIO_InitTypeDef GPIO_InitStructure;
- USART_InitTypeDef USART_InitStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
-
- //USART2配置
-
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
-
- USART2_DMAinit();//调用USART2 DMA配置函数
-
- //USART2管脚配置
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOA, &GPIO_InitStructure); // TXIO
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
- GPIO_Init(GPIOA, &GPIO_InitStructure); // RXIO
-
- RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2,ENABLE);//复位串口2
- RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2,DISABLE);//停止复位
-
- USART_InitStructure.USART_BaudRate = BaudRate;//设置串口波特率
- USART_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); //配置入结构体
-
-
-
- //中断设置
- NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; //使能串口2中断
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级2级
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //从优先级2级
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
- NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
- //USART_ITConfig(USART2, (USART_IT_RXNE | USART_IT_IDLE), ENABLE);//开启中断
- //中断配置
- USART_ITConfig(USART2,USART_IT_TC,DISABLE);
- USART_ITConfig(USART2,USART_IT_RXNE,DISABLE);
- USART_ITConfig(USART2,USART_IT_IDLE,ENABLE);
- //采用DMA方式发送
- USART_DMACmd(USART2,USART_DMAReq_Rx,ENABLE);
- //DMA_Cmd(DMA1_Channel6,ENABLE); //启动通道6
- DMA_Cmd(DMA1_Channel6,DISABLE); //失能DMA功能
- USART_Cmd(USART2, ENABLE); //使能串口 */
- GPIO_InitTypeDef GPIO_InitStructure;
- USART_InitTypeDef USART_InitStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
-
- //USART2配置
- /* Enable USART clock */
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
-
- //USART2管脚配置
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOA, &GPIO_InitStructure); /* TXIO */
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
- GPIO_Init(GPIOA, &GPIO_InitStructure); /* RXIO */
-
- RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2,ENABLE);//复位串口2
- RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2,DISABLE);//停止复位
-
- USART_InitStructure.USART_BaudRate = BaudRate;//设置串口波特率
- USART_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); //配置入结构体
-
- //中断设置
- NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; //使能串口2中断
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级2级
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //从优先级2级
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
- NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
- USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启中断
- USART_Cmd(USART2, ENABLE); //使能串口
- }
- /********************************************************************************
- * Function: USART3Init
- * Object: 串口3初始化函数
- * 输入: 无
- * 输出: 无
- * 备注: 与从机通信
- *********************************************************************************/
- void USART3_Init(uint32_t BaudRate)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- USART_InitTypeDef USART_InitStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
- //USART3配置
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
-
-
- //USART3管脚配置
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOB, &GPIO_InitStructure); /* TXIO */
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
- GPIO_Init(GPIOB, &GPIO_InitStructure); /* RXIO */
-
- RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART3,ENABLE);//复位串口3
- RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART3,DISABLE);//停止复位
-
- USART_InitStructure.USART_BaudRate = BaudRate;//设置串口波特率
- USART_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(USART3, &USART_InitStructure); //配置入结构体
- //
- // //中断设置
- NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn; //使能串口3中断
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; //先占优先级2级
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级2级
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
- NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
- USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//开启中断
- USART_Cmd(USART3, ENABLE);
- }
- /********************************************************************************
- * Function: USART1Send
- * Object: USART1发送函数
- * 输入: uint8_t *xmitDataBuf 待发送数据缓存区
- * uint32_t xmitLen 发送数据长度
- * 输出: 无
- * 备注: 1、根据xmitLen设定长度发送 xmitDataBuf中的数据
- *********************************************************************************/
- void USART1Send( uint8_t *xmitDataBuf, uint32_t xmitLen )
- {
- uint8_t i;
- for( i = 0; i < xmitLen ; i++ )
- {
- while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); //发送完成
- USART_SendData(USART1,*(xmitDataBuf++));
- }
- while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
- }
- /********************************************************************************
- * Function: USART2Send
- * Object: USART2发送函数
- * 输入: uint8_t *xmitDataBuf 待发送数据缓存区
- * uint32_t xmitLen 发送数据长度
- * 输出: 无
- * 备注: 1、根据xmitLen设定长度发送 xmitDataBuf中的数据
- *********************************************************************************/
- void USART2Send( uint8_t *xmitDataBuf, uint32_t xmitLen )
- {
- uint8_t i;
- for( i = 0; i < xmitLen ; i++ )
- {
- while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET); //发送完成
- USART_SendData(USART2,*(xmitDataBuf++));
- }
- while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);
- }
- /********************************************************************************
- * Function: USART3Send
- * Object: USART3发送函数
- * 输入: uint8_t *xmitDataBuf 待发送数据缓存区
- * uint32_t xmitLen 发送数据长度
- * 输出: 无
- * 备注: 1、根据xmitLen设定长度发送 xmitDataBuf中的数据
- *********************************************************************************/
- void USART3Send( uint8_t *xmitDataBuf, uint32_t xmitLen )
- {
- uint8_t i;
- for( i = 0; i < xmitLen ; i++ )
- {
- while(USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET); //发送完成
- USART_SendData(USART3,*(xmitDataBuf++));
- }
- while(USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET);
- }
|