查看: 8083|回复: 8

LPUART1时钟问题!!用LS时钟波特率不对!

[复制链接]

11

主题

22

帖子

135

积分

中级工程师

Rank: 2

积分
135
发表于 2021-6-30 17:07:24 | 显示全部楼层 |阅读模式
void MF_LPUART1_Init(uint32_t BaudRate)//LPUART0初始化函数
{

    FL_GPIO_InitTypeDef    GPIO_InitStruct;
    NVIC_ConfigTypeDef    InterruptConfigStruct;
    FL_LPUART_InitTypeDef    defaultInitStruct;

    GPIO_InitStruct.pin = LP_UART1_RX_TX;
    GPIO_InitStruct.mode = FL_GPIO_MODE_DIGITAL;
    GPIO_InitStruct.outputType = FL_GPIO_OUTPUT_PUSHPULL;
    GPIO_InitStruct.pull = FL_ENABLE;
    GPIO_InitStruct.remapPin = FL_ENABLE;

    FL_GPIO_Init( LP_UART1_GPIO_Port, &GPIO_InitStruct );

    defaultInitStruct.clockSrc = FL_RCC_LPUART_CLK_SOURCE_LSCLK;
                switch(BaudRate)
                {
                        case 9600: defaultInitStruct.baudRate = FL_LPUART_BAUDRATE_9600; break;               
                        case 4800: defaultInitStruct.baudRate = FL_LPUART_BAUDRATE_4800; break;       
                        case 2400: defaultInitStruct.baudRate = FL_LPUART_BAUDRATE_2400; break;       
                        case 1200: defaultInitStruct.baudRate = FL_LPUART_BAUDRATE_1200; break;       
                        case 600 : defaultInitStruct.baudRate = FL_LPUART_BAUDRATE_600 ; break;       
                        case 300 : defaultInitStruct.baudRate = FL_LPUART_BAUDRATE_300 ; break;       
                        default  : break;                                                                      
                }
    defaultInitStruct.dataWidth = FL_LPUART_DATA_WIDTH_8B;
    defaultInitStruct.stopBits = FL_LPUART_STOP_BIT_WIDTH_1B;
    defaultInitStruct.parity = FL_LPUART_PARITY_NONE;
    defaultInitStruct.transferDirection = FL_LPUART_DIRECTION_TX_RX;

    FL_LPUART_Init(LPUART1,&defaultInitStruct );

    InterruptConfigStruct.preemptPriority = 0x02;   //设定中断优先级
    NVIC_Init(&InterruptConfigStruct,LPUART1_IRQn );//初始化中断功能
       
    FL_LPUART_EnableIT_RXBuffFull(LPUART1 );//启用UART接收缓冲区溢出中断

}

这是LPUART1初始化 时钟用的是LSCLK,结果波特率就不对(程序9600但是串口助手14400才能显示成功),如果用RCHF波特率就对,9600匹配,之前画的一版电路也是用这PB13 PB14,就没遇到这样问题,请问电路哪里可能引起这样的问题?

回复

使用道具 举报

154

主题

846

帖子

4624

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4624
发表于 2021-7-1 09:25:24 | 显示全部楼层
1、Vdd15引脚不对,量下应该是1.5V左右
2、 xtlf晶振不对,用fout引脚输出lsclk  看下是不是 32768. fout输出函数在user_init.c里有,自己改下输出
回复

使用道具 举报

11

主题

22

帖子

135

积分

中级工程师

Rank: 2

积分
135
 楼主| 发表于 2021-7-1 10:40:11 | 显示全部楼层
顾博文 发表于 2021-7-1 09:25
1、Vdd15引脚不对,量下应该是1.5V左右
2、 xtlf晶振不对,用fout引脚输出lsclk  看下是不是 32768. fout输 ...

没有用到外置晶振32768,测试了一下VDD15是1.5V
回复

使用道具 举报

11

主题

22

帖子

135

积分

中级工程师

Rank: 2

积分
135
 楼主| 发表于 2021-7-1 11:05:35 | 显示全部楼层
顾博文 发表于 2021-7-1 09:25
1、Vdd15引脚不对,量下应该是1.5V左右
2、 xtlf晶振不对,用fout引脚输出lsclk  看下是不是 32768. fout输 ...

LSCLK和XTLF不是一个时钟吧!
回复

使用道具 举报

3

主题

19

帖子

498

积分

高级工程师

Rank: 3Rank: 3

积分
498
发表于 2021-7-2 13:52:06 | 显示全部楼层
橘子洲头 发表于 2021-7-1 11:05
LSCLK和XTLF不是一个时钟吧!

xtlf是lsclk的来源之一。看程序配置的用的是xtlf还是lposc
回复

使用道具 举报

154

主题

846

帖子

4624

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4624
发表于 2021-7-2 14:59:00 | 显示全部楼层
橘子洲头 发表于 2021-7-1 11:05
LSCLK和XTLF不是一个时钟吧!

lsclk就是 rclp与xtlf。优先xtlf,如果xtlf停振,自动切换rclp
回复

使用道具 举报

11

主题

22

帖子

135

积分

中级工程师

Rank: 2

积分
135
 楼主| 发表于 2021-7-3 10:40:55 | 显示全部楼层
void SystemInit (void)
{
    uint32_t temp;
   
    /*  */
    RCC->PLLCR = (uint32_t)0x00000000U;
    RCC->SYSCLKCR = (uint32_t)0x0A000000U;
     /* PAD RCC*/
    RCC->PCLKCR1 |=  (0x1U << 7U);
    #ifdef         USE_LSCLK_CLOCK_SRC_XTLF           
        GPIOD->FCR |= 0x3C0000;
        /* XTLF*/
        RCC->XTLFCR  = (uint32_t)(0x00000000U);
        /* XTLF*/
        RCC->XTLFCR  |= (uint32_t)(0x00000005U<<8);
        for(temp = 2000;temp>0;temp--);
        /* LSCLKXTLF*/
        color=Red]RCC->LSCLKSEL = 0xAA;
        /* LSCXTLF*/
        RCC->SYSCLKCR |= 0x8000000U;
    #else
        RCC->SYSCLKCR &= 0x7FFFFFFU;
        RCC->LSCLKSEL = 0x55;
    #endif
    /*PDR*/
    RMU->PDRCR |=0x01;
    /*BOR*/
    RMU->BORCR &=0xFE;
   
    /* DEBUG IWDT WWDT */
    DBG->CR =0x03;
   
    RCC->RCHFTR = RCHF8M_TRIM;
    RCC->RCMFTR = RCMF4M_TRIM;
    RCC->LPOSCTR = LPOSC_TRIM;
   
    GPIOD->PUEN |= 0x3 << 7;
   
    /* DMA Flash Channel: Flash->RAM */
    RCC->PCLKCR2 |= 0x1 << 4;
    DMA->CH7CR |= 0x1 << 10;
    RCC->PCLKCR2 &= ~(0x1 << 4);
}
这个RCC->LSCLKSEL = 0xAA;就是修改这个来设置LS和XT的吧,请问这个函数是不是系统上来就会调用,这个里面很多0x00000000U的配置看的不是很懂,能解释一下吗
回复

使用道具 举报

154

主题

846

帖子

4624

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4624
发表于 2021-7-5 15:48:26 | 显示全部楼层
橘子洲头 发表于 2021-7-3 10:40
void SystemInit (void)
{
    uint32_t temp;

这个函数最好不要去修改。就是一些必要的寄存器的配置,不加说明就是不想让人去乱改。结合手册里的寄存器。也应该能看动。要修改功能请到 用户初始化的函数里去修改
回复

使用道具 举报

11

主题

22

帖子

135

积分

中级工程师

Rank: 2

积分
135
 楼主| 发表于 2021-7-14 16:43:25 | 显示全部楼层
顾博文 发表于 2021-7-5 15:48
这个函数最好不要去修改。就是一些必要的寄存器的配置,不加说明就是不想让人去乱改。结合手册里的寄存器 ...

请问FM33LC023N的唤醒时间是多少?从sleep模式睡眠到GPIO外部中断唤醒。有50ms?
回复

使用道具 举报

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

本版积分规则

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