2756|0

61

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

使用LM3S串口与AVR单片机串口设置 [复制链接]

UART-----FIFO

 #include "inc/hw_ints.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/debug.h"  //单步调试
#include "driverlib/gpio.h"
#include "driverlib/interrupt.h"
//#include "driverlib/rom.h" //使用rom里面固化的api函数,以节约flash空间
#include "driverlib/sysctl.h"
#include "driverlib/systick.h"
#include "driverlib/uart.h"
#include"stdio.h"
#define PINS GPIO_PIN_5
#define UARTCharPutNB UARTCharPutNonBlocking
void
uartInit(void)
{
  SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);//使能UART模块
  SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);//使能RX和TX所在的端口PA//
  GPIOPinTypeUART(GPIO_PORTA_BASE,   //配置RX和TX
                   GPIO_PIN_0|GPIO_PIN_1); //为收发功能//
 UARTConfigSetExpClk(UART0_BASE,SysCtlClockGet(),//配置GPIO端口 ,系统时钟频率
        9600,UART_CONFIG_WLEN_8|     // 波特率9600,数据位8
  UART_CONFIG_PAR_NONE|      //效检位:无
  UART_CONFIG_STOP_ONE);     //停止位1
  UARTEnable(UART0_BASE); //使能UART0

  UARTFIFOLevelSet(UART0_BASE,      //配置FIFO中断触发深度
                    UART_FIFO_TX2_8,    //发送FIFO为2/8深度(4B)
     UART_FIFO_RX6_8);    //接收FIFO深度6/8深度(12B)

  UARTIntEnable(UART0_BASE,UART_INT_TX);  //使能发送中断//
  IntEnable(INT_UART0);  //能使UART0中断
  IntMasterEnable();  //打开总中断//
  UARTEnable(UART0_BASE); //使能UART端口//
}
 void LED_INIT(void)
 {
   SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);//使能外设GIOPE
    GPIOPadConfigSet(GPIO_PORTE_BASE, PINS,
                     GPIO_STRENGTH_4MA,
                     GPIO_PIN_TYPE_STD);//配置管脚驱动,驱动电流2MA其实已足够
    GPIODirModeSet(GPIO_PORTE_BASE, PINS, GPIO_DIR_MODE_OUT);//设置管脚输出
 
  SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);//使能外设GIOPF
    GPIOPadConfigSet(GPIO_PORTF_BASE, GPIO_PIN_2|GPIO_PIN_3,   //PF2,PF3//
                     GPIO_STRENGTH_4MA,
                     GPIO_PIN_TYPE_STD);//配置管脚驱动,驱动电流2MA其实已足够
    GPIODirModeSet(GPIO_PORTF_BASE, GPIO_PIN_2|GPIO_PIN_3, GPIO_DIR_MODE_OUT);//设置管脚输出
 
 }
const char TxData[]="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n";
volatile int TxIndex=0;
volatile int n=0;   //显示中断次数作用,因为板用8MHZ所以不宜定义长字符//
volatile tBoolean TxEndFlag = false;

//填充发送FIFO(填满FIFO之后就退出,不会等待)
void
TxFIFOFill(void)
{
  char c;
  for(;;)
  {
    c=TxData[TxIndex];
 if(c=='\0')     //若填充完毕//
 {
   TxEndFlag=true;  //发送结束标志位,并退出//
   break;
 }
 if(UARTSpaceAvail(UART0_BASE)) //若FIFO中有可用空间
 {
   UARTCharPutNB(UART0_BASE,c); //填充发FIFO
   TxIndex++;
 } else{       //若没有空则跳出//
         break;
       }
  }
}

void UARTput(const char *pucBuffer) //通过UART发送字符串//

{
    while(*pucBuffer)
    {
        // 通过字符串指针发送数据
        UARTCharPutNonBlocking(UART0_BASE, *pucBuffer++);
    }
}
int
main(void)
{
   char S[40];
   SysCtlClockSet(SYSCTL_OSC_MAIN|SYSCTL_XTAL_8MHZ|
                  SYSCTL_USE_OSC|SYSCTL_SYSDIV_1); //系统时钟
    
  uartInit();
  LED_INIT();
  TxFIFOFill();
 for(;;)
  {
    if(TxEndFlag)   //若发送结束则跳出//
 {
   TxEndFlag=false;
   break;
 }
  }
 sprintf(S,"n=%d\r\n",n); //显示中断次数//
  UARTput(S);    //发送数据//
 
  for(;;)
  {
    if(n>4)
 {
  GPIOPinWrite(GPIO_PORTE_BASE, PINS, ~PINS);//输出高电低PE5LED亮
 }else{
        GPIOPinWrite(GPIO_PORTE_BASE, PINS, PINS);//输出高电低PE5LED亮表明已进入中断
      }
  }
}

//  UART0中断服务函数
void UART0_ISR(void)
{
    unsigned long ulStatus;

    ulStatus = UARTIntStatus(UART0_BASE, true);             //  读取当前中断状态
    UARTIntClear(UART0_BASE, ulStatus);                     //  清除中断状态
 // GPIOPinWrite(GPIO_PORTE_BASE, PINS, ~PINS);//输出高电低PE5LED亮
    if (ulStatus & UART_INT_TX)                             //  若是发送中断
    {
       TxFIFOFill();
    n++;
  //GPIOPinWrite(GPIO_PORTE_BASE, PINS, PINS);//输出高电低PE5LED亮表明已进入中断
    }
}

从以上的设置看出的确32位的LM3S比8位的AVR要强得多。

 
点赞 关注

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表