注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
baixichi的个人空间 https://home.eeworld.com.cn/space-uid-320456.html [收藏] [复制] [分享] [RSS]
日志

【TI学习】从入门到熟悉6911

已有 1967 次阅读2011-9-12 23:07

关于lm3s6911的学习笔记

 

       我所使用的板子是之前做一个“基于ARM的RFID读卡器”项目留下来的,当时对于ARM,cortex-M3,TI都了解甚少,可以说是就听过这个名字。

当时就只是看文档,看着那些英文头都大了,从lm3s6911的datasheet到外设驱动库,在一点一点的接触和学习中,算是弄明白了一个工程的开发

流程。在开始编程之前,熟悉编译器是很必要的,我所选用的是IAR,下面是IAR上手的两个文档

IAR使用Luminary驱动库的说明.doc

IAR入手.pdf

      第一个程序是一个点亮LED灯。下面粘贴一段程序,注释已经很把我们程序的步骤描述得很清楚了。

#include "hw_types.h"
#include "hw_memmap.h"
#include "sysctl.h"
#include "gpio.h"

 

unsigned long TheSysClock=12000000UL;

 

int main(void)
{
  SysCtlClockSet(SYSCTL_XTAL_8MHZ|    //采用8MHz晶振
                 SYSCTL_USE_PLL|      //用PELL倍频
                 SYSCTL_OSC_MAIN|     //振荡器源
                 SYSCTL_SYSDIV_4);    //4分频
 
  TheSysClock=SysCtlClockGet();
 
  SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);  //使能GPIOB
  GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE,GPIO_PIN_1); //配置GPIOB1为输出
 
  while(1)
  {
   GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_1,0x00);//PB1拉低
    SysCtlDelay(TheSysClock/3);//延时一秒
    GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_1,0x02);//PB1拉高
    SysCtlDelay(TheSysClock/3);
  }
}

      可以说,在嵌入式世界里LED程序和最最经典呐“hello world!”程序有着同样重要的地位。点亮一个LED,

就犹如用printf在屏幕上显示一个“hello world!”。我个人觉得TI的函数库做得非常好,避免了我们对寄存器的

直接操作。和意法半导体的STM32比起来,TI的库函数有很大的优势,作为开发人员,我更愿意用TI的产品。

 

      点灯算是对GPIO口得操作。下面贴一个温度传感器TMP75的操作,算是I2C的认识。

#include "hw_memmap.h"
#include "hw_types.h"
#include "sysctl.h"
#include "gpio.h"
#include "i2c.h"


#define TMP75_ADDR 0x48


float pt=0.0;
float da=0.0;

unsigned long TheSysClock = 12000000UL;

 

void Init_Clock()
{
  SysCtlClockSet(SYSCTL_USE_PLL
                 |SYSCTL_OSC_MAIN
                 |SYSCTL_XTAL_8MHZ
                 |SYSCTL_SYSDIV_8);
  TheSysClock=SysCtlClockGet();
}

 

void Init_I2c()
{
  SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
  SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C1);
  GPIOPinTypeI2C(GPIO_PORTA_BASE,GPIO_PIN_6|GPIO_PIN_7);
  I2CMasterInitExpClk(I2C1_MASTER_BASE,TheSysClock,true);
  //I2CSlaveEnable(I2C1_SLAVE_BASE);
 // I2CSlaveInit(I2C0_SLAVE_BASE,TMP75_ADDR);
}

 

float Tmp75ReadTemp()
{
  unsigned long datah,datal;
  float data;
 //设置从机地址,写模式
  I2CMasterSlaveAddrSet(I2C1_MASTER_BASE,TMP75_ADDR,false);
 
  //放置要发送的控制命令字到I2C master
 
  //I2CMasterDataPut(I2C1_MASTER_BASE,0x00);

  //发送控制命令字
 
  I2CMasterControl(I2C1_MASTER_BASE,I2C_MASTER_CMD_BURST_SEND_START);
 
  while(I2CMasterBusy(I2C1_MASTER_BASE));
 
  //从设备地址+读写位写入发送数据寄存器
 
  I2CMasterSlaveAddrSet(I2C1_MASTER_BASE,TMP75_ADDR,true);

 
  //再发从设备地址+读写位
  I2CMasterControl(I2C1_MASTER_BASE,I2C_MASTER_CMD_BURST_RECEIVE_START);
 
  while(I2CMasterBusy(I2C1_MASTER_BASE));
 
  datah=I2CSlaveDataGet(I2C1_MASTER_BASE);
 
  I2CMasterControl(I2C1_MASTER_BASE,I2C_MASTER_CMD_BURST_RECEIVE_CONT);
 
  while(I2CMasterBusy(I2C1_MASTER_BASE));
 
  datal=I2CSlaveDataGet(I2C1_MASTER_BASE);
 
  I2CMasterControl(I2C1_MASTER_BASE,I2C_MASTER_CMD_BURST_RECEIVE_FINISH);
 
  while(I2CMasterBusy(I2C1_MASTER_BASE));
 
  data=(((datah<<4)|(datal>>4))&0xfff)*0.0625;
  
  return data;
}

 

main(void)
{
  //float data;
  Init_Clock();
  Init_I2c();
  while(1)
  {
    pt= Tmp75ReadTemp();
    SysCtlDelay(TheSysClock/2);
    da=pt;  
  }
}

      然后学习的是定时器,用定时器实现控制LED灯一秒闪烁一次。

//***************************************************************************
//               使用定时器中断使LED闪烁周期为1S
//                     
//***************************************************************************
#include "hw_memmap.h"
#include "hw_ints.h"
#include "hw_types.h"
#include "interrupt.h"
#include "sysctl.h"
#include "gpio.h"
#include "timer.h"

unsigned char min=0,sec=0;
unsigned long TheSysClock=12000000UL;
unsigned char val=0x00;

void main(void)
{
  SysCtlClockSet(SYSCTL_SYSDIV_2_5
                 |SYSCTL_XTAL_16MHZ
                 |SYSCTL_USE_PLL
                 |SYSCTL_OSC_MAIN);
 
  TheSysClock=SysCtlClockGet();
 
  SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);
  SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
  GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE,GPIO_PIN_1);
  GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_1,0x00);
  GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_1,0xff);
 
  TimerConfigure(TIMER0_BASE,TIMER_CFG_32_BIT_PER);
  TimerLoadSet(TIMER0_BASE,TIMER_A,TheSysClock);
 
  TimerEnable(TIMER0_BASE,TIMER_A);
 
  TimerIntEnable(TIMER0_BASE,TIMER_TIMA_TIMEOUT);//开TIMERA中断
 
  IntEnable(INT_TIMER0A); //开TIMER总中断
 
  IntMasterEnable();  //开CPU总中断
 
 
 
 
  while(1)
  {
   
  }
 
  //等中断
 
}

void Timer0_Isr()
{
  val=~val;
  GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_1,val);
  TimerIntClear(TIMER0_BASE,TIMER_TIMA_TIMEOUT);
}

 

      就这样一步一步,从一无所知到对GPIO,I2C,定时器等等的操作。这些都是裸奔实现的。最郁闷的时候是

在写PWM的时候,看过很多例子之后,自己也能写出标准的PWM波。占空比也没有问题,关键是在我想要一个

20ms的波形时,不管怎么就是出不来我想要的频率。在请教高手之后才知道,原来是我的数据溢出了,TI的

stelleris系列的PWM波只支持16位,这个问题困扰了我两天,原来是小错误。对于我们写程序的来说,细心也是关键

      到后来把ucosII移植进去。。。

 

 

未完,待续

   

全部作者的其他最新日志
发表评论 评论 (1 个评论)
回复 lixmlxm 2013-2-28 14:58
博主有操作过24C256吗?

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章