查看: 4996|回复: 0

[MPC] 【MPC5602开发笔记】MPC5602P之UART

[复制链接]
  • TA的每日心情
    郁闷
    2021-3-10 19:44
  • 签到天数: 7 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    126

    主题

    525

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2018
    最后登录
    2023-12-25
    发表于 2016-2-29 12:16:15 | 显示全部楼层 |阅读模式
    本帖最后由 MDebug 于 2016-2-29 12:20 编辑

      不好意思,来晚了,期间忙别的东西去了,所以耽误了一段时间。最近安排有点满啊,罪过罪过。
      关于UART,说白了,就是异步收发器,实现通讯的数据总线。
      关于串口通信的软件配置,基本套路就是:
      1.找到UART的硬件接线端口
      2.大部分的UART是GPIO的复用功能,需要配置复用功能。
      3.配置相关外设寄存器
      4.计算波特率
      5.测试
      大致就是这样一个过程,5602P的UART寄存器是和LIN公用的,配置起来比较麻烦,详情请见配置寄存器的详细过程
      波特率的计算公式: QQ截图20160229090702.png
    在MPC5602P的RM中,我找到了波特率的计算公式与9600波特率的配置方法。
    QQ截图20160229102703.png
    源代码如下:
    1. /*****************************************************************************/
    2. /* FILE NAME: main.c                            COPYRIGHT (c) Freescale 2010 */
    3. /*                                                       All Rights Reserved */
    4. /* DESCRIPTION:                                                              */
    5. /* This is the main file for the XTRKUSB_MPC5602P Development Board.         */
    6. /* Performs Temperature measurement and sends over SCI as default.                         */
    7. /* Commands received over serial are decoded, and can put program into 'pong'*/
    8. /* mode when used with demo pc application.                                                             */                        
    9. /*****************************************************************************/

    10. /* Main.h includes all other relevant include files. */
    11. #include "main.h"

    12. /****************************************************************
    13. * FUNCTION :init_Modes_Clock
    14. * DESCRIPTION : This initializes the Clock Generation Module and
    15. *                                sets PLL0 to 64MHz and System Clock.
    16. * INPUTS : None
    17. * OUTPUTS : None
    18. ****************************************************************/
    19. uint8_t Buffer[]="MDebug测试\r\n";
    20. void init_Modes_Clock(void)

    21. {

    22.   ME.MER.R = 0x000025FF;            /* 使能 DRUN, RUN0, SAFE, RESET 模式 */                                   /* Initialize PLL before turning it on: */
    23.   CGM.CMU_0_CSR.R = 0x000000004;    /* Clock Monitor FXOSC > FIRC/4 (4MHz);配置为无锁相环监控 */
    24.   CGM.FMPLL[0].CR.R = 0x02400100;   /* 8MHZ晶振:设置PLL0锁相环为64MHZ*/   

    25.   ME.RUNPC[0].R = 0x000000FE;       /* 开启所有外设 */
    26.   ME.RUN[0].R = 0x001F0074;         /* RUN0模式配置: 16MHzIRCON,OSC0开启,PLL0开启,系统时钟=PLL0时钟 */
    27.   ME.RUNPC[1].R = 0x00000010;             /* Peri. Cfg. 1 settings: 仅仅进入RUN0模式 */
    28.   ME.PCTL[92].R = 0x01;                   /* PIT, RTI: select ME_RUN_PC[1] */                              
    29.   /* Mode Transition to enter RUN0 mode: */
    30.   
    31.   ME.MCTL.R = 0x40005AF0;                 /* Enter RUN0 Mode & Key */
    32.   ME.MCTL.R = 0x4000A50F;                 /* Enter RUN0 Mode & Inverted Key */  
    33.   
    34.   while (ME.GS.B.S_MTRANS == 1) {}  /* Wait for mode transition to complete */   
    35.                                    
    36.   while(ME.GS.B.S_CURRENTMODE != 4) {} /* Verify RUN0 is the current mode */                          

    37. }

    38. /****************************************************************
    39. * FUNCTION :init_IO
    40. * DESCRIPTION : This initializes the IO Module (SIUL)
    41. * INPUTS : None
    42. * OUTPUTS : None
    43. ****************************************************************/

    44. void IO_Init(void)
    45. {

    46.    SIU.PCR[18].R=0x0600;
    47.    SIU.PCR[19].R=0x0100;
    48.         
    49. }
    50. /****************************************************************
    51. * FUNCTION :disableWatchdog
    52. * DESCRIPTION : This disables the software watchdog
    53. * INPUTS : None
    54. * OUTPUTS : None
    55. ****************************************************************/

    56. void disableWatchdog(void) {
    57.   SWT.SR.R = 0x0000c520;     /* Write keys to clear soft lock bit */
    58.   SWT.SR.R = 0x0000d928;
    59.   SWT.CR.R = 0x8000010A;     /* Clear watchdog enable (WEN) */
    60. }        
    61. /****************************************************************
    62. * FUNCTION :delay
    63. * DESCRIPTION : delay fuction
    64. * INPUTS : vuint32_t j
    65. * OUTPUTS : None
    66. ****************************************************************/
    67. void delay(uint32_t j)
    68. {
    69.         uint32_t i;
    70.         for( ; j >0 ; j--)
    71.         for(i=0;i<1000000;i++)
    72.         {}
    73. }
    74. /****************************************************************
    75. * FUNCTION :Uart_Init
    76. * DESCRIPTION : Uart初始化
    77. * INPUTS : None
    78. * OUTPUTS : None
    79. ****************************************************************/
    80. void Uart_Init(void)
    81. {
    82.   LINFLEX_0.LINCR1.B.INIT = 1;            //进入初始化模式
    83.   LINFLEX_0.LINCR1.B.SLEEP = 0;
    84.   LINFLEX_0.LINCR1.B.BF = 0;
    85.   LINFLEX_0.UARTCR.B.UART = 1;            //使用UART模式
    86.   LINFLEX_0.UARTCR.B.WL = 1;
    87.   LINFLEX_0.UARTCR.B.PCE = 0;
    88.   LINFLEX_0.UARTCR.B.TXEN = 1;            //允许发送
    89.   LINFLEX_0.UARTCR.B.RXEN = 0;            //禁止接收
    90.   LINFLEX_0.UARTCR.B.RDFL = 0;            //接收缓冲区长度1字节
    91.   LINFLEX_0.UARTCR.B.TDFL = 0;            //发送缓冲区长度1字节
    92.   LINFLEX_0.LINIBRR.B.DIV_M = 416;        //波特率9600(使用64M内核时钟)
    93.   LINFLEX_0.LINFBRR.B.DIV_F = 11;
    94.   
    95.   LINFLEX_0.LINIER.R = 0x00000000;        //禁止中断
    96.   
    97.   LINFLEX_0.UARTSR.B.DTF = 1;             //清发送标志
    98.   LINFLEX_0.UARTSR.B.DRF = 1;             //清接收标志
    99.   
    100.   LINFLEX_0.LINCR1.B.INIT = 0;            //进入普通模式
    101. }
    102. /****************************************************************
    103. * FUNCTION :Uart_SendOneByte
    104. * DESCRIPTION : 发送1个字节
    105. * INPUTS : None
    106. * OUTPUTS : None
    107. ****************************************************************/
    108. void Uart_SendOneByte(uint8_t data)
    109. {        
    110.   LINFLEX_0.BDRL.B.DATA0 = data;
    111.   while(LINFLEX_0.UARTSR.B.DTF == 0) {}
    112.   LINFLEX_0.UARTSR.B.DTF = 1;
    113. }
    114. /****************************************************************
    115. * FUNCTION :Uart_SendString
    116. * DESCRIPTION : 发送字符串
    117. * INPUTS : None
    118. * OUTPUTS : None
    119. ****************************************************************/
    120. void Uart_SendString(uint8_t *Buffer)
    121. {      
    122.   while(*Buffer!=0x00)
    123.   {
    124.     Uart_SendOneByte(*Buffer++);
    125.   }
    126. }
    127. /******************************* Main ***********************************/


    128. int main (void)
    129. {
    130.   
    131.   init_Modes_Clock();          /* MPC56xxP/B/S: Initialize mode entries, set sysclk = 64 MHz*/
    132.   IO_Init();                        /* Initialize IO */
    133.   disableWatchdog();    /* Disable watchdog */
    134.   Uart_Init();
    135.   IO_Init();
    136.   for(;;)
    137.   {
    138.           Uart_SendString(Buffer);
    139.           delay(20);
    140.   }
    141. }
    复制代码
    实验现象:
    QQ截图20160229121309.png
    工程源文件在附件中。
    最近有些事情要做,所以分享的慢一些,望各位多多包涵。

    我知道答案 目前已有0人回答

    MDebug-Uart.rar

    236.44 KB, 下载次数: 22, 下载积分: 威望 1

    很开心
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-18 22:11 , Processed in 0.086340 second(s), 22 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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