关于lm3s6911的学习笔记
我所使用的板子是之前做一个“基于ARM的RFID读卡器”项目留下来的,当时对于ARM,cortex-M3,TI都了解甚少,可以说是就听过这个名字。
当时就只是看文档,看着那些英文头都大了,从lm3s6911的datasheet到外设驱动库,在一点一点的接触和学习中,算是弄明白了一个工程的开发
流程。在开始编程之前,熟悉编译器是很必要的,我所选用的是IAR,下面是IAR上手的两个文档
第一个程序是一个点亮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移植进去。。。
未完,待续