咨询一个问题,我现在用STM8S103F3P6开发一个东西,因为管脚数量有限,所以把PD1(也就是SWIM)这个管脚接到了红外接收器(VS1838)上。现在有一个问题,使用IAR(版本3.10.4),库函数的方式,同样的代码,在别的管脚上可以工作,在PD1上就是不行。有人提到说,需要关闭PD1的SWIM模式,这个我试过,不论关不关,都不起作用。
但是,使用寄存器的方式,PD1就能正常工作(不用关闭SWIM模式)。
所以,STM8 IAR的库函数开发是不是有隐患?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
这是PD1初始化
void IR_pin_init(void)
{
CFG->GCR |= CFG_GCR_SWD;
GPIO_Init(GPIOD, GPIO_PIN_1, GPIO_MODE_IN_PU_IT);
//GPIO_Init(GPIOC, GPIO_PIN_3, GPIO_MODE_IN_FL_IT);
EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOD, EXTI_SENSITIVITY_FALL_ONLY);
}
这是定时器初始化
/***************************************************
// Time4定时器
// 约0.278ms中断一次
****************************************************/
void Timer4_init(void)
{
TIM4_TimeBaseInit(TIM4_PRESCALER_32, 117);
TIM4_SetCounter(117);
TIM4_GenerateEvent(TIM4_EVENTSOURCE_UPDATE);
TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE);
// TIM4_ClearFlag(TIM4_FLAG_UPDATE);
/* enable interrupts */
enableInterrupts();
/* Enable TIM4 */
TIM4_Cmd(ENABLE);
}
这是中断,我通过串口把 irdata里面的数据打印出来,明显就异常了。更不要说后面的解析
INTERRUPT_HANDLER(EXTI_PORTD_IRQHandler, 6)
{
/* In order to detect unexpected events during development,
it is recommended to set a breakpoint on the following instruction.
*/
static u8 i = 0;
static u8 startflag = 0;
if(GPIO_ReadInputPin(GPIOD, GPIO_PIN_1) == RESET)
{
if(startflag)
{
if(irtime < 63 && irtime >= 33) //9ms+4.5ms
i = 0;
irdata = irtime;
irtime = 0;
i++;
if(i == 33)
{
irok = 1;
i = 0;
}
}
else
{
irtime = 0;
startflag = 1;
}
}
}
一周热门 更多>