OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3112|回复: 0

关于串口1用DMA发送的问题,请高手指点一下,谢谢

[复制链接]

9

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
97
金钱
97
注册时间
2014-10-19
在线时间
12 小时
发表于 2016-1-23 19:11:42 | 显示全部楼层 |阅读模式
1金钱
在主程1秒中的定时任务中发送串口数据,总是发不出去,查了DMA_ISR中的标志发现TEIF4和GIF4都为1,不知道是哪里出了问题,请高手指点一下,谢谢
void        uart1_init(u32 pclk2)
{
        float temp;
        u16 mantissa;
        u16 fraction;          
        temp=(float)(pclk2*1000000)/(9600*16);//得到USARTDIV
        mantissa=temp;                                 //得到整数部分
        fraction=(temp-mantissa)*16; //得到小数部分         
        mantissa<<=4;
        mantissa+=fraction;
        RCC->APB2ENR|=1<<2;   //使能PORTA口时钟  
        RCC->APB2ENR|=1<<14;  //使能串口1时钟
        GPIOA->CRH&=0XFFFFF00F;
        GPIOA->CRH|=0X000008B0;//IO状态设置
                  
        RCC->APB2RSTR|=1<<14;   //复位串口1
        RCC->APB2RSTR&=~(1<<14);//停止复位                     
        //波特率设置
        USART1->BRR=mantissa; // 波特率设置         
        USART1->CR1|=0X200C;  //1位停止,无校验位.                  
i
//#ifdef EN_USART1_RX                  //如果使能了接收
        //使能接收中断
        USART1->CR1|=1<<8;    //tc中断使能
        USART1->CR1|=1<<5;    //接收缓冲区非空中断使能       
//        USART1->CR1&=~(1<<6);         //TCIE为0
        //USART1->CR1|=1<<7;          //TXEIE为1           
        MY_NVIC_Init(3,3,USART1_IRQChannel,2);//组2,最低优先级
        /*以下两行代码的目的是为了清除发送中断使能后USART1的pending*/
//        NVIC_Pending_Clr(USART1_IRQChannel);
//        USART1->SR &= (~(1<<6));
//#endif       
}

void        HardWare_Init()
{
        //uart_init(72,9600); //串口1初始
        uart1_init(72);//串口1
        MYDMA_Config(DMA1_Channel4,(u32)&USART1->DR,(u32)Uart[0].TXBUF,UARTTXDBUFFERLEN);//DMA1通道4,外设为串口1,存储器为SendBuff,长度5200.
//        uart2_init(72);//串口2
//        MYDMA_Config(DMA1_Channel7,(u32)&USART2->DR,(u32)Uart[1].TXBUF,UARTTXDBUFFERLEN);//DMA1通道4,外设为串口1,存储器为SendBuff,长度5200.
//        uart3_init(72);//串口3
//        MYDMA_Config(DMA1_Channel2,(u32)&USART3->DR,(u32)Uart[2].TXBUF,UARTTXDBUFFERLEN);//DMA1通道4,外设为串口1,存储器为SendBuff,长度5200.
}


void        Uart0Debug()
{

        memcpy(&Uart[0].TXBUF[0],&SoftTimer[0],7);                                       
        Uart[0].Txdlen=7;
        Uart[0].Txdpoint=0;
        USART1->CR3=1<<7;//使能串口1的DMA发送
        DMA1_MEM_LEN = Uart[0].Txdlen;
        MYDMA_Enable(DMA1_Channel4);//开始一次DMA传输!

}




正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-14 05:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表