查看: 6652|回复: 1

[MPC] 【MPC5602开发笔记】UART发送

[复制链接]
  • TA的每日心情
    开心
    2018-7-23 21:04
  • 签到天数: 103 天

    连续签到: 1 天

    [LV.6]常住居民II

    228

    主题

    5379

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    16761
    最后登录
    1970-1-1
    发表于 2016-2-27 12:21:54 | 显示全部楼层 |阅读模式
    前面介绍了trk-usb-mpc5602p开发板的GPIO的输入和输出功能,今天给大家分享一下UART的基本功能,发送数据。我们在调试程序时,经常希望能够向计算机串口发送一些调试信息,这是必须要用到UART了。
    在MPC5602P中,UART功能与LIN功能同属一模块,LIN Controller (LINFlex)。或者说,LINFlex可实现UART功能。
    今天我们只看UART部分。
    1、实现功能:
    通过开发板的虚拟串口向计算机发送字符串。
    2、来看看电路:
    0100.png
    0101.png
    上面是开发板MPC5602P使用的串口电路,可以看到,开发板 调试器被识别成串口9了
    0127.png
    3、串口相关引脚
    0102.png
    可以看出,引脚使用的是复用功能,因此要设置引脚的控制寄存器
    0124.png
    0125.png

      SIU.PCR[18].R = 0x0600;  
      SIU.PCR[19].R = 0x0100;  

    4、同时要设置LIN外设控制寄存器,查看可知,LIN0使用的是PCTL48
    0103.png
    0104.png
    0105.png
    0106.png
    5、下面指出了使用UART功能时,要使用的基本寄存器
    0107.png
    LIN控制寄存器设置它的工作模式
    0108.png
    0109.png
    0110.png
    0111.png
    LIN中断允许寄存器,禁止所有中断
    0112.png
    UART模式控制寄存器
    0113.png
    0114.png
    0115.png
    UART的状态寄存器,其中有发送数据完成标志位,可用于判断是否1帧数据发送完成
    0116.png
    0117.png
    下面是波特率控制寄存器
    0118.png
    0119.png
    0120.png
    0121.png
    在参考手册上还有波特率的计算公式
    0122.png
    使用下表,可以查到常用的波特率的设置数据和误差
    0123.png
    有了上面的基本知识,就可以写程序了
    6、完整程序:
    1. #include "MPC5602P.h"

    2. uint8_t txBuffer[] = "This is a test of uart0\r\n";

    3. void disableWatchdog(void) {        //禁止看门狗
    4.   SWT.SR.R = 0x0000c520;     
    5.   SWT.SR.R = 0x0000d928;
    6.   SWT.CR.R = 0x8000010A;     
    7. }

    8. void initModesAndClock(void) {
    9.   ME.MER.R = 0x0000001D;          /* Enable DRUN, RUN0, SAFE, RESET modes */

    10.   CGM.CMU_0_CSR.R = 0x000000004;  /* Monitor FXOSC > FIRC/1 (4MHz); no PLL monitor*/
    11.   CGM.FMPLL[0].CR.R = 0x02400100; /* 8 MHz xtal: Set PLL0 to 64 MHz */   
    12.   ME.RUN[0].R = 0x001F0074;       /* RUN0 cfg: 16MHzIRCON,OSC0ON,PLL0ON,syclk=PLL0 */
    13.   ME.RUNPC[0].R = 0x000000FE;
    14.   ME.PCTL[48].R = 0x00;

    15.   ME.MCTL.R = 0x40005AF0;         /* Enter RUN0 Mode & Key */
    16.   ME.MCTL.R = 0x4000A50F;         /* Enter RUN0 Mode & Inverted Key */  
    17.   
    18.   while (ME.GS.B.S_MTRANS == 1) {}    /* Wait for mode transition to complete */   

    19.   while(ME.GS.B.S_CURRENTMODE != 4) {} /* Verify RUN0 is the current mode */
    20. }

    21. void initGpio(void) {
    22.   SIU.PCR[18].R = 0x0600;                 //PB2作为TXD
    23.   SIU.PCR[19].R = 0x0100;                 //PB3作为RXD
    24. }
    25. void initUart0(void) {
    26.   LINFLEX_0.LINCR1.B.INIT = 1;            //进入初始化模式
    27.   LINFLEX_0.LINCR1.B.SLEEP = 0;
    28.   LINFLEX_0.LINCR1.B.BF = 0;
    29.   
    30.   LINFLEX_0.UARTCR.B.UART = 1;            //使用UART
    31.   LINFLEX_0.UARTCR.B.WL = 1;
    32.   LINFLEX_0.UARTCR.B.PCE = 0;
    33.   LINFLEX_0.UARTCR.B.TXEN = 1;            //允许发送
    34.   LINFLEX_0.UARTCR.B.RXEN = 0;            //禁止接收
    35.   LINFLEX_0.UARTCR.B.RDFL = 0;            //接收缓冲区长度1字节
    36.   LINFLEX_0.UARTCR.B.TDFL = 0;            //发送缓冲区长度1字节
    37.   
    38.   LINFLEX_0.LINIBRR.B.DIV_M = 416;        //波特率9600
    39.   LINFLEX_0.LINFBRR.B.DIV_F = 11;
    40.   
    41.   LINFLEX_0.LINIER.R = 0x00000000;        //禁止所有中断
    42.   
    43.   LINFLEX_0.UARTSR.B.DTF = 1;             //清发送标志
    44.   LINFLEX_0.UARTSR.B.DRF = 1;             //清接收标志
    45.   
    46.   LINFLEX_0.LINCR1.B.INIT = 0;            //进入普通模式
    47. }

    48. void uart0SendByte(uint8_t data) {        //发送1个字节
    49.   LINFLEX_0.BDRL.B.DATA0 = data;
    50.   while(LINFLEX_0.UARTSR.B.DTF == 0) {}
    51.   LINFLEX_0.UARTSR.B.DTF = 1;
    52. }

    53. void uart0SendString(uint8_t *str) {      //发送1个字符串
    54.   while (*str != 0x00) {
    55.     uart0SendByte(*str++);
    56.   }
    57. }

    58. void timeDelay(void) {
    59.   vuint32_t i;
    60.   for (i = 0; i < 3000000; i++) {}
    61. }

    62. int main(void) {
    63.   initModesAndClock();              //时钟设置
    64.   disableWatchdog();                //禁止看门狗
    65.   initGpio();
    66.   initUart0();

    67.   /* Loop forever */
    68.   for (;;) {
    69.     uart0SendString(txBuffer);
    70.     timeDelay();
    71.   }
    72. }
    复制代码

    7、下面是运行效果,可以看到,可以实现基本功能
    0126.png

    8、最后附上工程文件,方便参考,欢迎大家交流!
    uart0_tx_mpc5602p.rar (119.54 KB, 下载次数: 40)
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2017-5-3 11:19
  • 签到天数: 10 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    50

    主题

    1万

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    14090
    最后登录
    2024-4-19
    发表于 2016-2-27 22:13:01 | 显示全部楼层
    辛苦了。。。 null - 副本 - 副本 - 副本.png null - 副本 - 副本 (2).png null - 副本 - 副本 (3).png null - 副本 - 副本.png null - 副本 (2) - 副本.png null - 副本 (2).png null - 副本 (3).png null - 副本 (4).png null - 副本.png null.png
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-8-7 14:31 , Processed in 0.089812 second(s), 22 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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