关于lm3s811代码全解析.pdf
*注:未指明返回值的函数为无返回值,资源来自周立功单片机网站一:GPIO函数1:void GPIODirModeSet(unsigned long ulPort,unsigned char ucPins,unsigned long ulPinlO)设置所选GPIO端口指定管脚的方向和模式如 GPIODirModeSe(GPIO_PORTA_BASE,GPIO_PIN_2,GPIO_DIR_MODE_IN)函数设置PA2为输入,但第三个参数为KGPIO_DIR_MODE_HW/硬件控制”时指此管脚启用第二功能;2:unsigned long GPIODi rModeGet(unsigned long ulPort,unsigned charucPin)获取所选GPIO端口指定管脚的方向和模式如 unsigned long SetValue=GPIODirModeGet(GPIO_PORTA_BASE,GPIO_PIN_2);返回PA2脚的方向和模式,返回的值为上一个函数第三个参数的取值,分别为GPIO-DIR_MODE_IN/输入方向GPI0-DIR-M0DE_0UT/输出方向GPI0_DIR_M0DE_HW/硬件控制3:void GPIOPadConfigSet(unsigned long ulPort,unsigned char ucPins,unsigned long ulStrength,unsigned long ulPadType)设置所选GPIO端口指定管脚的驱动强度和类型如 GPIOPadConfigSet(GPIO_PORTA_BASE,GPIO-PIN.2,GPIO-STRENGTH_4MA,GPIO-PIN_TYPE_STD)设置 PA2 脚的驱动强度为 4MA 的推挽输出;ulStrength:指定输出驱动强度,应当取下列值之一:GPI0-STRENGTH_2MA/GPI0.STRENGTH_4MA/GP10_STRENGTH_8MA/GPI0_STRENGTH_8MA_SC2mA驱动强度4mA驱动强度8mA驱动强度/带转换速率(Slew Rate)控制的8mA驱动ulPadType:指定管脚类型。应当取下列值之一:GPTO-PIN_TYPE_STD/推挽GPIO-PIN-TYPE-STD-WPU/带弱上拉的推挽GPIO_PIN_TYPE_STD_WPD/带弱下拉的推挽GPIO_PIN_TYPE_OD/开漏GPIO-PIN-TYPE-OD-WPU/带弱上拉的开漏GPIO_PIN-TYPE-OD_WPD/带弱下拉的开漏GP1O_PIN_TYPE_ANALOG/模拟比较器4:void GPIOPadConfigGet(unsigned long ulPort,unsigned char ucPin,unsigned long*pulStrength,unsigned long*pulPadType)获取所选GPIO端口指定管脚的配置信息如 GPIOPadConfigGet(GPIO-PORTA-BASE,GPIO-PIN_2,pulStrength,pulPadType);输出驱动强度信息保存到pulStrength指向的地址中,输出驱动类型信息保存到pulPadType指向的地址中,返回的值为上一个函数设置的内容。5:void GPIOPinTypeGPIOInput(unsigned long ulPort,unsigned charucPins)设置所选GPIO端口指定的管脚为高阻输入模式如 GPIOPinTypeGPIOInput(GPIO-PORTA.BASE,GPIO-PIN.2);设置 PA2 脚为高阻输入模式6:void GPIOPinTypeGPIOOutput(unsigned long ulPort,unsigned charucPins)设置所选GPIO端口指定的管脚为推挽输出模式如 GPIOPinTypeGPIOOutput(GP1O_PORTA_BASE,GP1O_PIN_2)设置 PA2 脚为推挽输出模式7:void GPIOPinTypeGPIOOutputOD(unsigned long ulPort,unsigned charucPins)设置所选GPIO端口指定的管脚为开漏输出模式如 GPIOPinTypeGPIOOutputOD(GPIO_PORTA_BASE,GPIO_PIN_2)设置 PA2 为开漏输出模式但由于函数5,6,7函数名太长一般做如下简化:#define GPIOPinTypeln GPIOPinTypeGPIOInput#define GPIOPinTypeOut GPIOPinTypeGPIOOutput#define GPIOPinTypeOD GPIOPinTypeGPIOOutputOD8:void GPIOPinTypeADC(unsigned long ulPort,unsigned char ucPins)设置所选GPIO端口指定的管脚为ADC功能这个函数只对有adc功能复用的管脚有用如LM3s811的1,2,3,4脚。9:void GPIOPinTypeCAN(unsigned long ulPort,unsigned char ucPins)设置所选GPIO端口指定的管脚为CAN功能10:void GPIOPinTypeComparator(unsigned long ulPort,unsigned charucPins)设置所选GPIO端口指定的管脚为CAN功能11:void GPIOPinTypeComparator(unsigned long ulPort,unsigned charucPins)设置所选GPIO端口指定的管脚为模拟比较器功能12:void GPIOPinTypeI2C(unsigned long ulPort,unsigned char ucPins)设置所选GPIO端口指定的管脚为12c功能13:void GPIOPinTypePWM(unsigned long ulPort,unsigned char ucPins)设置所选G P I O端口指定的管脚为P W M功能1 4:v o i d G P I O P i n Ty p e Q E I(u n s i g n e d l o n g u l P o r t,u n s i g n e d c h a r u c P i n s)设置所选G P I O端口指定的管脚为Q E I功能1 5:v o i d G P I O P i n Ty p e S S I (u n s i g n e d l o n g u l P o r t,u n s i g n e d c h a r u c P i n s)设置所选G P I O端口指定的管脚为S S I功能1 6:v o i d G P I O P i n Ty p e Ti m e r (u n s i g n e d l o n g u l P o r t,u n s i g n e d c h a r u c P i n s)设置所选G P I O端口指定的管脚为Ti m e r的C C P功能 1 7:v o i d G P I O P i n Ty p e U A R T(u n s i g n e d l o n g u l P o r t,u n s i g n e d c h a r u c P i n s)设置所选G P I O端口指定的管脚为U A R T功能1 8:v o i d G P I O P i n Ty p e U S B D i g i t a l (u n s i g n e d l o n g u l P o r t,u n s i g n e d c h a ru c P i n s)设置所选G P I O端口指定的管脚为U S B数字功能对G P I O管脚的读写操作是通过函数G P I O P i n W r i t e()和G P I O P i n R e a d()实现的,这是两个非常重要而且很常用的库函数。1 9:v o i d G P I O P i n W r i t e (u n s i g n e d l o n g u l P o r t,u n s i g n e d c h a r u c P i n s,u n s i g n e d c h a r u c V a 1);向所选G P I O端口的指定管脚写入一个值,以更新管脚状态,u c V a l:写入指定管脚的值注:u c P i n s指定的管脚对应的u c V a l当中的位如果是1,则置位相应的管脚,如果是0,则清零相应的管脚;u c P i n s未指定的管脚不受影响。如 G P I O P i n W r i t e(G P I O-P O R TA _ B A S E,G P I O-P I N.3,0 x 0 0);/清除 P A 3G P I O P i n W r i t e(G P I O _ P O R TB _ B A S E,G P I O P i n W r i t e(G P I O _ P O R TD _ B A S E,时置位P D 2、P D 6G P TO P i n W r i t e(G P I O-P O R TA _ B A S E,P A 0-P A 72 0:l o n g G P I O P i n R e a d (u n s i g n e dG P I O _ P I N _ 5,O x F F);/置位 P B 5G P I O-P I N-2|G P I O-P I N _ 6,O x F F);/同O x F F,u c D a t a);/变量 u c D a t a 输出到l o n g u l P o r t,u n s i g n e d c h a r u c P i n s)读取所选G P I O端口指定管脚的值,返回1个位组合的字节。该字节提供了由u c P i n s指定管脚的状态,对应的位值表示G P I O管脚的高低状态。u c P i n s未指定的管脚位值是0。返回值已强制转换为l o n g型,因此位3 1:8应该忽略。这个函数应该在相应管脚已经设置为输出状态的情况下,由于G P I O得管脚结构我们知道在输出模式下,不管是开漏还是推挽用此函数读回来的值都是管脚的输出锁存值,如/读取P A4,返回值保存在u c Da t a里,可能的值是0 x 0 0或0 x 10u c Da t a =GP I O P i n R e a d(GP I O _ P O R T A_ BAS E,GP I 0 _ P I N_ 4);/同时读取P B1、P B2和P B6,返回P B L P B 2和P B6的位组合保存在u c Da t a里ucData=GPIOPinRead(GPIO-PORTB.BASE,GPIO-PIN.l|GPIO-PTN.2 IGPIO-PIN-6);/读取整个PF端口ucData=GPIOPinRead(GPIO-PORTF.BASE,OxFF);在S t e lla r is系 列ARM里,每 个GPIO管脚都可以作为外部中断输入。中断的触发类型分为边沿触发和电平触发两大类,共5种,用起来非常灵活。配置GPIO管脚的中断触发方式可以通过调用函数GPIOIntTypeSet()来实现,函数GPIOlntTypeGet()用来获取配置情况。函数GPIOPinlntEnable()和GPIOPinIntDisable()用来使能和禁止GPIO管脚中断。函数GPIOPinIntStatus()用来获取GPIO管脚的中断状态.在同一个GPIO端口上,8个GPIO管脚的中断向量都是共用的。如果同时配置了同一端口上的多个管脚中断,则可以先利用函数GPIOPinIntStatus()读取中断状态,再进一步确认具体是哪个管脚产生的中断请求。函数GPIOPinIntClear()用来及时清除GPIO管脚的中断状态。函GPIOPortIntRegister()用来注册一个GPIO端口中断服务函数,而注销的方法是调用函数GPlOPortlntUnregister()。2012CSDN网站六大类职位火热招聘中!点击了解英特尔云计算2012年1月当选微软MVP的CSDN会员名单揭晓!Im3s811学习笔记(四)gpio分类:cortex m32011-08-03 15:24295人阅读评论(0)收藏举报今天主要是熟悉下gp io的一些应用。最简单的就是LED灯的控制。下面的例子就拿L5来说明吧。SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);/enable gpio bGPIOPinTypeGPIOOutput(GPIO-PORTB-BASE,GPIO-PIN-O);/set PBO output还有一种模式设置的方法 GPIODirModeSet(GPIO_PORTB_BASE,GPIO_PIN_0,GPIO_DIR_MODE_OUT);/这个方案可以设置多个引脚,参数2为位引脚的或控制LED灯地亮灭,就是往引脚写入值ledstatus=GPIOPinRead(GPIO_PORTD_BASE,GPIO_PIN_0);GPIOPinWr i te(GPIO-PORTD.BASE,GPIO-PIN_0,GPIO-PIN_0&Cledstatus);上面的程序是读取L5对应管脚的值,然后使灯地状态进行翻转。这里说下GPIOPinWriteO该函数的用法。GPIOPinWrite(GPIO_PORTD_BASE,GPIO_PIN_1,GPIO_PIN_1);GPIOPinWrite(GPIO_PORTD_BASE,GPIO_PIN_1,_GPIO_PIN_1);例程上常用上面的方法。主要也就是你要让哪个管脚置一,参数3的值中管脚对应的位必须置一。如下各条指令都能点亮响应端口(假设已经都定义成输出了)。GPIOPinWrite(GPIO-PORTD-BASE,GPIO-PIN-O,1);GPIOPinWrite(GPIO_PORTD_BASE,GPIO_PIN_1,2);GPIOPinWrite(GPIO-PORTD.BASE,GPIO-PIN.2,4);GPIOPinWrite(GPIO_PORTD_BASE,GPIO_PIN_3,8);GPIOPinWrite(GPIO-PORTD.BASE,GPIO-PIN.4,0 x10);GPIOPinWrite(GPIO_PORTD_BASE,GPIO_PIN_5,0 x20);GPIOPinWrite(GPIO-PORTD.BASE,GPIO-PIN.6,0 x40);GPIOPinWrite(GPIO_PORTD_BASE,GPIO_PIN_7,0 x80);下面我主要讲述下键控LED的流程,其实就是利用按键中断控制灯的亮灭。首先是配置KEY。SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);/Enable GPIO CGPIOPinIntEnable(GPIO-PORTC-BASE,GPIO-PIN.4);/Enable GPIO C pin 4GPIOPinTypeGPIOInput(GPIO_PORTC_BASE,GPI0_PIN_4);/set the pin mode isinputGPIOIntTypeSet(GPIO-PORTC-BASE,GPIO_PIN_4,GPIO_LOW_LEVEL);/setinterrupt type is low Falling edgeIntEnable(INT-GPIOC);/enable GPIO C interrupt下面是按键中断的处理函数void userkey-handler(void)(unsigned char ucVal;unsigned long ulStatus;ulStatus=GPIOPinlntStatus(GPIO_PORTC_BASE,true);/get gpio cinterrupt statusGPIOPinlntClear(GPIO_PORTC_BASE,ulStatus);/clear interrupt statusif(ulStatus&GPIO-PIN_4)/如果 K EY 的中断状态有效ucVal =GPIOPinRead(GPIO-PORTD_BASE,GPIO_PIN_0);/翻转 LEDGPIOPinWr ite(GPIO-PORTD_BASE,GPIO-PIN-O,ucVal);Sy sCtl Del ay(1 0 *(Sy sCtICl o ck Get 0 /3 0 0 0);/延时约)0 m s,消除按键抖动whil e(GPIOPinRead(GPIO-PORTC.BASE,GPIO_PIN_4)=0 x 0 0);/等待 KEY抬起Sy sCtl Del ay(1 0 *(Sy sCtICl o ck Get 0 /3 0 0 0);/延时约 1 0 m s,消除松键抖动)既然用到了 Sy sCtl Del ay O函数。在这里也顺道分析下。#if defined(ewar m)|def ined(DOXYGEN)iar 环境下vo idSy sCt1 De l ay (unsigned l o ng ul Co unt)(_asm(subs r O,#l nHbne.n Sy sCtl Del ay nnbx l rH);)#endif#if defined(co der ed)I I defined(gcc)I I defined(so ur cer y gx x)/co der ed.gcc、so ur cer y gcc 环境下vo id-.attr ibute-(nak ed)Sy sCt1 De l ay (unsigned l o ng ul Co unt)(_asm(subs r O,#l nHbne Sy sCtl Del ay nnbx l rH);)#endif#if defined(r vm dk)|I defined(-ARMCC_VERSION)/k ei 1 MDK 环境下一asm vo idSy sCt1 De l ay (unsigned l o ng ul Co unt)(subs r O,#1;bne Sy sCtIDel ay;bx Ir;)#endif#if defined(ccs)/ccsvolatile unsigned long g_ulIniineCCSWorkaround;voidSysCtIDelay(unsigned long ulCount)(-asm(delay?:subs rO,#ln bne.n delay?n bx lrnn);/This is needed to keep TI compiler from optimizing away this code./g_ulIniineCCSWorkaround+=ulCount;)#endifSysCtlDelayO执行了 3个汇编语句,运行时间3个始终周期。函数说明上:Theloop takes 3 cycles/loop.1、在主晶振6MHz的情况下SysCtIDelay(2);delaytime=2*3*(1/6000000)=lusSysCtIDelay(10*(TheSysClock/3000);delaytime=10*(6000000/3000)*3*(1/6000000)=10ms2、在主晶振8MHz的情况下SysCtIDelay(2);delaytime=2*3*(1/8000000)=0.75usSysCtlDelay(10*(TheSysClock/3000);delaytime=10*(8000000/3000)*3*(1/8000000)=10ms由 此 可以看出无论是多大的晶振,都是除以3000。SysCtlDelayClO*(TheSysClock/3000);这种写法也方便移植Im3s811点亮LED或流水灯程序1急求!2010-8-6 17:41提问者:luxiahua42751 1 悬赏分:5 浏览次数:525次谢 谢 了 啊!刚开始学ARM又没有实际的程序!谢谢帮忙了210239343luxiahua427511luxiahua427511Im3s811 点亮 LED015 I推荐答案2010-8-15 12:34#include systemlni t.h/定 义LED#define LED-PERIPH#define LED.PORT#define LED-PINSYSCTL_PERIPH_GPTOAGPIO_PORTA_BASEGPIO-PIN.2/主函数(程序入口)int main(void)(jtagWait();AG失效,重要!clocklni t();初始化:晶振,6M HzSysCtlPeriEnable(LED-PERIPH);LED所在的GPIO端口GPIOPinTypeOut(LED.PORT,LED-PIN);LED所在管脚为输出/防止/时钟/使能/设置for(;)(GPIOPinWrite(LED_PORT,LED-PIN,0 x00);/点亮 LED/SysCtlDelay(1000000);/延时SysCtlDelayClOOO*(SysCtIClockGet()/3 6000);/延时1000 m sGPIOPinWrite(LED_PORT,LED-PIN,OxFF);/熄灭 LED/SysCtlDelay(lOOOOOO);/延时Sy sCtl Del ay Cl OOO*(Sy sCtICl o ck Get()/3 0 0 0);/延时1 0 0 0 m s)最基本的一个例程,已调试通过(sy stem l nit.C的口该一下,8n没G 口的)。你可以去zig网站上去找找资料,那里的例程很多,很适合新手。我也才刚刚开始学,一起努力了。0评论回复:青风和大家一起学S t e l l a r i s系列A R M 九.A D C转换。程序演示:分别完成三种A D C变化:程序一:内部温度测试;程序二:单端采样;程序三:差分采样;内部温度测试:在S t e l l a r i s系列的A D C模块里,附带了一个内置的温度传感器,能够随时检测芯片的温度。该温度传感器可以有以下用途:1测试用:在单独测试A D C模块的功能时,而不必提供外部的模拟信号源2测量芯片自身温度,防止可能出现的过温(高温应用场合必备)3估算环境温度:芯片温度总是比环境温度略高,如果通过实验找到这个差值,则可以进行软件修正4在随机算法里可以提供随机数种子内部温度传感器提供了模拟温度读取操作和参考电压。输出终端S E N S O的电压通过以下等式计算得到:S E N S O =2.7 -(T +5 5 )/7 5A D C温度传感器温度-电压关系一个实用的A D C温度转换公式。假设温度电压S E N S O对应的A D C采样值为N,2.7 V 对应 N l,(T +5 5)/7 5 对应 N 2。已知:N 1 x(3 /1 0 2 4 )=2.7N 2 x(3 /1 0 2 4 )=(T+5 5)/7 5由此得到:N =N l -N 2 =2.7 /(3 /1 0 2 4 )-(T +5 5 )/7 5 )/(3 /1 0 2 4 )解得:T =(1 5 1 0 4 0 -2 2 5 x N)/1 0 2 4结论:A D C配置为温度传感器模式后,只要得到1 0位采样值N,就能推算出摄氏温度T。程序标注:#i n c l u d e i n c/h w _ m e m m a p.h#i n c l u d e i n c/h w-t y p e s.h#include driver1i b/a d c.h#include driver 1ib/gpio.h#include driverlib/sysctl.h#include utiIs/uartstdio.h voidInitConsole(void)(/初始化GPIO外设/SysCtlPeripheralEnable(SYSCTL.PERIPH-GPIOA);/配置化串口外设/GPIOPinConfigure(GPIO-PAO.UORX);GPIOPinConfigure(GPIO_PAl_UOTX);/配置串口管脚/GPIOPinTypeUART(GPIO_PORTA_BASE,GPIO_PIN_O I GPIO_PIN_1);/初始化串口/UARTStdioInit(O);i n tmain(v o i d)(/T设置数组读取ADC FIFO/unsigned l o n g ulADCO-Value 1 ;/设置温度转换变量/unsigned l o n g ulTemp-ValueC;unsigned l o n g ulTemp-ValueF;/设 置P L L,ADC的时钟必须要16 MHz/SysCtlClockSet(SYSCTL_SYSDIV_10 I SYSCTL_USE_PLL I SYSCTL-OSC-MAINSYSCTL_XTAL_16MHZ);/初始化开发板端口/I n i t C on s ol e ();/串口显示/U A R T p r i n t f(A D C -n );U A R T p r i n t f(U A R T p r i n t f(U A R T p r i n t f(U A R T p r i n t f(/T y p e:I n t e r n a l T e m p e r a t u r e S e n s or n );S a m p l e s:O n e n );U p d a t e R a t e:2 5 0 m s n );I n p u t P i n:I n t e r n a l t e m p e r a t u r e s e n s or n n );/A D C O 外设初始化/S y s C t l P e r i p h e r a l E n a bl e(S Y S C T L-P E R I P H-A D C O);/配置A D C O,采样序列3,A D C 处理器触发,优先级为0/A D C S e q u e n c e C on f i g u r e(A D C O _ B A S E,3,A D J T R I G G E R.P R O C E S S O R,0);/温度传感,中断使能,对列结束选择,无 AD C 通道/AD C S e q u e n c e S t e p C o n f i g u r e (AD C O-B AS E,3,0,AD C-C T L-T S I/D C _ C T L _ I EAD C-C T L.E N D);/使 能 AD C 采样/AD C S e q u e n c e E n a b l e (AD C O-B AS E,3);/AD C 中断清除/AD C I n t C l e a r(AD C O-B AS E,3);/设置温度显示/w h i l e (1)(/AD C 处理器触发/AD C P r o c e s s o r T r i g g e r (AD C O-B AS E,3);/获取中断状态/w hile(!ADCIntStatus(ADCO-BASE,3,false)/获 取 ADC采样数据/ADCSequenceDataGet(ADCO-BASE,3,ulADCO-Value);/计算 温 度 C/ulTemp.ValueC=(1475*1023)-(2250*ulADCO.Value 0)/10230;/计算 温 度 F/ulTemp-ValueF=(ulTemp-ValueC*9)+160)/5;/串口显示/UARTprintf(Temperature=%3d*C or%3d*Fr,ulTemp-ValueC,ulTemp-ValueF);/时钟延迟/SysCtlDelayCSysCtlClockGet()/12);)运行结果:LM3s811防止J ta g 失效的源代码(2011-05-21 14:20:16)转载标签:分类:LM3Im3s811杂谈void JtagW ait(void)unsigned long i;SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);/使能 KEY、LED 所在的 PC端口GPIOPinTypeGPIOInput(GPIO-PORTC.BASE,GPIO-PIN-4);/设置 KEY 所在管脚PC4为输入GPIOPinTypeGPIOOutput(GPIO_PORTC_BASE,GPIO_PIN_5);/设置 LED 所在管脚 PC5为输出if(GPIOPinRead(GPIO-PORTC.BASE,GPI0_PIN_4)=0 x00)/若复位或上电时按下KEY,则进入(while(l)/死循环,以等待JTAG连接,LED闪烁for(i=0;i200000;i+);GPIOPinWr i te(GPIO_PORTC_BASE,GPIO_PIN_5,GPIO_PIN_5);点亮 LEDfor(i=0;i200000;i+);GPIOPinWrite(GPIO-PORTC-BASE,GPIO_PIN_5,_GPIO_PIN_5);熄灭 LED)SysCtlPeripheralDisable(SYSCTL_PERIPH_GPIOC);/禁止 KEY 所在的 GPIO端口 模数转换器(ADC)外设用于将连续的模拟电压转换成离散的数字量。Stellaris系列ARM集成有一个分辨率为10位的ADC模块,支持4/16个输入通道,以及一个内部温度传感器。Lm3s811支持4 个输入通道,Im3s9b96支持16个输入通道。每个ADC模块包含4 个可编程的序列发生器。每个采样序列均对完全可配置的输入源、触发事件、中断的产生和序列优先级提供灵活的编程。Stel laris系列ARM的ADC通过使用一种基于序列(sequence-based)的可编程方法来收集采样数据,取代了传统ADC模块使用的单次采样或双采样的方法。每个采样序列均为一系列程序化的连续(back-to-back)采样,使得ADC可以从多个输入源中收集数据,而无需控制器对其进行重新配置或处理。对本下8 1 1 和 9 B 9 6 的结构图:8 1 1 AD C 结构图9 B 9 6 AD C 结构图对比2 个系列的AD C 结构图,大家可以发现:基本相差不大,触发条件完全相同:具有:比较器,定时器,GP I O,P WM 的触发条件。同时具有4 个可编程序列发生器,相对应的S S 中断。不同的是9 B 9 6 的A D C 可以产生相应的PW M触发信号。81 1 不支持外部参考电压,因此硬件方面:81 1 用于A D C 方面的只有4 个管脚了。分别代表4 个输入通道。您好!j t a g w a i t 是用于防止JT A G失效锁定,其作用主要是针对4 8脚和6 4脚的系列芯片,而现在的1 0 0 脚的系列芯片已经支持JT A G解锁,所以可以不使用 j t a g w a i t 来检测。而 j t a g w a i t 是防止用户对JT A G调试接口的相关引脚进行误操作,使软件不能利用 JT A C 调试功能,而微控制器在上电后,先执行j t a g w a i t 检测程序,来检测某引脚电平,并进入W HILE ;循环,从而使得LM F LA S H PRO GRA MME R软件可以通过 JT A G连接上微控制器,进而将用户程序擦除,恢复其正常的JT A G调试功能。LM3 S 系列JT A G 口当1 0 用的解锁LM3 S 系列A RM的 JT A G 口原本是跟1 0 口复用的,当GPIO 用时跟一般GPIO 没什么不同。一般只在C PIO 口不够用或者做产品不希望用户随意更新固件时,会把JT A G 口当GPIO 口来用。如果将JT A G那 5 根线用作C PIO 功能,芯片就会被锁住,不过要注意,锁住后JT A G就再也不起作用了。解决被锁的办法有两个:一是下载程序时留有恢复措施,只需启用即可恢复。如果没有加预防锁死的代码,就只能用Lu m i n a r y 的LM LIN K来解锁。很遗憾的是 S a n d s t o r m 系列(LM3 S x x x)只支持部分类型,解锁功能也不是很稳定,LM3 S x x x x才能很好解锁,不过可以试试看。如果有高人看得懂它的时序再写出上位机应该U LIN K也解得了。实在打不开只能找流明诺瑞或更换芯片了。下面是一段l o r d o r 兄使用LM3 S X X X S m a r t B o a r d 演示板恢复J T A G 的演示代码:v o i d I n i t-c p u(v o i d)初始化系统时钟设置SysCtlClockSet(SYSCTL_USE_OSC I SYSCTL-OSC-MAIN I SYSCTL_XTAL_6MHZ);/*GPI0B 初始化使能GPIOB模块SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);/锁定演示:如果设置为G P IO,则JTAG不起作用了按键检测if(GPIOPinRead(KEYPORT,GPIODirModeSet(PH5.PORT,PH5,if(GPIOPinRead(KEYPORT,KD)/如果为高电平GPIO-DIR_MODE_IN);/JTAGK2)/如果为高电平GPIODirModeSet(PH6.PORT,GPIODirModeSet(PH7.PORT,GPIODirModeSet(PH8-PORT,GPIODirModeSet(PH9.PORT,PH6,PH7,PH8,PH9,GPIO-DIR_MODE_IN);GPIO-DIR_MODE_IN);GPIO-DIR_MODE_IN);GPIO-DIR_MODE_IN);/设置GPIO B 口的B 4为输出引脚GPIODirModeSet(LED.PORT,LED1,GPIO-DIR_MODE_OUT);设置连接LED1的引脚为高电平GPIOPinWrite(LED_PORT,LED1,LED1);)说明:下载后,可以发现用JTAG无法通信了。要取消,同时按住K1及K2健,重开机就可以取消锁定功能了。-b y lordor最后,贴上用Lum inary的LM LINK来解锁LM3Sxxxx的方法。网站六大类职位火热招聘中!点击了解英特尔云计算2012年1月当选微软MVP的CSDN会员名单揭晓!LM3S A P I函数解读范例2010-03-03 09:01784人阅读评论收藏举报j t a g W a i t ()函数解读1 .通常在主函数的开始都要调用j t a g W a i t。函数,如工程模版的主函数,i n t m a i n(v o i d)(j t a g W a i t O;/防止J T A G失效,重要!c l o c k l n i t 0;/时钟初始化:晶振,6 M H zf o r (;)2 .关于函数的解释,先要找到函数的定义,可以在函数的调用处指向函数名后右键选择 G o t o d e f i n i t i o n o f ”。函数j t a g W a i t 0在s y