风子 发表于 2016-9-27 09:21:10

andrewz 发表于 2016-9-27 09:17
这么复杂,还要用DMA...
DMA不是会占用数据总线吗?

呵呵,频繁进中断,计算不受影响才怪了

andrewz 发表于 2016-9-27 09:24:14

风子 发表于 2016-9-27 09:21
呵呵,频繁进中断,计算不受影响才怪了

哦,这样,一次发送十几个字节,确实也可以算得上是比较频繁了.
用DMA试试了..
DMA,貌似很复杂的..

高二毛 发表于 2016-9-27 10:19:25

贴个代码,大家看看吧。都分析学习一下。

andrewz 发表于 2016-9-27 11:57:14

风子 发表于 2016-9-27 09:21
呵呵,频繁进中断,计算不受影响才怪了

修改成DMA之后,确实没有再出现#1.QNAN问题.
原本以为MCU会非常勤劳的切换,现在看,也有累趴下的时候。。:lol

andrewz 发表于 2016-9-27 13:52:04

坑又来了,开了DMA之后,发数据正常了,之前的用USART_CR1_RXNEIE的接收数据中断没响应了.

andrewz 发表于 2016-9-27 13:58:23

而且DMA的时钟在使能之后不能立即操作,要等个一会儿.不然DMA发送也不能正常工作.
:lol
越来越欢乐了.

andrewz 发表于 2016-9-27 14:21:10

是我错怪051K8了.刚才串口接线RX端口掉下来了.线没接好自然无法使用.

andrewz 发表于 2016-9-27 14:22:33

下面贴程序了.

unsigned char g_o_buf_0;

void Uart::init_UART1(void){
    SET_BIT(RCC->APB2ENR,RCC_APB2ENR_USART1EN);
    SET_BIT(RCC->AHBENR,RCC_AHBENR_GPIOAEN);
    GPIOA->AFR|=(1<<4)|(1<<8);
    GPIOA->PUPDR|=GPIO_PUPDR_PUPDR9_0|GPIO_PUPDR_PUPDR10_0;
    GPIOA->OSPEEDR|=GPIO_OSPEEDR_OSPEEDR9|GPIO_OSPEEDR_OSPEEDR10;
    GPIOA->MODER|=GPIO_MODER_MODER9_1|GPIO_MODER_MODER10_1;
    USART1->BRR=F_CPU/UART1_BAUDRATE;
    NVIC_EnableIRQ(USART1_IRQn);
    SET_BIT(USART1->CR1,USART_CR1_RE|USART_CR1_TE|USART_CR1_RXNEIE|USART_CR1_UE);
    Dma::config(DMA1_Channel2,(unsigned long)&USART1->TDR,(unsigned long)g_o_buf_0);
}


extern "C"{
    void DMA1_Channel2_3_IRQHandler(void){
      while(CHK_BIT(USART1->ISR,USART_ISR_TC));
      SET_BIT(DMA1->IFCR,DMA_IFCR_CGIF2);
      CLR_BIT(DMA1_Channel2->CCR,DMA_CCR_EN);
      CLR_BIT(USART1->CR3,USART_CR3_DMAT);
    }
}


void Dma::config(
    DMA_Channel_TypeDef *dma_chx,
    unsigned long periphera_address,
    unsigned long memory_address
){
        SET_BIT(RCC->AHBENR,RCC_AHBENR_DMAEN);
    Timer::delay_stuck(1000);
        dma_chx->CPAR=periphera_address;    //DMA1 ÍâÉèµØÖ·
        dma_chx->CMAR=memory_address;       //DMA1,´æ´¢Æ÷µØÖ·
        SET_REG(dma_chx->CCR,DMA_CCR_PL_0|DMA_CCR_MINC|DMA_CCR_DIR|DMA_CCR_TCIE);
    SET_BIT(DMA1->IFCR,DMA_IFCR_CGIF2);
    NVIC_EnableIRQ(DMA1_Channel2_3_IRQn);
}

void Dma::enable(DMA_Channel_TypeDef *dma_chx,unsigned short size){
        dma_chx->CNDTR=size;                //DMA1,´«ÊäÊý¾ÝÁ¿
    SET_REG(USART1->CR3,USART_CR3_DMAT);
    SET_BIT(dma_chx->CCR,DMA_CCR_EN);
}


andrewz 发表于 2016-9-27 17:49:46

还是有问题,在接收与发送之间来回转换几次,DMA会有几次中断不进去.

zbber 发表于 2016-9-27 23:44:22

用DMA发送吧
页: 1 [2] 3 4 5
查看完整版本: 【STM32F051K8U6】串口中断发送数据影响float运算.