打印

LM3S811使用心得之四---关于定时器外部中断SSI模块的综合应用

[复制链接]
7466|38
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
nwx8899|  楼主 | 2011-12-7 19:24 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 nwx8899 于 2011-12-28 20:48 编辑

LM3S811使用心得之四

-----关于定时器、外部中断、SSI模块的综合应用





利用LM3S811定时器、外部中断、SSI模块等功能制作了一个自行车测速装置。本作品使用LM3S811单片机通过开关型霍尔传感器A04E检测车轮的转数,利用SSI(同步串行通信)模块向两片级联的74HC595发送16位的数据来驱动六位数码管,其中高八位用于片选,低八位用于段选。通过一个按钮来切换显示速度和里程。


1系统方案
1.1 电源由于LM3S811的工作电压是3.3V,所以直接采用两节5号干电池供电。
1.2 显示由于速度与里程的范围:0~40.010~700.1,只需5位即可显示。所以用23位的数码管吗组成16位的,其中第一位分别显示U和L代表速度和里程。
1.2 检测采用外部中断当单片机检测到下降沿时,计数值加一。每隔一秒计算一次速度。
2系统理论分析与计算2.1 数码管显示
6个数码管的段选并联,由U1控制;U2的低6位用作片选码。数据帧的大小为16位,其中0~7位为段选码,第8~13用于片选码LM3S811在上电时,所有GPIO引脚默认为输入,软件设计根据应用要求配置GPIO引脚。
在使用SSI时,需通过对RCGC1寄存器中的SSI位置位使能SSI外设时钟。配置SSI为主机模式,协议模式为Freescale SPI单次传输模式。
为了切换显示速度和里程,分别用定时器1和定时器2定时中断,不断刷新数码管。外加一个按钮,当键按下时初始化定时器1,显示里程;否则只初始化定时器2,显示速度。
2.2
计算速度与里程
在车轮一周上均匀放置6个磁钢,假设车轮半径0.5m,则车轮转一周为π m每两个磁钢之间的距离位π/6 m。磁钢检测采用外部中断,每中断一次计数器加

1。再用定时器0定时中断,每隔一秒计算一次速度,v=counter*π/6 m/s转换成V=v*3.6 km/h,里程mile则一直累加。

3电路与程序设计
3.1 数码管显示电路




3.2
程序的设计


3.2.1程序流程图





file:///C:/Users/ADMINI~1/AppData/Local/Temp/ksohtml/wps_clip_image-7826.png

file:///C:/Users/ADMINI~1/AppData/Local/Temp/ksohtml/wps_clip_image-22632.png



file:///C:/Users/ADMINI~1/AppData/Local/Temp/ksohtml/wps_clip_image-10873.png







3.2.2程序

程序用C语言编写,由主程序、外中断0服务程序,T0中断服务程序、T1中断服务程序等模块组成。主程序主要完成程序初始化和键盘处理,外部中断朋及务程序由测量、计算、读数等部分组成,T0中断服务程序由计时、动态扫描显示、自行车停车判断等部分组成。


4 注意事项4.1 关于中断服务函数所谓的注册中断函数,这里采用直接修改启动代码startup.s的方式。就是找到对应的中断源,然后把默认的中断服务函数名改成自己定义的即可。


4 最后效果


附录:源程序#include"hw_memmap.h"
#include"hw_types.h"
#include"ssi.h"
#include"hw_ints.h"
#include"sysctl.h"
#include"gpio.h"
#include"timer.h"
#include"interrupt.h"
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long
uchar disp_buf[6];
uchar disp_buf1[6];
uchar disp_tab[13]={0x003f,0x0006,0x005b,0x004f,0x0066,0x006d,0x007d,0x0007,0x007f,0x006f,0x003e,0x0038,0x0080};
ulong TheSysClock=6000000;
float  temp;
ulong  num,counter,speed,mile;
uchar v_qian,v_bai,v_shi,v_ge,l_qian,l_bai,l_shi,l_ge;
ulong ulClock,ulBitRate;
#define  PULSE_PERIPH SYSCTL_PERIPH_GPIOD
#define  PULSE_PORT   GPIO_PORTD_BASE
#define  PULSE_PIN    GPIO_PIN_4
void ssiInit(void)
{  ulBitRate=TheSysClock/10;
   SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI0);//使能SSI模块
   SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);//使能SSI所在引脚
   GPIOPinTypeSSI(GPIO_PORTA_BASE, GPIO_PIN_2);//(SSI0CLK_PORT, SSI0CLK_PIN);//将相关GPIO设置为SSI功能
   GPIOPinTypeSSI(GPIO_PORTA_BASE, GPIO_PIN_3);//PA3  SSI0FSS_PORT
   GPIOPinTypeSSI(GPIO_PORTA_BASE, GPIO_PIN_4);//PA4  SSI0RX_PORT
   GPIOPinTypeSSI(GPIO_PORTA_BASE, GPIO_PIN_5);//PA5  SSI0TX_PORT
   SSIConfig(SSI0_BASE, SSI_FRF_MOTO_MODE_0, SSI_MODE_MASTER, ulBitRate, 16);//SSI配置:基址,协议格式,主/从模式,位速率,数据宽度
   SSIEnable(SSI0_BASE);//  使能SSI收发
}
void timer2AInit()
{   ulClock = TheSysClock/150;// (60 * 8);//扫描速度在60Hz以上时,人眼才不会明显感到闪烁
    SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER2);     //使能Timer模块

TimerConfigure(TIMER2_BASE,TIMER_CFG_32_BIT_PER);//配置为32位周期定时器

TimerPrescaleSet(TIMER2_BASE,TIMER_BOTH,100);//配置分频值
    TimerLoadSet(TIMER2_BASE, TIMER_A, ulClock);    //  设置Timer初值

TimerIntEnable(TIMER2_BASE, TIMER_TIMA_TIMEOUT);//  使能Timer超时中断


IntEnable(INT_TIMER2A);                         //  使能Timer中断
    IntMasterEnable();                              //  使能处理器中断
    TimerEnable(TIMER2_BASE,TIMER_A);//使能TIMER0A
}
IntEnable(INT_TIMER1A);                         //  使能Timer中断
    IntMasterEnable();                              //  使能处理器中断
    TimerEnable(TIMER1_BASE,TIMER_A);//使能TIMER0A
}
//定时器0初始化
void timer0AInit()
{   ulClock = TheSysClock/10 ;// (60 * 8);//扫描速度在60Hz以上时,人眼才不会明显感到闪烁
    SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);     //使能Timer模块

TimerConfigure(TIMER0_BASE,TIMER_CFG_32_BIT_PER);//配置为32位周期定时器

TimerPrescaleSet(TIMER0_BASE,TIMER_BOTH,100);//配置分频值
    TimerLoadSet(TIMER0_BASE, TIMER_A, ulClock);    //  设置Timer初值

TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT);//  使能Timer超时中断

IntEnable(INT_TIMER0A);                         //  使能Timer中断
    IntMasterEnable();                              //  使能处理器中断
    TimerEnable(TIMER0_BASE,TIMER_A);//使能TIMER0A
}
//系统时钟初始化
void systeminit()
{   SysCtlClockSet(SYSCTL_SYSDIV_1|SYSCTL_USE_OSC|SYSCTL_OSC_MAIN|SYSCTL_XTAL_6MHZ);

SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC|PULSE_PERIPH);

GPIOPinTypeGPIOInput(PULSE_PORT,PULSE_PIN);//设置磁块检测PD4为输入

GPIOIntTypeSet(PULSE_PORT, PULSE_PIN,GPIO_FALLING_EDGE);//GPIO_LOW_LEVEL);

GPIOPinIntEnable(PULSE_PORT, PULSE_PIN);

IntEnable(INT_GPIOD);
}
void GPIO_D_IntHandler(void)
{
ulong ulstatus;
ulstatus=GPIOPinIntStatus(PULSE_PORT,true);//读取中断状态
GPIOPinIntClear(PULSE_PORT,ulstatus);
if(ulstatus&PULSE_PIN)
{counter++;}
}

int main()
{
jtagwait();//等待jtag



systeminit();

timer0AInit();

ssiInit();

while(1)

{

if(num==10)//每一秒计算一次


{




{temp=counter*31.41/6;


speed=temp*36;
//m/s换成km/h


temp=temp*0.01;


mile=mile+temp;   





}


num=0;


counter=0;


}  


if (GPIOPinRead(GPIO_PORTC_BASE, GPIO_PIN_4) == 0x00)//若按下KEY,则显示里程,否则显示速度
          {timer2AInit();}

  else

      {timer1AInit();}
}


}
void Timer2ATimeoutIntHandler(void) //中断服务
{
TimerIntClear(TIMER2_BASE,TIMER_TIMA_TIMEOUT);//清楚中断标志位

v_qian=speed/1000;v_bai=speed/100%10;v_shi=speed/10%10;v_ge=speed%10;

disp_buf[0]=10;disp_buf[1]=v_qian;disp_buf[2]=v_bai;disp_buf[3]=12;disp_buf[4]=v_shi;disp_buf[5]=v_ge;

SSIDataPut(SSI_BASE,0xfe00|(disp_tab[disp_buf[0]]));

SysCtlDelay(1* (SysCtlClockGet( )/ 3000));

SSIDataPut(SSI_BASE,0xfd00|disp_tab[disp_buf[1]]);

SysCtlDelay(1* (SysCtlClockGet( )/ 3000));

SSIDataPut(SSI_BASE,0xfb00|disp_tab[disp_buf[2]]);

SysCtlDelay(1* (SysCtlClockGet( )/ 3000));

SSIDataPut(SSI_BASE,0xf700|disp_tab[disp_buf[3]]);

SysCtlDelay(1* (SysCtlClockGet( )/ 3000));

SSIDataPut(SSI_BASE,0xef00|disp_tab[disp_buf[4]]);

SysCtlDelay(1* (SysCtlClockGet( )/ 3000));

SSIDataPut(SSI_BASE,0xdf00|disp_tab[disp_buf[5]]);

SysCtlDelay(1* (SysCtlClockGet( )/ 3000));

}
void Timer1ATimeoutIntHandler(void)
{    TimerIntClear(TIMER1_BASE,TIMER_TIMA_TIMEOUT);

l_qian=mile/1000;l_bai=mile/100%10;l_shi=mile/10%10;l_ge=mile%10;

disp_buf1[0]=11;disp_buf1[1]=l_qian;disp_buf1[2]=l_bai;disp_buf1[3]=l_shi;disp_buf1[4]=12;disp_buf1[5]=l_ge;



SSIDataPut(SSI_BASE,0xfe00|(disp_tab[disp_buf1[0]]));

SysCtlDelay(1* (SysCtlClockGet( )/ 3000));

SSIDataPut(SSI_BASE,0xfd00|disp_tab[disp_buf1[1]]);

SysCtlDelay(1* (SysCtlClockGet( )/ 3000));

SSIDataPut(SSI_BASE,0xfb00|disp_tab[disp_buf1[2]]);

SysCtlDelay(1* (SysCtlClockGet( )/ 3000));

SSIDataPut(SSI_BASE,0xf700|disp_tab[disp_buf1[3]]);

SysCtlDelay(1* (SysCtlClockGet( )/ 3000));

SSIDataPut(SSI_BASE,0xef00|disp_tab[disp_buf1[4]]);

SysCtlDelay(1* (SysCtlClockGet( )/ 3000));

SSIDataPut(SSI_BASE,0xdf00|disp_tab[disp_buf1[5]]);

SysCtlDelay(1* (SysCtlClockGet( )/ 3000));
}

shumaguna.jpg (451.38 KB )

shumaguna.jpg

电路图.gif (94.14 KB )

电路图.gif
评分
参与人数 2威望 +2 收起 理由
414779421 + 1
568581185 + 1 楼主很用心

相关帖子

沙发
nwx8899|  楼主 | 2011-12-7 19:45 | 只看该作者
本帖最后由 nwx8899 于 2011-12-28 20:45 编辑

就这样吧,大家看吧。。。
离12.17号就10天了,想想苦逼的英语六级,单词又没背。。。。。。。。

使用特权

评论回复
板凳
nwx8899|  楼主 | 2011-12-7 19:47 | 只看该作者

LM3S811使用心得之四定时外部中断SSI模块的综合应用

本帖最后由 nwx8899 于 2011-12-7 19:50 编辑

:)

同步串行接口(SSI).pdf

192.71 KB

74HC595中文资料.pdf

4.43 MB

A04E.pdf

306.46 KB

使用特权

评论回复
地板
nwx8899|  楼主 | 2011-12-7 19:48 | 只看该作者
附件又传不上来了

使用特权

评论回复
5
nwx8899|  楼主 | 2011-12-7 19:52 | 只看该作者
本帖最后由 nwx8899 于 2011-12-28 20:46 编辑

源码

使用特权

评论回复
6
nwx8899|  楼主 | 2011-12-7 21:47 | 只看该作者
本帖最后由 nwx8899 于 2011-12-7 21:50 编辑

流程图

使用特权

评论回复
7
fengzhongfeiwu| | 2011-12-7 22:08 | 只看该作者
有源码:shutup:

使用特权

评论回复
8
nwx8899|  楼主 | 2011-12-8 08:37 | 只看该作者
、、

使用特权

评论回复
9
tianm| | 2011-12-8 08:42 | 只看该作者
本帖最后由 tianm 于 2011-12-8 09:58 编辑

有人不同意我说的观点  我还是改了吧 哈哈

使用特权

评论回复
10
永远的不知| | 2011-12-8 10:02 | 只看该作者
楼主整理了不少资料啊,鼓励一下

使用特权

评论回复
11
nwx8899|  楼主 | 2011-12-8 12:16 | 只看该作者
感谢二位斑竹,一起再灌一次水吧。。。
只是鄙人的手长的比较挫。吓到tianm斑竹了。。。绝非什么MM的手

使用特权

评论回复
12
czdo| | 2011-12-8 12:23 | 只看该作者
真的是要感谢一下楼主。对我们这些初学者很有帮组啊

使用特权

评论回复
13
qixiyi| | 2011-12-8 12:36 | 只看该作者
不错,很棒!

使用特权

评论回复
14
nwx8899|  楼主 | 2011-12-8 16:15 | 只看该作者
12# czdo 同时初学者,还有好多问题呢
哎呀不小心又灌水了:Q

使用特权

评论回复
15
liugp25| | 2011-12-8 16:24 | 只看该作者
楼主有心 灌水就灌水吧

使用特权

评论回复
16
nwx8899|  楼主 | 2011-12-8 19:23 | 只看该作者
:handshake 15# liugp25

使用特权

评论回复
17
专注力5| | 2011-12-8 21:04 | 只看该作者
这个帖子不错 顶一下 感谢分享啊

使用特权

评论回复
18
nwx8899|  楼主 | 2011-12-8 21:31 | 只看该作者
:) 17# 专注力5

使用特权

评论回复
19
jyz0025338| | 2011-12-8 22:06 | 只看该作者
楼主给力,真的做出些实践

使用特权

评论回复
20
568581185| | 2011-12-8 22:09 | 只看该作者
:)高人
继续关注

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名: 宁静致远

61

主题

805

帖子

2

粉丝