最近用原子的MINI V3.0版本做实验,B3的输出电平初始化里设置的是默认输出高电平,代码如下。
【硬件改变】为避免B3的输出电平受影响,JTAG插座的JTDO脚与R9之间的电路已经断开,其它未作改动。
【JTAG插座接线】SEGGER JTAG V4.50J,VDD,GND, TMS/SWDIO, TCK/SWCLK, RESET, TRST(不接此线不能在线调试), TDIT(不接此线不能在线调试)
TDO/SWO未接线(为不影响与之相连的B3电平,不接,但可下载代码,可在线调试)
【故障现象】用SW模式在线调试发现:在线调试B3输出是高电平,但是实际测量B3管脚却是低电平,JTAG未接入板子的TDO/SWO也是低电平,电压都只有几百毫安(断电重启板子后测量是正常的)。这到低是怎么回事呢?求各位高手指教,不胜感激!
【B3的相关代码如下】
[mw_shl_code=c,true] JTAG_Set(JTAG_SWD_DISABLE);
JTAG_Set(SWD_ENABLE);
delay_init(); //延时函数初始化
NVIC_Configuration(); // 设置中断优先级分组
uart_init(9600); //串口初始化为9600
LED_Init(); //初始化与LED连接的硬件接口, 包括继电器的管脚
if(GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_3))
{
printf("\r\nB3=1\r\n");
}
else
{
printf("\r\nB3=0\r\n");
}
if(GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_4))
{
printf("\r\nB4=1\r\n");
}
else
{
printf("\r\nB4=0\r\n");
}
void LED_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD, ENABLE); //使能PA,PB,PC,PD端口时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //使能AFIO 时钟 B3,B4需要启用GPIO功能
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); // 重映射:JTAG-DP Disabled and SW-DP Enabled
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; // 继电器B0-B15 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // IO口速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); // 根据设定参数初始化GPIOA.8
GPIO_SetBits(GPIOB,GPIO_Pin_All); // PB.0-15 全部输出高
}
#define JTAG_SWD_DISABLE 0X02 // 10 关闭JTAG-DP,关闭SW-DP
#define SWD_ENABLE 0X01 // 01 关闭JTAG-DP,启用SW-DP
#define JTAG_SWD_ENABLE 0X00 // 00 完全SWJ(2者完全使能JTAG-DP + SW-DP):复位状态
//JTAG模式设置,用于设置JTAG的模式
//mode:jtag,swd模式设置;00,JTA-DP和SW-DP全使能; 01,仅仅使能SWD; 10,全关闭;
//CHECK OK
//100818
void JTAG_Set(u8 mode)
{
u32 temp;
temp=mode;
temp<<=25; // 若是01,左移25位后变为: 010 0000 0000 0000 0000 0000 0000【BIT0~7, 7~15, 16~23, Bit24=0,Bit25=1,Bit26=0】
RCC->APB2ENR|=1<<0; //开启辅助时钟
AFIO->MAPR&=0XF8FFFFFF; //清除MAPR的[26:24] 0XF8FFFFFF= 1111 1000 1111 1111 1111 1111 1111 1111
AFIO->MAPR|=temp; //设置jtag模式
}
[/mw_shl_code]
|