freescale MC9S12G128 SCI,printf使用

2021-07-21来源: eefocus关键字:freescale  SCI  printf

Serial Communication Interface (SCI)

SCI异步串行通信:

术语词汇:

IR: InfraRed

IrDA: Infrared Design Associate

IRQ: Interrupt Request

LIN: Local Interconnect Network

LSB: Least Significant Bit

MSB: Most Significant Bit

NRZ: Non-Return-to-Zero

RZI: Return-to-Zero-Inverted

RXD: Receive Pin

SCI : Serial Communication Interface

TXD: Transmit Pin


功能框图:

在这里插入图片描述

相关寄存器:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

SCI轮询方式收发数据代码:

#include       /* common defines and macros */

#include "derivative.h"      /* derivative-specific definitions */


#include

#include

#include

#include


#define D_BUSCLK_FREQ   (16000000) // 总线频率 16MHz

#define D_SCI_BAUDRATE  (9600)     // 串口波特率  


unsigned char txbuff[256]={0};   // 发送缓存

unsigned char rxbuff[256]={0};   // 接收缓存



/*************************************************************/

/*                       串口发送函数                        */

/*************************************************************/

void csi_send(unsigned char data) 

{

  while(!SCI0SR1_TDRE);       //等待发送数据寄存器(缓冲器)为空

  SCI0DRL = data;

}



void send_string(unsigned char *putchar) 

{

  while(*putchar!=0x00)       //判断字符串是否发送完毕

  {

   csi_send(*putchar++);  

  }

}




unsigned char csi_receive(void) 

{

  while(!SCI0SR1_RDRF);          //等待接收数据寄存器满

    return(SCI0DRL);

}


/*************************************************************/

/**   定义了这个两个接口就可以使用printf函数格式化输出      **/

/**   TERMIO_PutChar                                        **/

/**   TERMIO_GetChar                                        **/

/*************************************************************/

void TERMIO_PutChar(char ch){

  csi_send((unsigned char)ch);

}


char TERMIO_GetChar(void){

  return (char)csi_receive();

}


void sci_init(void) {

  SCI0BD = D_BUSCLK_FREQ/16/D_SCI_BAUDRATE;    // 设置SCI0波特率 busCLK/16/BAUDRATE;

  SCI0CR1 = 0x00;       //设置SCI0为正常模式,八位数据位,无奇偶校验

  SCI0CR2 = 0x08 | 0x04;//允许收发送数据,禁止中断功能  7:TIE, 6:TCIE, 5:RIE, 4:ILIE, 3:TE, 2:RE, 1:RWU, 0:SBK

}



/**

* @brief 锁相环 初始化

* @param none

* @return none

*/

void pll_init(void) {

  CPMUPROT = 0x26;              //保护时钟配置寄存器

  

  CPMUCLKS_PSTP = 0;            //禁用PLL

  CPMUCLKS_PLLSEL = 1;          //选择PLL作为系统时钟源

  

  CPMUOSC_OSCE = 1;             //外部晶振使能

  while(CPMUOSC_OSCPINS_EN==0); //等待外部晶振使能


  // BUSCLK = (PLLCLK / 2)   总线频率=(锁相环频率/2)

  

  

  #if 1

  //fVOC= 2*fOSC*(SYNDIV + 1)/(REFDIV + 1) 

  CPMUSYNR = 0x07;                                                  

  //CPMUREFDIV = 0x0F; // PLLCLK:16M  BUSCLK:8M   

  CPMUREFDIV = 0x07; // PLLCLK:32M  BUSCLK:16M   

  //CPMUREFDIV = 0x03; // PLLCLK:64M  BUSCLK:32M        

  #endif

  

  #if 0

  //fVOC配置 fVOC = 2*fREF*(SYNDIV +1)

  //CPMUSYNR = 0x45; // PLLCLK:48M     BUSCLK:24M

  //CPMUSYNR = 0x44; // PLLCLK:40M     BUSCLK:20M

  //CPMUSYNR = 0x43; // PLLCLK:32M     BUSCLK:16M

  //CPMUSYNR = 0x42; // PLLCLK:24M     BUSCLK:12M

  CPMUSYNR = 0x01; // PLLCLK:16M    BUSCLK:8M

  CPMUREFDIV = 0x81;//REFDIV基准分频器配置

  #endif

    

  CPMUPOSTDIV = 0x00;           // PLL CLOCK = VCO CLOCK / (POSTDIV + 1) 

                              

  _asm(nop);

  _asm(nop);

  

  CPMUPLL=0x10;               //锁相环调频启用,用以减少噪音

    

  while(CPMUFLG_LOCK == 0);   //等待PLL稳定

  

    

  CPMUPROT = 0x00;            //关闭保护时钟

  CPMUCLKS_PLLSEL = 1;        //使能PLL

}


void main(void) {

  //int c;


  /* put your own code here */

  DisableInterrupts;

  pll_init();

  sci_init();

EnableInterrupts;


 

  for(;;) {

    /* TODO:单字符收发 */

    rxbuff[0] = csi_receive();  // 接收一个字符 这里会阻塞

    

    csi_send(rxbuff[0]+1);      // 接收字符+1 并发送字符

    csi_send('n');             // 发送换行'n'

    

    

    /* TODO:发送字符串 */ 

    (void)memset((char*)txbuff, 0, sizeof((char*)txbuff));

    (void)sprintf((char*)txbuff, "%s", "This is freescale sci send.n");

    send_string(txbuff);       // 发送字符串

    

     

    /* TODO:printf 函数使用 */ 

    (void)printf("sci testn");

    (void)printf("%s, %dn","hello", 1234);


     

     #if 0

     c = getchar();

     if (putchar(c)) {

     

     } else {

     

     }

     #endif

    


    _FEED_COP(); /* feeds the dog */

  } /* loop forever */

  /* please make sure that you never leave main */

}


SCI中断方式收发数据代码:

#include       /* common defines and macros */

#include "derivative.h"      /* derivative-specific definitions */

#include

#include


#define D_BUSCLK_FREQ   (16000000) // 总线频率 16MHz

#define D_SCI_BAUDRATE  (9600)     // 串口波特率  



unsigned char txbuff[256]={0};   // 发送缓存

unsigned char rxbuff[256]={0};   // 接收缓存


unsigned char *send;


/*************************************************************/

/*                       串口发送函数                        */

/*************************************************************/

void csi_send(unsigned char data) 

{

  while(!SCI0SR1_TDRE);         //等待发送数据寄存器(缓冲器)为空

  SCI0DRL = data;

}


/*************************************************************/

/*                       串口接收函数                        */

/*************************************************************/

unsigned char csi_receive(void) 

{

  while(!SCI0SR1_RDRF);          //等待发送数据寄存器满

  return(SCI0DRL);

}


/*************************************************************/

/**   定义了这个两个接口就可以使用printf函数格式化输出      **/

/**   TERMIO_PutChar                                        **/

/**   TERMIO_GetChar                                        **/

/*************************************************************/

void TERMIO_PutChar(char ch){

  csi_send((unsigned char)ch);

}


char TERMIO_GetChar(void){

  return (char)csi_receive();

}


void sci_init(void) {

  SCI0BD = D_BUSCLK_FREQ/16/D_SCI_BAUDRATE;    // 设置SCI0波特率 busCLK/16/BAUDRATE;

  SCI0CR1 = 0x00;    //设置SCI0为正常模式,八位数据位,无奇偶校验  7:LOOPS 6:SCISWAI 5:RSRC 4:M 3:WAKE 2:ILT 1:PE 0:PT

  SCI0CR2 = 0xAC;    //允许收发数据,允许收发中断功能   7:TIE, 6:TCIE, 5:RIE, 4:ILIE, 3:TE, 2:RE, 1:RWU, 0:SBK

}


/**

* @brief 锁相环 初始化

* @param none

* @return none

*/

void pll_init(void) {

  CPMUPROT = 0x26;              //保护时钟配置寄存器

  

  CPMUCLKS_PSTP = 0;            //禁用PLL

  CPMUCLKS_PLLSEL = 1;          //选择PLL作为系统时钟源

  

  CPMUOSC_OSCE = 1;             //外部晶振使能

  while(CPMUOSC_OSCPINS_EN==0); //等待外部晶振使能


  // BUSCLK = (PLLCLK / 2)   总线频率=(锁相环频率/2)

  

  

  #if 1

  //fVOC= 2*fOSC*(SYNDIV + 1)/(REFDIV + 1) 

  CPMUSYNR = 0x07;                                                  

  //CPMUREFDIV = 0x0F; // PLLCLK:16M  BUSCLK:8M   

  CPMUREFDIV = 0x07; // PLLCLK:32M  BUSCLK:16M   

  //CPMUREFDIV = 0x03; // PLLCLK:64M  BUSCLK:32M        

  #endif

  

  #if 0

  //fVOC配置 fVOC = 2*fREF*(SYNDIV +1)

  //CPMUSYNR = 0x45; // PLLCLK:48M     BUSCLK:24M

  //CPMUSYNR = 0x44; // PLLCLK:40M     BUSCLK:20M

  //CPMUSYNR = 0x43; // PLLCLK:32M     BUSCLK:16M

  //CPMUSYNR = 0x42; // PLLCLK:24M     BUSCLK:12M

  CPMUSYNR = 0x01; // PLLCLK:16M    BUSCLK:8M

  CPMUREFDIV = 0x81;//REFDIV基准分频器配置

  #endif

    

  CPMUPOSTDIV = 0x00;           // PLL CLOCK = VCO CLOCK / (POSTDIV + 1) 

[1] [2]
关键字:freescale  SCI  printf 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic542571.html

上一篇:Freescale MC9S12G128 PLL,OSC
下一篇:飞思卡尔MC9S12G64串口发送接收驱动

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

Freescale MC9S12G128 PLL,OSC
PLL OSC简述:S12CPMU Block Diagram:S12CPMU Synthesizer Register(CPMUSYNR)PLL相关主要寄存器:CPMUPROT:时钟配置寄存器保护Clock Configuration Registers Protection Bit — This bit protects the clock configuration registers fromaccidental overwrite (see list of affected registers above):Writing 0x26 to the CPMUPROT register clears the PROT bit
发表于 2021-07-21
Freescale <font color='red'>MC9S12G128</font> PLL,OSC
freescale MC9S12G128单片机概述
MC9S12G128MLL开发板实物图DBM下载器:飞翔科技DBM下载实物图:
发表于 2021-07-21
freescale <font color='red'>MC9S12G128</font>单片机概述
freescale MC9S12G128 中断代码实现方法
写法1:中断函数指明中断向量号:main.c#pragma CODE_SEG __NEAR_SEG NON_BANKEDinterrupt 中断向量号 void 中断服务函数名(void) {// 中断服务程序代码段}#pragma CODE_SEG DEFAULT中断向量号在mc9s12g128.h文件里有定义,如:/**************** interrupt vector numbers ****************/#define VectorNumber_Vportj 24U写法2:修改prm文件,在Project.prm文件声明中断函数:main.c:#pragma CODE_SEG __NEAR_SEG
发表于 2021-07-21
Freescale MC9S12G128 GPIO
MC9S12G-Family Block Diagram不同芯片封装端口:Port J相关寄存器The PIM includes these distinctive registers:• Data registers and data direction registers for ports A, B, C, D, E, T, S, M, P, J and AD when usedas general-purpose I/O• Control registers to enable/disable pull devices and select pullups/pulldowns on ports T, S, M, P, Jan
发表于 2021-07-21
<font color='red'>Freescale</font> MC9S12G128 GPIO
Freescale MC9S08AW60汇编学习笔记
能够实现用七段led数码管显示出数字和字母、让它们同时显示甚至于滚动显示,这些功能已经很不错了,但是这样还不够,我们还想实现更准确的控制,让数码管按照我们的想法来显示,而不是呆板的循环,这样我们引入中断的想法。也许其他人会从查询和中断的关系这些地方来引出中断,但是我还是倾向于从控制的观点来引出中断,毕竟中断也是实现更直观的人为控制的方法,程序的运行变得可以加入人的意愿来执行,如果我们要让程序进入某一个中断程序,那么给主程序发一个中断,让它跳到中断子程序中运行就行了;我们不发中断,中断子程序就不会执行。还是用七段led数码管来演示,我们没发一个中断信号,数码管就在0~9之间变化一下。代码如下: INCLUDE MC9S08A
发表于 2021-04-07
<font color='red'>Freescale</font> MC9S08AW60汇编学习笔记
MC9S12G128 SCI设置
以下代码SCI开启了接收中断。  /*************************************************************/  /*                        初始化SCI                          */  
发表于 2021-07-30
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2021 EEWORLD.com.cn, Inc. All rights reserved