打印
[技术问答]

串口是如何指定引脚的

[复制链接]
4850|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
那串口0的发送脚来说

是不是说,这么多的引脚,都可以作为发送脚?

而在串口初始化的时候,
貌似只使用了一个函数就可以了

/**
*    [url=home.php?mod=space&uid=247401]@brief[/url]        Open and set UART function
*
*    @param[in]    uart            The pointer of the specified UART module.
*    @param[in]    u32baudrate     The baudrate of UART module.
*
*    [url=home.php?mod=space&uid=266161]@return[/url]       None
*
*    [url=home.php?mod=space&uid=1543424]@Details[/url]      This function use to enable UART function and set baud-rate.
*/
void UART_Open(UART_T* uart, uint32_t u32baudrate)
{
    uint32_t u32UartClkSrcSel=0ul, u32UartClkDivNum=0ul;
    uint32_t u32ClkTbl[4] = {__HXT, 0ul, __LXT, __HIRC};
    uint32_t u32Baud_Div = 0ul;


    if(uart==(UART_T*)UART0)
    {
        /* Get UART clock source selection */
        u32UartClkSrcSel = ((uint32_t)(CLK->CLKSEL1 & CLK_CLKSEL1_UART0SEL_Msk)) >> CLK_CLKSEL1_UART0SEL_Pos;
        /* Get UART clock divider number */
        u32UartClkDivNum = (CLK->CLKDIV0 & CLK_CLKDIV0_UART0DIV_Msk) >> CLK_CLKDIV0_UART0DIV_Pos;
    }
    else if(uart==(UART_T*)UART1)
    {
        /* Get UART clock source selection */
        u32UartClkSrcSel = (CLK->CLKSEL1 & CLK_CLKSEL1_UART1SEL_Msk) >> CLK_CLKSEL1_UART1SEL_Pos;
        /* Get UART clock divider number */
        u32UartClkDivNum = (CLK->CLKDIV0 & CLK_CLKDIV0_UART1DIV_Msk) >> CLK_CLKDIV0_UART1DIV_Pos;
    }
    else if(uart==(UART_T*)UART2)
    {
        /* Get UART clock source selection */
        u32UartClkSrcSel = (CLK->CLKSEL3 & CLK_CLKSEL3_UART2SEL_Msk) >> CLK_CLKSEL3_UART2SEL_Pos;
        /* Get UART clock divider number */
        u32UartClkDivNum = (CLK->CLKDIV4 & CLK_CLKDIV4_UART2DIV_Msk) >> CLK_CLKDIV4_UART2DIV_Pos;
    }
    else if(uart==(UART_T*)UART3)
    {
        /* Get UART clock source selection */
        u32UartClkSrcSel = (CLK->CLKSEL3 & CLK_CLKSEL3_UART3SEL_Msk) >> CLK_CLKSEL3_UART3SEL_Pos;
        /* Get UART clock divider number */
        u32UartClkDivNum = (CLK->CLKDIV4 & CLK_CLKDIV4_UART3DIV_Msk) >> CLK_CLKDIV4_UART3DIV_Pos;
    }
    else if(uart==(UART_T*)UART4)
    {
        /* Get UART clock source selection */
        u32UartClkSrcSel = (CLK->CLKSEL3 & CLK_CLKSEL3_UART4SEL_Msk) >> CLK_CLKSEL3_UART4SEL_Pos;
        /* Get UART clock divider number */
        u32UartClkDivNum = (CLK->CLKDIV4 & CLK_CLKDIV4_UART4DIV_Msk) >> CLK_CLKDIV4_UART4DIV_Pos;
    }
    else if(uart==(UART_T*)UART5)
    {
        /* Get UART clock source selection */
        u32UartClkSrcSel = (CLK->CLKSEL3 & CLK_CLKSEL3_UART5SEL_Msk) >> CLK_CLKSEL3_UART5SEL_Pos;
        /* Get UART clock divider number */
        u32UartClkDivNum = (CLK->CLKDIV4 & CLK_CLKDIV4_UART5DIV_Msk) >> CLK_CLKDIV4_UART5DIV_Pos;
    }

    /* Select UART function */
    uart->FUNCSEL = UART_FUNCSEL_UART;

    /* Set UART line configuration */
    uart->LINE = UART_WORD_LEN_8 | UART_PARITY_NONE | UART_STOP_BIT_1;

    /* Set UART Rx and RTS trigger level */
    uart->FIFO &= ~(UART_FIFO_RFITL_Msk | UART_FIFO_RTSTRGLV_Msk);

    /* Get PLL clock frequency if UART clock source selection is PLL */
    if(u32UartClkSrcSel == 1ul)
    {
        u32ClkTbl[u32UartClkSrcSel] = CLK_GetPLLClockFreq();
    }
    else
    {
    }
    /* Set UART baud rate */
    if(u32baudrate != 0ul)
    {
        u32Baud_Div = UART_BAUD_MODE2_DIVIDER((u32ClkTbl[u32UartClkSrcSel]) / (u32UartClkDivNum + 1ul), u32baudrate);

        if(u32Baud_Div > 0xFFFFul)
        {
            uart->BAUD = (UART_BAUD_MODE0 | UART_BAUD_MODE0_DIVIDER((u32ClkTbl[u32UartClkSrcSel]) / (u32UartClkDivNum + 1ul), u32baudrate));
        }
        else
        {
            uart->BAUD = (UART_BAUD_MODE2 | u32Baud_Div);
        }
    }
}

那么,是哪里指定的引脚呢?

使用特权

评论回复
沙发
jasontu| | 2021-8-16 14:20 | 只看该作者
在system initial,有指定gpio 初始化功能脚的定义

使用特权

评论回复
板凳
match007|  楼主 | 2021-8-16 15:14 | 只看该作者
jasontu 发表于 2021-8-16 14:20
在system initial,有指定gpio 初始化功能脚的定义
  /*----------------------------------------------------------------------*/
    /* Init I/O Multi-function                                              */
    /*----------------------------------------------------------------------*/
    /* Set GPB multi-function pins for UART0 RXD and TXD */
    SYS->GPB_MFPH = (SYS->GPB_MFPH & ~(SYS_GPB_MFPH_PB12MFP_Msk | SYS_GPB_MFPH_PB13MFP_Msk)) |
                    (SYS_GPB_MFPH_PB12MFP_UART0_RXD | SYS_GPB_MFPH_PB13MFP_UART0_TXD);


你是说的这里么?

使用特权

评论回复
地板
match007|  楼主 | 2021-8-16 15:30 | 只看该作者
jasontu 发表于 2021-8-16 14:20
在system initial,有指定gpio 初始化功能脚的定义

我试了一下,感谢!!

使用特权

评论回复
5
skyred| | 2021-8-17 12:20 | 只看该作者
时钟和IO配置,都在系统初始化里
这个和习惯了ST的人,难受,这个也可以按自己的习惯去处理。

使用特权

评论回复
6
xiaoqizi| | 2021-9-10 15:38 | 只看该作者
这个不需要指定吧

使用特权

评论回复
7
一刀一级| | 2021-9-10 16:13 | 只看该作者
这个需要指定吗

使用特权

评论回复
8
kiwis66| | 2021-9-13 11:27 | 只看该作者
是的,新唐的例程在系统初始化里,初始化时钟和外设。
串口初始化的时候,就剩下波特率之类的了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

97

主题

607

帖子

1

粉丝