收藏 分销(赏)

关于lm3s811代码全解析.docx

上传人:仙人****88 文档编号:7043212 上传时间:2024-12-25 格式:DOCX 页数:120 大小:469.42KB 下载积分:10 金币
下载 相关 举报
关于lm3s811代码全解析.docx_第1页
第1页 / 共120页
关于lm3s811代码全解析.docx_第2页
第2页 / 共120页


点击查看更多>>
资源描述
*注:未指明返回值的函数为无返回值,资源来自周立功单片机网站 一:GPIO函数 1: void GPIODirModeSet(unsigned long ulPort, unsigned char ucPins, unsigned long ulPinIO) 设置所选GPIO端口指定管脚的方向和模式 如 GPIODirModeSe(GPIO_PORTA_BASE,GPIO_PIN_2 ,GPIO_DIR_MODE_IN ) 函数设置PA2为输入,但第三个参数为“GPIO_DIR_MODE_HW // 硬件控制”时指此管脚启用第二功能; 2:unsigned long GPIODirModeGet(unsigned long ulPort, unsigned char ucPin) 获取所选GPIO端口指定管脚的方向和模式 如 unsigned long SetValue=GPIODirModeGet(GPIO_PORTA_BASE,GPIO_PIN_2);返回PA2脚的方向和模式,返回的值为上一个函数第三个参数的取值,分别为 GPIO_DIR_MODE_IN // 输入方向 GPIO_DIR_MODE_OUT // 输出方向 GPIO_DIR_MODE_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:指定输出驱动强度,应当取下列值之一: GPIO_STRENGTH_2MA // 2mA驱动强度 GPIO_STRENGTH_4MA // 4mA驱动强度 GPIO_STRENGTH_8MA // 8mA驱动强度 GPIO_STRENGTH_8MA_SC // 带转换速率(Slew Rate)控制的8mA驱动 ulPadType:指定管脚类型。应当取下列值之一: GPIO_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 // 带弱下拉的开漏 GPIO_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 char ucPins) 设置所选GPIO端口指定的管脚为高阻输入模式 如 GPIOPinTypeGPIOInput(GPIO_PORTA_BASE,GPIO_PIN_2);设置PA2脚为高阻输入模式 6:void GPIOPinTypeGPIOOutput(unsigned long ulPort, unsigned char ucPins) 设置所选GPIO端口指定的管脚为推挽输出模式 如 GPIOPinTypeGPIOOutput(GPIO_PORTA_BASE,GPIO_PIN_2) 设置PA2脚为推挽输出模式 7:void GPIOPinTypeGPIOOutputOD(unsigned long ulPort, unsigned char ucPins) 设置所选GPIO端口指定的管脚为开漏输出模式 如 GPIOPinTypeGPIOOutputOD(GPIO_PORTA_BASE,GPIO_PIN_2) 设置PA2为开漏输出模式 但由于函数5,6,7函数名太长一般做如下简化: #define GPIOPinTypeIn GPIOPinTypeGPIOInput #define GPIOPinTypeOut GPIOPinTypeGPIOOutput #define GPIOPinTypeOD GPIOPinTypeGPIOOutputOD 8: 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 char ucPins) 设置所选GPIO端口指定的管脚为CAN功能 11:void GPIOPinTypeComparator(unsigned long ulPort, unsigned char ucPins) 设置所选GPIO端口指定的管脚为模拟比较器功能 12:void GPIOPinTypeI2C(unsigned long ulPort, unsigned char ucPins) 设置所选GPIO端口指定的管脚为I2C功能 13:void GPIOPinTypePWM(unsigned long ulPort, unsigned char ucPins) 设置所选GPIO端口指定的管脚为PWM 功能 14:void GPIOPinTypeQEI(unsigned long ulPort, unsigned char ucPins) 设置所选GPIO端口指定的管脚为QEI功能 15:void GPIOPinTypeSSI(unsigned long ulPort, unsigned char ucPins) 设置所选GPIO端口指定的管脚为SSI功能 16:void GPIOPinTypeTimer(unsigned long ulPort, unsigned char ucPins) 设置所选GPIO端口指定的管脚为Timer的CCP功能 本文 由西电F518学生实验室 小愫整理,转载请注明出处 17:void GPIOPinTypeUART(unsigned long ulPort, unsigned char ucPins) 设置所选GPIO端口指定的管脚为UART 功能 18: void GPIOPinTypeUSBDigital(unsigned long ulPort, unsigned char ucPins) 设置所选GPIO端口指定的管脚为USB数字功能 对 GPIO管脚的读写操作是通过函数 GPIOPinWrite( )和 GPIOPinRead( )实现的,这是两个非常重要而且很常用的库函数。 19: void GPIOPinWrite(unsigned long ulPort, unsigned char ucPins, unsigned char ucVal); 向所选GPIO 端口的指定管脚写入一个值,以更新管脚状态, ucVal:写入指定管脚的值 注:ucPins 指定的管脚对应的 ucVal 当中的位如果是 1,则置位相应的管脚,如果是 0,则清零相应的管脚;ucPins未指定的管脚不受影响。 如 GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_3, 0x00); // 清除PA3 GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_5, 0xFF); // 置位PB5 GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_2 | GPIO_PIN_6, 0xFF); //同时置位PD2、PD6 GPIOPinWrite(GPIO_PORTA_BASE, 0xFF, ucData); // 变量ucData 输出到PA0~PA7 20:long GPIOPinRead(unsigned long ulPort, unsigned char ucPins) 读取所选GPIO端口指定管脚的值,返回1个位组合的字节。该字节提供了由ucPins指定管脚的状态,对应的位值表示GPIO 管脚的高低状态。ucPins未指定的管脚位值是0。返回值已强制转换为long型,因此位31:8应该忽略。 这个函数应该在相应管脚已经设置为输出状态的情况下,由于GPIO得管脚结构我们知道在输出模式下,不管是开漏还是推挽用此函数读回来的值都是管脚的输出锁存值, 如 // 读取PA4,返回值保存在ucData里,可能的值是0x00或 0x10 ucData = GPIOPinRead(GPIO_PORTA_BASE, GPIO_PIN_4); // 同时读取PB1、PB2和 PB6,返回PB1、PB2和 PB6的位组合保存在ucData里 ucData = GPIOPinRead(GPIO_PORTB_BASE, GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_6); // 读取整个PF端口 ucData = GPIOPinRead(GPIO_PORTF_BASE, 0xFF); 在Stellaris 系列 ARM 里,每个 GPIO 管脚都可以作为外部中断输入。中断的触发类型分为边沿触发和电平触发两大类,共 5 种,用起来非常灵活。配置 GPIO管脚的中断触发方式可以通过调用函数 GPIOIntTypeSet( )来实现,函数 GPIOIntTypeGet( )用来获取配置情况。函数 GPIOPinIntEnable( )和 GPIOPinIntDisable( )用来使能和禁止 GPIO管脚中断。函数 GPIOPinIntStatus( )用来获取 GPIO管脚的中断状态。在同一个 GPIO 端口上,8 个GPIO管脚的中断向量都是共用的。如果同时配置了同一端口上的多个管脚中断,则可以先利用函数 GPIOPinIntStatus( )读取中断状态, 再进一步确认具体是哪个管脚产生的中断请求。函数 GPIOPinIntClear( )用来及时清除 GPIO管脚的中断状态。函GPIOPortIntRegister( )用来注册一个 GPIO端口中断服务函数,而注销的方法是调用函数GPIOPortIntUnregister( )。 2012CSDN网站六大类职位火热招聘中! 点击了解英特尔云计算 2012年1月当选微软MVP的CSDN会员名单揭晓! lm3s811 学习笔记(四)【gpio】 分类: cortex m32011-08-03 15:24295人阅读评论(0)收藏举报 今天主要是熟悉下gpio的一些应用。最简单的就是LED灯的控制。 下面的例子就拿L5来说明吧。 SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);//enable gpio b GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE, GPIO_PIN_0);//set PB0 output 还有一种模式设置的方法GPIODirModeSet(GPIO_PORTB_BASE, GPIO_PIN_0, GPIO_DIR_MODE_OUT) ;//这个方案可以设置多个引脚,参数2为位引脚的或 控制LED灯地亮灭,就是往引脚写入值 ledstatus = GPIOPinRead(GPIO_PORTD_BASE, GPIO_PIN_0); GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_0, GPIO_PIN_0&(~ledstatus)); 上面的程序是读取L5对应管脚的值,然后使灯地状态进行翻转。 这里说下GPIOPinWrite()该函数的用法。 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_0,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,0x10); GPIOPinWrite(GPIO_PORTD_BASE,GPIO_PIN_5,0x20); GPIOPinWrite(GPIO_PORTD_BASE,GPIO_PIN_6,0x40); GPIOPinWrite(GPIO_PORTD_BASE,GPIO_PIN_7,0x80); 下面我主要讲述下键控LED的流程,其实就是利用按键中断控制灯的亮灭。 首先是配置KEY。 SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);//Enable GPIO C GPIOPinIntEnable(GPIO_PORTC_BASE, GPIO_PIN_4);//Enable GPIO C pin 4 GPIOPinTypeGPIOInput(GPIO_PORTC_BASE, GPIO_PIN_4);//set the pin mode is input GPIOIntTypeSet(GPIO_PORTC_BASE, GPIO_PIN_4, GPIO_LOW_LEVEL);//set interrupt type is low Falling edge IntEnable(INT_GPIOC);//enable GPIO C interrupt 下面是按键中断的处理函数 void userkey_handler(void) { unsigned char ucVal; unsigned long ulStatus; ulStatus = GPIOPinIntStatus(GPIO_PORTC_BASE, true);// get gpio c interrupt status GPIOPinIntClear(GPIO_PORTC_BASE, ulStatus); // clear interrupt status if (ulStatus & GPIO_PIN_4) // 如果KEY的中断状态有效 { ucVal = GPIOPinRead(GPIO_PORTD_BASE, GPIO_PIN_0); // 翻转LED GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_0, ~ucVal); SysCtlDelay(10 * (SysCtlClockGet() / 3000)); // 延时约10ms,消除按键抖动 while (GPIOPinRead(GPIO_PORTC_BASE, GPIO_PIN_4) == 0x00); // 等待KEY抬起 SysCtlDelay(10 * (SysCtlClockGet() / 3000)); // 延时约10ms,消除松键抖动 } } 既然用到了SysCtlDelay()函数。在这里也顺道分析下。 #if defined(ewarm) || defined(DOXYGEN)//iar环境下 void SysCtlDelay(unsigned long ulCount) { __asm(" subs r0, #1\n" " bne.n SysCtlDelay\n" " bx lr"); } #endif #if defined(codered) || defined(gcc) || defined(sourcerygxx)//codered、gcc、sourcerygcc环境下 void __attribute__((naked)) SysCtlDelay(unsigned long ulCount) { __asm(" subs r0, #1\n" " bne SysCtlDelay\n" " bx lr"); } #endif #if defined(rvmdk) || defined(__ARMCC_VERSION)//keil MDK环境下 __asm void SysCtlDelay(unsigned long ulCount) { subs r0, #1; bne SysCtlDelay; bx lr; } #endif #if defined(ccs)//ccs volatile unsigned long g_ulInlineCCSWorkaround; void SysCtlDelay(unsigned long ulCount) { __asm("delay?: subs r0, #1\n" " bne.n delay?\n" " bx lr\n"); // // This is needed to keep TI compiler from optimizing away this code. // g_ulInlineCCSWorkaround += ulCount; } #endif SysCtlDelay()执行了3个汇编语句,运行时间3个始终周期。函数说明上: The loop takes 3 cycles/loop. 1、在主晶振6MHZ的情况下 SysCtlDelay(2); delaytime = 2 * 3 * (1/6000000) = 1us SysCtlDelay(10 * (TheSysClock / 3000)); delaytime = 10 * (6000000/3000)* 3 * (1/6000000) = 10ms 2、在主晶振8MHZ的情况下 SysCtlDelay(2); delaytime = 2 * 3 * (1/8000000) = 0.75us SysCtlDelay(10 * (TheSysClock / 3000)); delaytime = 10 * (8000000/3000)* 3 * (1/8000000) = 10ms 由此 可以看出无论是多大的晶振,都是除以3000。SysCtlDelay(10 * (TheSysClock / 3000));这种写法也方便移植 lm3s811点亮LED或流水灯程序 1急求!!!! 2010-8-6 17:41 提问者:luxiahua427511 | 悬赏分:5 | 浏览次数:525次 谢谢了啊 !刚开始学ARM又没有实际的程序!谢谢帮忙了 推荐答案 2010-8-15 12:34 #include "systemInit.h" // 定义LED #define LED_PERIPH SYSCTL_PERIPH_GPIOA #define LED_PORT GPIO_PORTA_BASE #define LED_PIN GPIO_PIN_2 // 主函数(程序入口) int main(void) { jtagWait(); // 防止JTAG失效,重要! clockInit(); // 时钟初始化:晶振,6MHz SysCtlPeriEnable(LED_PERIPH); // 使能LED所在的GPIO端口 GPIOPinTypeOut(LED_PORT, LED_PIN); // 设置LED所在管脚为输出 for(;;) { GPIOPinWrite(LED_PORT, LED_PIN, 0x00); // 点亮LED //SysCtlDelay( 1000000); // 延时 SysCtlDelay(1000 * (SysCtlClockGet( ) / 3 6000)); // 延时 1000 ms GPIOPinWrite(LED_PORT, LED_PIN, 0xFF); // 熄灭LED //SysCtlDelay(1000000); // 延时 SysCtlDelay(1000 * (SysCtlClockGet( ) / 3000)); // 延时 1000 ms } } 最基本的一个例程,已调试通过(systemInit.C的口该一下,811没G口的)。你可以去zlg网站上去找找资料,那里的例程很多,很适合新手。我也才刚刚开始学,一起努力了。 赞同 0 | 评论 回复:青风和大家一起学Stellaris系列ARM——九.ADC转换。 程序演示: 分别完成三种ADC变化:程序一:内部温度测试;程序二:单端采样;程序三:差分采样; 内部温度测试: 在Stellaris系列的ADC模块里,附带了一个内置的温度传感器,能够随时检测芯片的温度。该温度传感器可以有以下用途: 1 测试用:在单独测试ADC模块的功能时,而不必提供外部的模拟信号源 2 测量芯片自身温度,防止可能出现的过温(高温应用场合必备) 3 估算环境温度:芯片温度总是比环境温度略高,如果通过实验找到这个差值,则可以进行软件修正 4 在随机算法里可以提供随机数种子 内部温度传感器提供了模拟温度读取操作和参考电压。输出终端SENSO的电压通过以下等式计算得到: SENSO = 2.7 -(T+55)/ 75 ADC温度传感器温度-电压关系 一个实用的ADC温度转换公式。假设温度电压SENSO对应的ADC采样值为N,2.7V对应N1,(T+55)/75对应N2。 已知: N1 ×(3/1024)= 2.7 N2 ×(3/1024)= (T+55)/ 75 由此得到: N = N1 - N2 = 2.7 /(3/1024)-((T+55)/75)/(3/1024) 解得: T =(151040 - 225 × N)/ 1024 结论:ADC配置为温度传感器模式后,只要得到10位采样值N,就能推算出摄氏温度T。 程序标注: #include "inc/hw_memmap.h" #include "inc/hw_types.h" #include "driverlib/adc.h" #include "driverlib/gpio.h" #include "driverlib/sysctl.h" #include "utils/uartstdio.h" void InitConsole(void) { // // 初始化GPIO外设 // SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); // // 配置化串口外设 // GPIOPinConfigure(GPIO_PA0_U0RX); GPIOPinConfigure(GPIO_PA1_U0TX); // // 配置串口管脚 // GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1); // // 初始化串口 // UARTStdioInit(0); } int main(void) { // // T设置数组读取 ADC FIFO // unsigned long ulADC0_Value[1]; // // 设置温度转换变量 // unsigned long ulTemp_ValueC; unsigned long ulTemp_ValueF; // // 设置PLL,ADC的时钟必须要16MHZ // SysCtlClockSet(SYSCTL_SYSDIV_10 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ); // // 初始化开发板端口 // InitConsole(); // // 串口显示 // UARTprintf("ADC ->\n"); UARTprintf(" Type: Internal Temperature Sensor\n"); UARTprintf(" Samples: One\n"); UARTprintf(" Update Rate: 250ms\n"); UARTprintf(" Input Pin: Internal temperature sensor\n\n"); // // ADC0外设初始化 // SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0); // // 配置ADC0,采样序列3,ADC处理器触发,优先级为0 // ADCSequenceConfigure(ADC0_BASE, 3, ADC_TRIGGER_PROCESSOR, 0); // // 温度传感,中断使能,对列结束选择,无ADC通道 // ADCSequenceStepConfigure(ADC0_BASE, 3, 0, ADC_CTL_TS | ADC_CTL_IE | ADC_CTL_END);// // //使能ADC采样 // ADCSequenceEnable(ADC0_BASE, 3); / // // //ADC中断清除 // ADCIntClear(ADC0_BASE, 3); // //设置温度显示 // while(1) { // //ADC处理器触发 // ADCProcessorTrigger(ADC0_BASE, 3); // //获取中断状态 // while(!ADCIntStatus(ADC0_BASE, 3, false)) { } // //获取ADC采样数据 // ADCSequenceDataGet(ADC0_BASE, 3, ulADC0_Value); // // 计算温度 C // ulTemp_ValueC = ((1475 * 1023) - (2250 * ulADC0_Value[0])) / 10230; // // 计算温度 F // ulTemp_ValueF = ((ulTemp_ValueC * 9) + 160) / 5; // // 串口显示 // UARTprintf("Temperature = %3d*C or %3d*F\r", ulTemp_ValueC, ulTemp_ValueF); // // 时钟延迟 // SysCtlDelay(SysCtlClockGet() / 12); } } 运行结果: LM3s811防止Jtag失效的源代码 (2011-05-21 14:20:16) 转载▼ 标签: lm3s811 杂谈 分类: LM3 void JtagWait(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, GPIO_PIN_4) == 0x00) // 若复位或上电时按下KEY,则进入 { while(1) //死循环,以等待JTAG连接,LED闪烁 { for(i=0;i<200000;i++); GPIOPinWrite(GPIO_PORTC_BASE, GPIO_PIN_5,GPIO_PIN_5); //点亮LED for(i=0;i<200000;i++); GPIOPinWrite(GPIO_PORTC_BASE, GPIO_PIN_5,~GPIO_PIN_5); //熄灭LED } } SysCtlPeripheralDisable(SYSCTL_PERIPH_GPIOC); // 禁止KEY所在的GPIO端口 } 本代码来自eeword论坛的一位高手,我为了以后应用方便,故贴在此处。转载标明出处: 模数转换器 (ADC) 外设用于将连续的模拟电压转换成离散的数字量。 Stellaris系列ARM集成有一个分辨率为10位的ADC模块,支持4/16个输入通道,以及一个内部温度传感器。Lm3s811支持4个输入通道,lm3s9b96支持16个输入通道。每个ADC模块包含4个可编程的序列发生器。每个采样序列均对完全可配置的输入源、触发事件、中断的产生和序列优先级提供灵活的编程。 Stellaris系列ARM的ADC通过使用一种基于序列(sequence-based)的可编程方法来收集采样数据,取代了传统ADC模块使用的单次采样或双采样的方法。每个采样序列均为一系列程序化的连续(back-to-back)采样,使得ADC可以从多个输入源中收集数据,而无需控制器对其进行重新配置或处理。 对本下811和9B96的结构图: 811ADC结构图 9B96 ADC结构图 对比2个系列的ADC结构图,大家可以发现:基本相差不大,触发条件完全相同:具有:比较器,定时器,GPIO,PWM的触发条件。 同时具有4个可编程序列发生器,相对应的SS中断。不同的是9B96的ADC可以产生相应的PWM触发信号。811不支持外部参考电压,因此硬件方面: 811用于ADC方面的只有4个管脚了。分别代表4个输入通道。 您好!jtagwait是用于防止JTAG失效锁定,其作用主要是针对48脚和64脚的系列芯片,而现在的100脚的系列芯片已经支持JTAG解锁,所以可以不使用jtagwait来检测。 而jtagwait是防止用户对JTAG调试接口的相关引脚进行误操作,使软件不能利用JTAG调试功能,而微控制器在上电后,先执行jtagwait检测程序,来检测某引脚电平,并进入WHILE(1);循环,从而使得LM FLASH PROGRAMMER软件可以通过JTAG连接上微控制器,进而将用户程序擦除,恢复其正常的JTAG调试功能。 LM3S系列JTAG口当IO用的解锁 LM3S系列ARM的JTAG口原本是跟IO口复用的,当GPIO用时跟一般GPIO没什么不同。一般只在GPIO口不够用或者做产品不希望用户随意更新固件时,会把JTAG口当GPIO口来用。如果将JTAG那5根线用作GPIO功能,芯片就会被锁住,不过要注意,锁住后JTAG就再也不起作用了。解决被锁的办法有两个: 一是下载程序时留有恢复措施,只需启用即可恢复。 如果没有加预防锁死的代码,就只能用Luminary的LM LINK来解锁。很遗憾的是Sandstorm系列(LM3Sxxx)只支持部分类型,解锁功能也不是很稳定,LM3Sxxxx才能很好解锁,不过可以试试看。如果有高人看得懂它的时序再写出上位机应该ULINK也解得了。实在打不开只能找流明诺瑞或更换芯片了。 下面是一段lordor兄使用LM3SXXX SmartBoard演示板恢复JTAG的演示代码: void Init_cpu(void) { //初始化系统时钟设置 SysCtlClockSet(SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_6MHZ); /******************************GPIOB 初始化 **********************************/ //使能GPIOB模块 SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC); //////////////////////////////////////////////////// ///////////锁定演示:如果设置为GPIO,则JTAG不起作用了 //按键检测 if(GPIOPinRead(KEYPORT, K1)) //如果为高电平 GPIODirModeSet(PH5_PORT, PH5, GPIO_DIR_MODE_IN); //JTAG if(GPIOPinRead(KEYPORT, K2)) //如果为高电平 { GPIODirModeSet(PH6_PORT, PH6, GPIO_DIR_MODE_IN); GPIODirModeSet(PH7_PORT, PH7, GPIO_DIR_MODE_IN); GPIODirModeSet(PH8_PORT, PH8, GPIO_DIR_MODE_IN); GPIODirModeSet(PH9_PORT, PH9, GP
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服