15863|30

146

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

【TI学习】从入门到熟悉lm3s6911(新增加中文资料) [复制链接]

关于lm3s6911的学习笔记

 

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

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

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

IAR使用Luminary驱动库的说明.doc (30 KB, 下载次数: 263)

IAR入手.pdf (1.29 MB, 下载次数: 622)

      第一个程序是一个点亮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移植进去。。。

     

      未完,待续

 

   

 

 

这里分享一下资料,都是中文版的,在周立功网站上下到的。

 

 

LM3S_Circuit_Ethernet_App.pdf (353.18 KB, 下载次数: 453)

LM3SLib_ADC.pdf (513.01 KB, 下载次数: 424)

LM3SLib_BasicExam.pdf (246.71 KB, 下载次数: 297)

LM3SLib_Flash.pdf (164.68 KB, 下载次数: 374)

LM3SLib_GPIO.pdf (320.76 KB, 下载次数: 494)

LM3SLib_hw_types.pdf (64.9 KB, 下载次数: 248)

LM3SLib_I2C.pdf (474.95 KB, 下载次数: 285)

LM3SLib_Interrupt.pdf (239.27 KB, 下载次数: 296)

LM3SLib_PWM.pdf (341.21 KB, 下载次数: 296)

LM3SLib_SSI.pdf (192.71 KB, 下载次数: 316)

LM3SLib_SysCtl.pdf (549.17 KB, 下载次数: 594)

LM3SLib_SysTick.pdf (96.36 KB, 下载次数: 238)

LM3SLib_Timer.pdf (357.12 KB, 下载次数: 412)

LM3SLib_WatchDog.pdf (157.25 KB, 下载次数: 275)

LM3SLib_UART.pdf (401.7 KB, 下载次数: 335)

 

[ 本帖最后由 baixichi 于 2011-9-15 12:14 编辑 ]

最新回复

  详情 回复 发表于 2013-12-23 22:36
 
点赞 关注(1)

回复
举报

1803

帖子

0

TA的资源

五彩晶圆(高级)

沙发
 

回复 楼主 baixichi 的帖子

楼主写的非常好,顶一下。
 
 

回复

338

帖子

2

TA的资源

五彩晶圆(初级)

板凳
 

谢谢楼主共享,期待后期继续深入

 
个人签名以VS1003B和山景方案为基础,倾心研制数字化语音录放产品
排忧邮箱xg_2004_sy@126.com
 
 

回复

146

帖子

0

TA的资源

一粒金砂(高级)

4
 

回复 板凳 古道热肠MP3 的帖子

 
 
 

回复

146

帖子

0

TA的资源

一粒金砂(高级)

5
 

回复 沙发 Study_Stellaris 的帖子

今天继续写了一个控制触摸屏的笔记。https://bbs.eeworld.com.cn/viewt ... 14&extra=&frombbs=1
 
 
 

回复

146

帖子

0

TA的资源

一粒金砂(高级)

6
 

资料

ARM-JTAG调试原理.pdf (570.92 KB, 下载次数: 165)

Stellaris驱动库用户指南解锁2750版580页.pdf (5.77 MB, 下载次数: 356)

uCOS ARM移植要点详解.pdf (5.27 MB, 下载次数: 240)

μCOS—Ⅱ在Cortex—M3系列单片机上的移植.pdf (223.64 KB, 下载次数: 190)

嵌入式开发-Luminary软硬件平台快速搭建.pdf (4.05 MB, 下载次数: 438)

[ 本帖最后由 baixichi 于 2011-9-16 13:16 编辑 ]
 
 
 

回复

146

帖子

0

TA的资源

一粒金砂(高级)

7
 
 

回复

146

帖子

0

TA的资源

一粒金砂(高级)

8
 

通过I2C控制电子罗盘GY26

通过I2C控制电子罗盘GY26

 

       很多朋友在没有接触电子罗盘之前都会有畏惧感。在国赛的器件清单里边提到了角度传感器,

在群里边,很多朋友都想到了电子罗盘,因为不了解其工作原理,就变得很担心,怀疑自己的实力。

很庆幸,我们小组在备赛的时候就买了GY26,可真够贵的,105块,据说最近降到100了。

       下面是淘宝店送的资料,大家可以看一下。

GY-26电子指南针使用手册.doc (108 KB, 下载次数: 44)

        如果写过TMP75的话,想得到角度也就变得尤为容易。下面是从文档里截的图:

 

 

 

        这里贴一个自己写的源代码:

#include "gy_26.h"

unsigned long temp;


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,SysCtlClockGet(),false);
}


unsigned long Read_Gy26()
{

  unsigned long data;
  int data1,data2;
 
 
 //设置从机地址,写模式
  I2CMasterSlaveAddrSet(I2C1_MASTER_BASE,GY26_Adress,false);
 
  //放置要发送的控制命令字到I2C master
  I2CMasterDataPut(I2C1_MASTER_BASE,0x00);//0x00+0x31读取角度

   
  I2CMasterControl(I2C1_MASTER_BASE,I2C_MASTER_CMD_BURST_SEND_START);//开始发送
  while(I2CMasterBusy(I2C1_MASTER_BASE));//等待命令发送结束
 
  I2CMasterDataPut(I2C1_MASTER_BASE,0x31);
 
  I2CMasterControl(I2C1_MASTER_BASE,I2C_MASTER_CMD_BURST_SEND_FINISH);
  while(I2CMasterBusy(I2C1_MASTER_BASE));
 
  SysCtlDelay(SysCtlClockGet()/3000);
 
  //设置从机地址,写模式
  I2CMasterSlaveAddrSet(I2C1_MASTER_BASE,GY26_Adress,false);

  I2CMasterDataPut(I2C1_MASTER_BASE,0x01);//0x01读取高8位
 
  I2CMasterControl(I2C1_MASTER_BASE,I2C_MASTER_CMD_BURST_SEND_START);
  
  while(I2CMasterBusy(I2C1_MASTER_BASE));
 
  I2CMasterDataPut(I2C1_MASTER_BASE,0x02);//0x02读取低8位
 
  I2CMasterControl(I2C1_MASTER_BASE,I2C_MASTER_CMD_BURST_SEND_FINISH);
  while(I2CMasterBusy(I2C1_MASTER_BASE)); 
 
 
  //设置从机地址,读模式
  I2CMasterSlaveAddrSet(I2C1_MASTER_BASE,GY26_Adress,true);
 
  I2CMasterControl(I2C1_MASTER_BASE,I2C_MASTER_CMD_BURST_RECEIVE_START);
 
  while(I2CMasterBusy(I2C1_MASTER_BASE));
  data1=I2CSlaveDataGet(I2C1_MASTER_BASE);//高8位
 
  I2CMasterControl(I2C1_MASTER_BASE,I2C_MASTER_CMD_BURST_RECEIVE_FINISH);
 
  while(I2CMasterBusy(I2C1_MASTER_BASE));
  data2=I2CSlaveDataGet(I2C1_MASTER_BASE);//低8位
 
  data=((data1<<8)+data2)/10;
 
  //temp=data/10+(data%10)/10.0;  //精度为0.1度
 
  return data;
}

赞赏

1

查看全部赞赏

 
 
 

回复

103

帖子

0

TA的资源

一粒金砂(高级)

9
 
LZ对IIC了解挺深。
Hello world用得比较多的是计算机上的应用,因为没有直观的LED,所以才会看到它。
嵌入式平台,特别是没有LCD的情况下,LED当然会是首选。
不论如何,谢谢LZ分享.
 
 
 

回复

4

帖子

0

TA的资源

一粒金砂(初级)

10
 

回复 8楼 baixichi 的帖子

楼主强大
 
 
 

回复

146

帖子

0

TA的资源

一粒金砂(高级)

11
 

ucosII的初学和使用

裸奔久了,上一个os也会体会到很多乐趣

 

        μC/OS-II是一种可移μC/OS-II是一种可移植的,可植入ROM的,可裁剪的,抢占式的,实时多任务操作系统内核。

它被广泛应用于微处理器、微控制器和DSP。对于移植,很多高手在网上都谢了心得,感谢那些无私奉献的人们。而且

在TI的官网上能够下载到Stellaris系列已经移植好的ucosII。我觉得对于做底层开发的来说,了解一个小型操作系统的内

核还是很有必要的,所以自己可以花点时间去研究一下。喜欢这个系统有两个原因,开源免费就不用说了,还有就是它

的高度稳定性,可靠性和安全性。对于一个完整的小型os来说,无疑稳定可靠性是它在市场上站住脚的关键。

       认识ucosII也有很长一段时间,开始使用ucosII还是看到坛子里的一个帖子。名字叫“一步一步教你使用uCOS-II组合”

大家可以在坛子里搜索一下,这里我就不再上传了。这真是一个不错的文章,对于一点不了解系统的朋友来说,是个宝贵

的财富。有了这个文章自己再写就有点班门弄斧,这里我就说说初学和使用ucosII的时候,应该注意和容易出错的地方。

 

 

 

第一步,当然是创建任务。

       先介绍几个函数。

创建任务OSTaskCreate(void(*task)(void*pd),void*pdata,OS_STK*ptos,INTU prio)

                  Task:是指向任务代码的指针,pdata:是任务开始执行时,传递给任务的参数的指针,ptos:
                  是分配给任务的堆栈的栈顶指针,prio 是分配给任务的优先级。

删除任务OSTaskDel()                   任务返回并处于休眠态,任务不再被UCOS 调用。

挂起任务OSTaskSuspend()          需要对任务做取消挂起的操作,并且等待延迟时间到,任务才能转让就绪状态。

恢复任务OSTaskResume()          挂起的任务只有通过该函数才能被恢复。

任务延迟函数OSTimeDly()           和SysCtlDelay()类似,只是在延时这段时间做任务调度。

延时函数OSTimeDlyHMSM()       按时,分,秒延时。

 

 

        弄清楚任务调度很关键。当调用函数OSTaskCreate()创建了多个不同优先级任务的时候,最高优先级的任务开始运行,

prio的数值越小,优先级越高。如果你未对其他任务做任何操作,则其他任务处于就绪状态。在最高优先级任务内调用函数

OSTimeDlyHMSM(),则在执行到该语句的时候开始任务调度,就绪状态中优先级最高者抢占任务,开始运行。当规定时间期满,

则刚才执行的任务进入就绪状态,抢占任务,恢复运行。这样就成功完成了一次任务调度。如果时钟节拍数很小,你所规定的

时间也很小的话,你的几个任务看上去就像是同步执行。

#include "inc/hw_types.h"
#include "inc/hw_memmap.h"
#include "driverlib/sysctl.h"
#include "inc/hw_nvic.h"
#include "driverlib/gpio.h"
#include "includes.h"
#include "uartstdio.h"

 

unsigned long TheSysClock=12000000UL;

 

static OS_STK task1_stk[128];
static OS_STK task2_stk[128];

 

void task1(void*arg);
void task2(void*arg);


void Uart_Init()
{
  SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG);//使能GPIOG
  SysCtlPeripheralEnable(SYSCTL_PERIPH_UART2);//使能uart2
  GPIOPinTypeUART(GPIO_PORTG_BASE,GPIO_PIN_0|GPIO_PIN_1);//使能GPIOG的Uart Pin
  GPIOPinConfigure(GPIO_PG0_U2RX);//配置引脚
  GPIOPinConfigure(GPIO_PG1_U2TX);
  UARTStdioInit(2);//配置波特率等
 
}


int main(void)
{
  SysCtlClockSet(SYSCTL_XTAL_8MHZ
                 |SYSCTL_SYSDIV_4
                 |SYSCTL_OSC_MAIN
                 |SYSCTL_USE_PLL);
 
  TheSysClock=SysCtlClockGet();
 
  Uart_Init();
    
  CPUcpsid();//关中断

  OSInit();//init the os; 
  
 
  OSTaskCreate(task1,0,(OS_STK*)&task1_stk[127],4);
  OSTaskCreate(task2,0,(OS_STK*)&task2_stk[127],5);
 
  OSStart();//start os;
}


void task1(void* arg)
{
  arg=arg;
  

  while(1)
 {                    
    UARTprintf("hello\n");
    SysCtlDelay(TheSysClock/3);
    OSTimeDlyHMSM(0,0,3,0); 
  }
}


void task2(void*arg)
{
 arg=arg;

 while(1)                                                                                  
 {     
   UARTprintf("eeword\n");

   SysCtlDelay(TheSysClock/3);

 }
}

 

       上面是我做测试用的一个程序。很遗憾,程序没有按照我预期的想法运行。找了很久原因,才发现自己忽略了对时钟节拍的初始化。

在任务里调用函数OS_CPU_SysTickInit()问题就解决了。可以说时钟节拍就好比操作系统的脉搏,如果你的开发板没有晶振,或者你并

未调用SysCtlClockSet(),你的板子是无法正常工作的。

      

        我接触ucosII时间也不长,还是一个菜鸟。不久前也学习ucosII实现了消息邮箱的使用,和上面的程序一样,依旧是通过uart进行检

验。很不好意思,换了电脑,那个程序现在找不到了,下次再把代码贴出来。

 

 

 

 

 

 

 

 
 
 

回复

4

帖子

0

TA的资源

一粒金砂(初级)

12
 

回复 11楼 baixichi 的帖子

期待期待
 
 
 

回复

146

帖子

0

TA的资源

一粒金砂(高级)

13
 

中文文档

[ lm3s6911中文版.pdf (5.7 MB, 下载次数: 162)

Cortex-M3权威指南Cn.pdf (9.88 MB, 下载次数: 178)

外设驱动库用户指南中文版.pdf (2.84 MB, 下载次数: 154)

[ 本帖最后由 baixichi 于 2011-9-15 12:27 编辑 ]
 
 
 

回复

7

帖子

0

TA的资源

一粒金砂(中级)

14
 

回复 13楼 baixichi 的帖子

楼主强大,,支持支持
 
 
 

回复

7

帖子

0

TA的资源

一粒金砂(中级)

15
 

回复 11楼 baixichi 的帖子

lz无私
 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

16
 

回复 楼主 baixichi 的帖子

新手上道,,谢谢分享
 
 
 

回复

118

帖子

0

TA的资源

一粒金砂(中级)

17
 
很好啊感谢
 
 
 

回复

146

帖子

0

TA的资源

一粒金砂(高级)

18
 

ucosii

ucos2.rar (5.98 MB, 下载次数: 87)
 
 
 

回复

7228

帖子

192

TA的资源

五彩晶圆(高级)

19
 
IAR编译器啊 没怎么用
 
 
 

回复

146

帖子

0

TA的资源

一粒金砂(高级)

20
 

回复 19楼 常见泽1 的帖子

IAR是比较好用的,建议试试
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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