2019-12-12 18:17发布
jaky80000 发表于 2019-3-20 07:33 我在实际测试过程中有这个现象,初始化时并没有开启发送完成中断,在dma传输完成中断里开启发送完成中断 ...
最多设置5个标签!
正应了IT界那句名言,“Talk is cheap, show me the code!”,这是我用在STM32F1XX的串口发送代码,USART2用DMA1_Channel7通道发送,你看看:
- void Drv_Usart2TxStream(uint8_t const data[], uint32_t num)
- {
- if(!data || !num){
- return;
- }
- if(is_tx_busy){
- return;
- }
- /* 设置发送忙标志,表示占用硬件 */
- is_tx_busy = TRUE;
-
- /* 清除串口发送完成中断标志 */
- USART_ITConfig(USART2, USART_IT_TC, DISABLE);
- USART_ClearFlag(USART2, USART_FLAG_TC);
- /* 启动DMA发送 */
- DMA1->IFCR = DMA_IFCR_CGIF7;
- DMA1_Channel7->CCR = ((0<<12)|(0<<8)|DMA_CCR7_MINC|DMA_CCR7_DIR);
- DMA1_Channel7->CCR |= (DMA_CCR7_TCIE|DMA_CCR7_TEIE);
- DMA1_Channel7->CPAR = (uint32_t)&USART2->DR;
- DMA1_Channel7->CMAR = (uint32_t)data;
- DMA1_Channel7->CNDTR = (uint16_t)num;
- DMA1_Channel7->CCR |= DMA_CCR7_EN;
- }
- void DMA1_Channel7_IRQHandler(void)
- {
- uint32_t isr = DMA1->ISR;
- DMA1->IFCR = DMA_IFCR_CGIF7;
- if(isr & (DMA_ISR_TEIF7|DMA_ISR_TCIF7)){
- DMA1_Channel7->CCR = 0;
- USART_ITConfig(USART2, USART_IT_TC, ENABLE);
- }
- }
- void USART2_IRQHandler(void)
- {
- // 最后一字节发送完成中断
- if((USART2->CR1 & USART_CR1_TCIE) && (USART2->SR & USART_SR_TC)){
- USART_ITConfig(USART2, USART_IT_TC, DISABLE);
- is_tx_busy = 0;
- // 至此,最后一字节也发送完成了
- }
- }
复制代码代码中更新is_tx_busy变量的地方,对应某些应用种RS485切换方向的地方。
一周热门 更多>