初中生
最后登录1970-1-1
在线时间 小时
注册时间2019-8-22
|
在STM32F103 DMA串口接收中,关于串口的接收配置是 这样的
- /**
- * [url=home.php?mod=space&uid=41770]@brief[/url] USART GPIO 配置,工作参数配置
- * @param 无
- * @retval 无
- */
- void USART_Config(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- USART_InitTypeDef USART_InitStructure;
- NVIC_InitTypeDef NVIC_InitStruct;
- // 打开串口GPIO的时钟
- DEBUG_USART_GPIO_APBxClkCmd(DEBUG_USART_GPIO_CLK, ENABLE);
-
- // 打开串口外设的时钟
- DEBUG_USART_APBxClkCmd(DEBUG_USART_CLK, ENABLE);
-
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
- NVIC_InitStruct.NVIC_IRQChannel = DEBUG_USART_IRQ;
- NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
- NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
- NVIC_InitStruct.NVIC_IRQChannelSubPriority = 3;
- NVIC_Init(&NVIC_InitStruct);
- // 将USART Tx的GPIO配置为推挽复用模式
- GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_GPIO_PIN;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure);
- // 将USART Rx的GPIO配置为浮空输入模式
- GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_GPIO_PIN;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
- GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);
-
- // 配置串口的工作参数
- // 配置波特率
- USART_InitStructure.USART_BaudRate = DEBUG_USART_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(DEBUG_USARTx, &USART_InitStructure);
- //使能空闲中断
- USART_ITConfig(DEBUG_USARTx,USART_IT_IDLE,ENABLE);
- // 使能串口
- USART_Cmd(DEBUG_USARTx, ENABLE);
- }
复制代码 这上面的关键是开启了串口接收 空闲中断
- /**
- * @brief 串口空闲中断.
- * @param 无
- * @retval 无
- */
- void DEBUG_USART_IRQHandler(void)
- {
- uint16_t t;
- if(USART_GetITStatus(DEBUG_USARTx,USART_IT_IDLE) == SET) //检查中断是否发生
- {
- DMA_Cmd(USART_TX_DMA_CHANNEL,DISABLE); //关闭DMA传输
- t = DMA_GetCurrDataCounter(USART_TX_DMA_CHANNEL); //获取剩余的数据数量
-
- Usart_SendArray(DEBUG_USARTx,ReceiveBuff,RECEIVEBUFF_SIZE-t); //向电脑返回数据(接收数据数量 = SENDBUFF_SIZE - 剩余未传输的数据数量)
-
- DMA_SetCurrDataCounter(USART_TX_DMA_CHANNEL,RECEIVEBUFF_SIZE); //重新设置传输的数据数量
- DMA_Cmd(USART_TX_DMA_CHANNEL,ENABLE); //开启DMA传输
-
- USART_ReceiveData(DEBUG_USARTx); //读取一次数据,不然会一直进中断
- USART_ClearFlag(DEBUG_USARTx,USART_FLAG_IDLE); //清除串口空闲中断标志位
- }
-
- }
复制代码 串口接收空闲中断是这样写的
这里有的疑问是,如果同时有多个中断来了,那么是不是就无法响应串口接收空闲中断了?在这里只是说如果有串口接收空闲中断,才通过DMA的方式读取一次数据,如果不进中断是不是不能读取了?这样的话,和通过串口中断读取数据有什么区别吗 ?
|
|