个人参考资料写的关于把JTAG复用为普通I/O口的小程序;测试通过。。。
芯片为LM3S9B92,望高手指正、、、
#include "hw_ints.h"
#include "hw_memmap.h"
#include "hw_types.h"
#include "gpio.h"
#include "sysctl.h"
#include "interrupt.h"
#include "systick.h"
#define SHUPORT GPIO_PORTC_BASE
#define SHU 0xff
#define GPIOCLOCK (*(volatile unsigned long *)(GPIO_PORTC_BASE+0X520))
#define GPIOCCR (*(volatile unsigned long *)(GPIO_PORTC_BASE+0X524))
#define GPIOCAFSEL (*(volatile unsigned long *)(GPIO_PORTC_BASE+0X420))
int shuzi[16]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0X77,0X7C,0X58,0X5E,0X79,0X71};
int i,j=0;
void unlock(void)
{
GPIOCLOCK=0X4C4F434B; //解锁 0X1ACCE551
GPIOCCR=0XFF; //设置相应位为1,允许更改
GPIOPadConfigSet(SHUPORT,SHU,GPIO_STRENGTH_2MA,GPIO_PIN_TYPE_STD);//配置管脚驱动;
GPIODirModeSet(SHUPORT,SHU,GPIO_DIR_MODE_OUT);//设置管脚输出
GPIOCLOCK=0X00; //锁定
}
void lock(void)
{
GPIOCLOCK=0X4C4F434B;
GPIOCCR=0XFF;
GPIODirModeSet(SHUPORT,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3,GPIO_DIR_MODE_HW);//设置管脚输出
GPIOPadConfigSet(SHUPORT,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3,GPIO_STRENGTH_2MA,GPIO_PIN_TYPE_STD_WPU);//配置管脚驱动;
GPIOCCR=0XF0;
GPIOCLOCK=0X00;
}
void portectjtag(void) //JTAG保护
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);//使能外设GPIOB;
GPIOPadConfigSet(GPIO_PORTB_BASE,GPIO_PIN_4,GPIO_STRENGTH_2MA,GPIO_PIN_TYPE_STD);//配置管脚驱动
GPIODirModeSet(GPIO_PORTB_BASE,GPIO_PIN_4,GPIO_DIR_MODE_IN);//配置管脚为输出
while(GPIOPinRead(GPIO_PORTB_BASE,GPIO_PIN_4)==0) //按下w21,程序不往下执行
{for(;;);}
}
int main(void)
{
portectjtag();
SysCtlClockSet(SYSCTL_SYSDIV_1|SYSCTL_USE_OSC|SYSCTL_OSC_MAIN|SYSCTL_XTAL_16MHZ);//配置系统时钟
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);//使能外设GPIOC
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);//使能外设GPIOE
unlock();
GPIOPadConfigSet(SHUPORT,SHU,GPIO_STRENGTH_2MA,GPIO_PIN_TYPE_STD);//配置管脚驱动
GPIOPadConfigSet(GPIO_PORTE_BASE,GPIO_PIN_7,GPIO_STRENGTH_4MA,GPIO_PIN_TYPE_STD);//配置管脚驱动
GPIODirModeSet(SHUPORT,SHU,GPIO_DIR_MODE_OUT);//设置管脚输出
GPIODirModeSet(GPIO_PORTE_BASE,GPIO_PIN_7,GPIO_DIR_MODE_OUT);//设置管脚输出
GPIOPinWrite(GPIO_PORTE_BASE,GPIO_PIN_7,0X00);//输出低电平
IntMasterEnable();//中断使能
SysTickPeriodSet(16000000);//设置定时周期为0.5s,16M
SysTickEnable();//使能系统定时器
SysTickIntEnable();//使能系统定时器中断
while(1)
{
GPIOPinWrite(SHUPORT,SHU,shuzi[ i ]);//输出数字(数码管)
};
}
void SysTick(void)//中断子程序,注意修改Startup.s文件的相关项
{
i++;
if(i>=16){i=0;j++;}
if(j>1)lock();
if(j>=10)j=0;
}
特别提醒,一定要添加保护JTAG的函数。。。
[
本帖最后由 olympicjun 于 2012-4-26 17:00 编辑 ]