[技术问答] 串口是如何指定引脚的

[复制链接]
5799|7
 楼主| match007 发表于 2021-8-16 13:50 | 显示全部楼层 |阅读模式
那串口0的发送脚来说
95226119fc0031b7d.png
是不是说,这么多的引脚,都可以作为发送脚?

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

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


  16.     if(uart==(UART_T*)UART0)
  17.     {
  18.         /* Get UART clock source selection */
  19.         u32UartClkSrcSel = ((uint32_t)(CLK->CLKSEL1 & CLK_CLKSEL1_UART0SEL_Msk)) >> CLK_CLKSEL1_UART0SEL_Pos;
  20.         /* Get UART clock divider number */
  21.         u32UartClkDivNum = (CLK->CLKDIV0 & CLK_CLKDIV0_UART0DIV_Msk) >> CLK_CLKDIV0_UART0DIV_Pos;
  22.     }
  23.     else if(uart==(UART_T*)UART1)
  24.     {
  25.         /* Get UART clock source selection */
  26.         u32UartClkSrcSel = (CLK->CLKSEL1 & CLK_CLKSEL1_UART1SEL_Msk) >> CLK_CLKSEL1_UART1SEL_Pos;
  27.         /* Get UART clock divider number */
  28.         u32UartClkDivNum = (CLK->CLKDIV0 & CLK_CLKDIV0_UART1DIV_Msk) >> CLK_CLKDIV0_UART1DIV_Pos;
  29.     }
  30.     else if(uart==(UART_T*)UART2)
  31.     {
  32.         /* Get UART clock source selection */
  33.         u32UartClkSrcSel = (CLK->CLKSEL3 & CLK_CLKSEL3_UART2SEL_Msk) >> CLK_CLKSEL3_UART2SEL_Pos;
  34.         /* Get UART clock divider number */
  35.         u32UartClkDivNum = (CLK->CLKDIV4 & CLK_CLKDIV4_UART2DIV_Msk) >> CLK_CLKDIV4_UART2DIV_Pos;
  36.     }
  37.     else if(uart==(UART_T*)UART3)
  38.     {
  39.         /* Get UART clock source selection */
  40.         u32UartClkSrcSel = (CLK->CLKSEL3 & CLK_CLKSEL3_UART3SEL_Msk) >> CLK_CLKSEL3_UART3SEL_Pos;
  41.         /* Get UART clock divider number */
  42.         u32UartClkDivNum = (CLK->CLKDIV4 & CLK_CLKDIV4_UART3DIV_Msk) >> CLK_CLKDIV4_UART3DIV_Pos;
  43.     }
  44.     else if(uart==(UART_T*)UART4)
  45.     {
  46.         /* Get UART clock source selection */
  47.         u32UartClkSrcSel = (CLK->CLKSEL3 & CLK_CLKSEL3_UART4SEL_Msk) >> CLK_CLKSEL3_UART4SEL_Pos;
  48.         /* Get UART clock divider number */
  49.         u32UartClkDivNum = (CLK->CLKDIV4 & CLK_CLKDIV4_UART4DIV_Msk) >> CLK_CLKDIV4_UART4DIV_Pos;
  50.     }
  51.     else if(uart==(UART_T*)UART5)
  52.     {
  53.         /* Get UART clock source selection */
  54.         u32UartClkSrcSel = (CLK->CLKSEL3 & CLK_CLKSEL3_UART5SEL_Msk) >> CLK_CLKSEL3_UART5SEL_Pos;
  55.         /* Get UART clock divider number */
  56.         u32UartClkDivNum = (CLK->CLKDIV4 & CLK_CLKDIV4_UART5DIV_Msk) >> CLK_CLKDIV4_UART5DIV_Pos;
  57.     }

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

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

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

  64.     /* Get PLL clock frequency if UART clock source selection is PLL */
  65.     if(u32UartClkSrcSel == 1ul)
  66.     {
  67.         u32ClkTbl[u32UartClkSrcSel] = CLK_GetPLLClockFreq();
  68.     }
  69.     else
  70.     {
  71.     }
  72.     /* Set UART baud rate */
  73.     if(u32baudrate != 0ul)
  74.     {
  75.         u32Baud_Div = UART_BAUD_MODE2_DIVIDER((u32ClkTbl[u32UartClkSrcSel]) / (u32UartClkDivNum + 1ul), u32baudrate);

  76.         if(u32Baud_Div > 0xFFFFul)
  77.         {
  78.             uart->BAUD = (UART_BAUD_MODE0 | UART_BAUD_MODE0_DIVIDER((u32ClkTbl[u32UartClkSrcSel]) / (u32UartClkDivNum + 1ul), u32baudrate));
  79.         }
  80.         else
  81.         {
  82.             uart->BAUD = (UART_BAUD_MODE2 | u32Baud_Div);
  83.         }
  84.     }
  85. }

那么,是哪里指定的引脚呢?
jasontu 发表于 2021-8-16 14:20 | 显示全部楼层
在system initial,有指定gpio 初始化功能脚的定义
 楼主| match007 发表于 2021-8-16 15:14 | 显示全部楼层
jasontu 发表于 2021-8-16 14:20
在system initial,有指定gpio 初始化功能脚的定义
  1.   /*----------------------------------------------------------------------*/
  2.     /* Init I/O Multi-function                                              */
  3.     /*----------------------------------------------------------------------*/
  4.     /* Set GPB multi-function pins for UART0 RXD and TXD */
  5.     SYS->GPB_MFPH = (SYS->GPB_MFPH & ~(SYS_GPB_MFPH_PB12MFP_Msk | SYS_GPB_MFPH_PB13MFP_Msk)) |
  6.                     (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 初始化功能脚的定义

我试了一下,感谢!!
skyred 发表于 2021-8-17 12:20 | 显示全部楼层
时钟和IO配置,都在系统初始化里
这个和习惯了ST的人,难受,这个也可以按自己的习惯去处理。
xiaoqizi 发表于 2021-9-10 15:38 | 显示全部楼层
这个不需要指定吧
一刀一级 发表于 2021-9-10 16:13 来自手机 | 显示全部楼层
这个需要指定吗
kiwis66 发表于 2021-9-13 11:27 | 显示全部楼层
是的,新唐的例程在系统初始化里,初始化时钟和外设。
串口初始化的时候,就剩下波特率之类的了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

97

主题

607

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部