牛卧堂MCU技术交流

标题: M451LCM3AE开PWM后..串口1/2/3都不能正确接收数据 [打印本页]

作者: 匿名    时间: 2019-3-14 03:17
标题: M451LCM3AE开PWM后..串口1/2/3都不能正确接收数据
M451LCM3AE开PWM后..串口1/2/3都不能正确接收数据

作者: admin    时间: 2019-3-14 09:22
请详细 描述你的问题,贴上你的代码
作者: 匿名    时间: 2019-3-14 15:21
工程使用UART0  UART1  PWM0CH_0功能模块,串口波特率250000K..
代码如下,在软件串口中断函数什么都不变化的情况下,使用UART0就完全正常,,使用UART123就错误

void PWM_Init(void){                                                  // PWM进行初始化
CLK_EnableModuleClock(PWM0_MODULE);                                   //允许PWM1模块时钟
CLK_SetModuleClock(PWM0_MODULE, CLK_CLKSEL2_PWM0SEL_PLL, 0);          //设置PWM1时钟为PCLK
SYS_ResetModule(PWM0_RST);
/* Set PC multi-function pins for PWM0 Channel0~5 */
SYS->GPC_MFPL = (SYS->GPC_MFPL & (~SYS_GPC_MFPL_PC0MFP_Msk));
SYS->GPC_MFPL |= SYS_GPC_MFPL_PC0MFP_PWM0_CH0;
PWM_ConfigOutputChannel(PWM0, 0, 18000, 50);  
PWM_EnableOutput(PWM0, PWM_CH_0_MASK );
}

void UART1_Init(void)                                                                  //串口1初始化
{
    SYS->GPB_MFPL &= ~(SYS_GPB_MFPL_PB2MFP_Msk | SYS_GPB_MFPL_PB3MFP_Msk);
    SYS->GPB_MFPL |= (SYS_GPB_MFPL_PB2MFP_UART1_RXD | SYS_GPB_MFPL_PB3MFP_UART1_TXD);
    SYS_ResetModule(UART1_RST);                                                        //复位串口1
    CLK_EnableModuleClock(UART1_MODULE);                                               //允许串口1模块时钟
    CLK_SetModuleClock(UART1_MODULE, CLK_CLKSEL1_UARTSEL_PLL, CLK_CLKDIV0_UART(1));    //设置串口1时钟为PCLK
    UART_EnableInt(UART1, (UART_INTEN_RDAIEN_Msk | UART_INTEN_RLSIEN_Msk  ));          //允许接收中断 允许线中断
        UART1->FIFO |= UART_FIFO_RFITL_14BYTES;//;;  UART_FIFO_RFITL_1BYTE
        UART_SetLine_Config(UART1,250000,UART_WORD_LEN_8,UART_PARITY_NONE,UART_STOP_BIT_2);
        NVIC_EnableIRQ(UART1_IRQn);
        NVIC_SetPriority(UART1_IRQn, 0); //中断优先级  
}


void UART1_IRQHandler(void)
{
static uint8_t UART1data=0;   
static u32  RX1data;       

        if ((UART1->INTSTS & UART_INTSTS_RLSIF_Msk) )     // 帧错误
        {
                UART1->FIFOSTS |= (UART_FIFOSTS_FEF_Msk | UART_FIFOSTS_PEF_Msk | UART_FIFOSTS_BIF_Msk);  // 清除中断标志
                uart1_receive_point = 0;
                UART1data = (uint8_t)UART1->DAT;
        }       
        else //if(UART1->INTSTS & UART_INTSTS_RDAINT_Msk)
        {   
                while ((UART1->FIFOSTS & UART_FIFOSTS_RXEMPTY_Msk) == 0)        // 将FIFO 内数据读取完
                {
                UART1data = (uint8_t)UART1->DAT;
                if(uart1_receive_point < 60)
                        {  
                        uart1_Internal.uart1_buf[uart1_receive_point] = UART1data; //数据保存到数组里
                        uart1_receive_point++;
                        }
                }
        }
}



int32_t main(void)
{
    SYS_UnlockReg();                    //解锁,准备修改芯片内部寄存器
    SYS_Init();                         //芯片初始化,主要是对时钟寄存器的修改  
                SYS_LockReg();                    
                Uart_Init();         
                UART1_Init();           //串口1初始化
         //PWM_Init();                  // PWM进行初始化   +++++++++++++++++只要开这个PMW初始化 UART1/2/3接收数据就出错+++++++但是UART0是正确的
                        
   while(1);
}
作者: 匿名    时间: 2019-3-14 15:21
工程使用UART0  UART1  PWM0CH_0功能模块,串口波特率250000K..
代码如下,在软件串口中断函数什么都不变化的情况下,使用UART0就完全正常,,使用UART123就错误

void PWM_Init(void){                                                  // PWM进行初始化
CLK_EnableModuleClock(PWM0_MODULE);                                   //允许PWM1模块时钟
CLK_SetModuleClock(PWM0_MODULE, CLK_CLKSEL2_PWM0SEL_PLL, 0);          //设置PWM1时钟为PCLK
SYS_ResetModule(PWM0_RST);
/* Set PC multi-function pins for PWM0 Channel0~5 */
SYS->GPC_MFPL = (SYS->GPC_MFPL & (~SYS_GPC_MFPL_PC0MFP_Msk));
SYS->GPC_MFPL |= SYS_GPC_MFPL_PC0MFP_PWM0_CH0;
PWM_ConfigOutputChannel(PWM0, 0, 18000, 50);  
PWM_EnableOutput(PWM0, PWM_CH_0_MASK );
}

void UART1_Init(void)                                                                  //串口1初始化
{
    SYS->GPB_MFPL &= ~(SYS_GPB_MFPL_PB2MFP_Msk | SYS_GPB_MFPL_PB3MFP_Msk);
    SYS->GPB_MFPL |= (SYS_GPB_MFPL_PB2MFP_UART1_RXD | SYS_GPB_MFPL_PB3MFP_UART1_TXD);
    SYS_ResetModule(UART1_RST);                                                        //复位串口1
    CLK_EnableModuleClock(UART1_MODULE);                                               //允许串口1模块时钟
    CLK_SetModuleClock(UART1_MODULE, CLK_CLKSEL1_UARTSEL_PLL, CLK_CLKDIV0_UART(1));    //设置串口1时钟为PCLK
    UART_EnableInt(UART1, (UART_INTEN_RDAIEN_Msk | UART_INTEN_RLSIEN_Msk  ));          //允许接收中断 允许线中断
        UART1->FIFO |= UART_FIFO_RFITL_14BYTES;//;;  UART_FIFO_RFITL_1BYTE
        UART_SetLine_Config(UART1,250000,UART_WORD_LEN_8,UART_PARITY_NONE,UART_STOP_BIT_2);
        NVIC_EnableIRQ(UART1_IRQn);
        NVIC_SetPriority(UART1_IRQn, 0); //中断优先级  
}


void UART1_IRQHandler(void)
{
static uint8_t UART1data=0;   
static u32  RX1data;       

        if ((UART1->INTSTS & UART_INTSTS_RLSIF_Msk) )     // 帧错误
        {
                UART1->FIFOSTS |= (UART_FIFOSTS_FEF_Msk | UART_FIFOSTS_PEF_Msk | UART_FIFOSTS_BIF_Msk);  // 清除中断标志
                uart1_receive_point = 0;
                UART1data = (uint8_t)UART1->DAT;
        }       
        else //if(UART1->INTSTS & UART_INTSTS_RDAINT_Msk)
        {   
                while ((UART1->FIFOSTS & UART_FIFOSTS_RXEMPTY_Msk) == 0)        // 将FIFO 内数据读取完
                {
                UART1data = (uint8_t)UART1->DAT;
                if(uart1_receive_point < 60)
                        {  
                        uart1_Internal.uart1_buf[uart1_receive_point] = UART1data; //数据保存到数组里
                        uart1_receive_point++;
                        }
                }
        }
}



int32_t main(void)
{
    SYS_UnlockReg();                    //解锁,准备修改芯片内部寄存器
    SYS_Init();                         //芯片初始化,主要是对时钟寄存器的修改  
                SYS_LockReg();                    
                Uart_Init();         
                UART1_Init();           //串口1初始化
         //PWM_Init();                  // PWM进行初始化   +++++++++++++++++只要开这个PMW初始化 UART1/2/3接收数据就出错+++++++但是UART0是正确的
                        
   while(1);
}
作者: 匿名    时间: 2019-3-23 23:16
我已经办法都想尽了.还和另外的工程师一起按自己能想到的方法修改PWM和UART初始化.都还是不行,,,,,




欢迎光临 牛卧堂MCU技术交流 (http://nuvoton-mcu.com/) Powered by Discuz! X3.2