怎么H743用中断方式进行串口发送,程序会不工作

2019-07-20 00:51发布

因为要用STM32H743做4个串口的同时通信,查询发送的方式速度太慢了,所以打算采用中断方式进行发送。可是打开发送中断后,程序完全不工作,查了好久,实在是搞不清楚了,哪位高手能否帮帮忙,看看我的串口初始化哪里错了。谢谢了。
程序如下

//串口中断处理
void USART1_IRQHandler(void)
{
        if(USART1->ISR&(1<<5))                                                                        // 接收到数据
        {
                u8a_RecvBuf1[u8_RecvBufPoint1]=USART1->RDR;                        // 将接收数据保存进缓冲区中
                u8_RecvBufPoint1++;                                                                        // 接收缓冲区指针加1
                if(u8_RecvBufPoint1>26)
                        u8_RecvBufPoint1=26;                                                        // 最大接收数据是26个字节          

                u8_CommRecvTime1=3;                                                                // 延时3ms进行处理
        }                                                                                 

        if(USART1->ISR&(1<<6))                                                                        // 发送结束中断
        {
                USART1->ISR&=0<<6;                                                                    // 清发送中断标志                   
                if(u8_SendNum1)
                {
                        u8_SendNum1--;
                        USART1->TDR=u8a_SendBuf1[u8_SendBufPoint1++];
                }
        }

        USART1->ICR|=1<<3;        //清除溢出错误,否则可能会卡死在串口中断服务函数里面
}


//初始化IO 串口1
//pclk2CLK2时钟频率(Mhz)
//注意:USART1的时钟,是可以通过RCC_D2CCIP2R选择的
//但是我们一般用默认的选择即可(默认选择rcc_pclk2作为串口1时钟)
//pclk2即APB2的时钟频率,一般为100Mhz
//bound:波特率
void uart_init(u32 pclk2,u32 bound)
{           
        u32        temp;          

        temp=(pclk2*1000000+bound/2)/bound;        //得到USARTDIV@OVER8=0,采用四舍五入计算

        RCC->APB2ENR|=1<<4;          //使能串口1时钟

        GPIO_Set(GPIOB,PIN14|PIN15,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_MID,GPIO_PUPD_PU);//PB14,PB15,复用功能,上拉输出
        GPIO_AF_Set(GPIOB,14,4);        //PB14,AF4
        GPIO_AF_Set(GPIOB,15,4);        //PB15,AF4            

        //波特率设置
        USART1->BRR=temp;                 //波特率设置@OVER8=0        

        USART1->CR1=0;                         //清零CR1寄存器

        USART1->CR1|=0<<28;                 //设置M1=0
        USART1->CR1|=0<<12;                 //设置M0=0&M1=0,选择8位字长
        USART1->CR1|=0<<15;         //设置OVER8=0,16倍过采样
        USART1->CR1|=1<<3;          //串口发送使能
        USART1->CR1|=1<<2;          //串口接收使能

        USART1->CR1|=1<<5;            //接收缓冲区非空中断使能                   
        USART1->CR1|=1<<6;            //发送数据寄存器为空中断使能                    当打开这一行,即打开发送中断后,程序就不工作了
        MY_NVIC_Init(3,3,USART1_IRQn,2);//组2,最低优先级
        USART1->CR1|=1<<0;          //串口使能

}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。