牛卧堂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