来分享一下我学习LM3S811的趣事……
我是通过参加TI M3 DAY 获得LM3S811评估板的,拿到板子后心情很是激动,于是就立刻投入了学习中。
开始没有看任何PDF的介绍就尝试着把软件附带的例程下载进了芯片中,有一个例程是JTAG-GPIO,这个例程下进去后接着就不能再下载别的例程了,那时候估计是锁住了,心想这下完蛋了,可是当我重装了驱动后竟然奇迹般的好了,后来我认真地看了看《JTAG防锁死和LM3S系列几个基本例程》,还有看了看在网上找到了M3的资料,看后第一感觉是M3其实并没有传说中的那么难学,倒是感觉很容易学的。
仅仅玩单片机无非就是对寄存器的配置(比如PX=0X…),但是玩M3不是这样的,编写M3的程序时主要是对函数的调用,对有参函数进行参数设置和匹配以及灵活运用带有返回值的函数,但是一系列函数的原型我还无从得知,我猜应该在driverlib.lib中。
关于JTAG的防锁死功能其实是很简单同时又很有趣的:
#define KEY_PERIPH SYSCTL_PERIPH_GPIOC //宏定义 加强程序的可读性
#define KEY_PORT GPIO_PORTC_BASE
#define KEY_PIN GPIO_PIN_4
void JtagWait(void)
{
SysCtlPeripheralEnable(KEY_PERIPH); // 使能KEY所在的GPIO端口 (GPIO C)
GPIOPinTypeGPIOInput(KEY_PORT, KEY_PIN); // 设置KEY所在管脚为输入
if (GPIOPinRead(KEY_PORT, KEY_PIN) == 0x00) // 若复位时按下KEY,则进入
{ while(1); } // 死循环,以等待JTAG连接
GPIOPinIntDisable(KEY_PERIPH,KEY_PIN); // 禁止KEY所在的GPIO端口中断
}
LM3S811评估板上用户按键是PC4 JtagWait函数放在主程序的首位置。
当复位后先判断按键,如果没有按下程序继续向下执行,如果按下则死循环等待。
试想一下如果将JTAG作为GPIO后程序将不能下载进去,如果程序中加入JtagWait函数,那么先按下复位键再按下用户键然后松开复位键(此时保持用户键按下少许),则此时程序停在while(1);处,这时候JTAG并没有作为GPIO,因为程序停在while(1);处而并没有执行后面的程序(后面的程序将JTAG当做GPIO使用了),然后接着下载你编好的程序(有时候会不太灵敏,多试几次就好了)
有了JtagWait函数后就不用再担心芯片被锁死了。
后来又编写了几个流水灯程序,算是稍稍入门了。(当然我觉得入门单片机的基础是学会 1时钟部分 2定时器 3中断) 呵呵 个人见解
前几天用M3做了一款乒乓球游戏(在TFT彩屏上面实现的)
做这款游戏使用到M3的内部资源有TIMER0和TIMER1及其中断、外部中断(用来进行键盘输入)等,游戏分为四关,每一关速度递增(通过配置晶振来实现)。
当然做的过程中也是遇到了好多困难。
比如开始时我的外部中断用的GPIO是PB0和PB1,老是不能进入中断导致球拍不能运动,后来发现PB0和PB1连接的是LED,后来把外部中断换为了PB2和PB3,总算好了。
//******************************GPIOB中断服务函数******************************************
void GPIO_Port_B_ISR(void)
{
unsigned long ulStatus;
ulStatus = GPIOPinIntStatus(GPIO_PORTB_BASE, true); // 读取中断状态
GPIOPinIntClear(GPIO_PORTB_BASE, GPIO_PIN_2|GPIO_PIN_3); // 清除中断状态,重要
if (ulStatus & GPIO_PIN_2) // 如果PB0 的中断状态有效
{
TimerEnable(TIMER1_BASE, TIMER_A);/*启动定时器1*/
racket_dir=0;/*球拍朝左运动*/
}
if (ulStatus & GPIO_PIN_3) // 如果PB1 的中断状态有效
{
TimerEnable(TIMER1_BASE, TIMER_A);/*启动定时器1*/
racket_dir=1;/*球拍朝右运动*/
}
}
当球拍没有接到球后就进入死循环,后来想了一下为什么不把死循环换为睡眠状态呢,不错就睡眠状态,呵呵 低功耗嘛
今晚就先写到这里吧…………