关于使用BJX-LINK-001调试stm8s系列主控问题

      工作需要,最近忙于调试一款2.4G无线芯片解决方案,采用的芯片是ARF2496K,该芯片要求外部供电3.3V,所以不能直接使用普通的C51控制,除非接转换芯片。AT89S52、STC89C52都没有用武之处了,所以主控选型初步定为STM8S系列,最终调试时所使用的为STM8S103F3。

     一开始,我们使用的是由博巨兴提供的方案,主控为BJX8F101BTG,其实这片芯片的核心就是STM8S。外加一个仿真器BJX-LINK-001,按我的理解这也就是ST-LINK仿真器。

     第一步,就是确定主控能正常工作,STM8S的最小系统是在淘宝上直接购买了一块STM8S103F3小核心板,这个板子自带两个LED灯,一个用于指示电源,另一个可供I/O控制。而且将所有的管脚都引出来了,很方便外接ARF2496K芯片。拿到这板后,自己焊接了排针,万用表测试线路是正常的了。

      万事俱备,开工了,打开一个控制LED灯的程序,准备烧录时,发现一个错误: “chip does not answer” ,如下图:


仿真器肯定是没选错的,虽然他没有标明是STLINK,但换别的时候都提示错误。


初步怀疑我芯片的问题,换了一块核心板还是这样,便掉转矛头考虑是不是仿真器的问题,在GOOGLE搜索chip does not answer ,答案各种各样,没有什么进展,但得到一个信息就是供电的问题,检查BJX-LINK时发现竟然没有输出电压,查看自带的手册,发现这手册问题很多,讲的都不怎么清楚,示意图也比较模糊。于是认为这个仿真器坏了,最后联系博巨兴,他们那边给出的解释是板子需要另外供电,原来如此,果然,在给芯片供电后一切正常。LED灯闪了。


       第二步就是考虑移植ARF2496K代码了,参考ARF2496K datasheet,初步完成一些函数的封装,如SPI操作。最之前还不确定这ARF2496K芯片是不是好的,所以必须先能正常读取内部寄存器值才能往下做开发。

       这里遇到个让我纠结了好久的问题,调试时示波器也查看了,管脚也测过了都是正常的,没想到竟然最后的问题出在了FWLIB1.0库的GPIO_ReadInputPin函数上。

代码片段如下:

    

u8 rf_spi_read(void)
{
	u8 i,val = 0;
	BitStatus d;
	for(i = 0;i < 8;i++)
	{
		val <<= 1;
		d=GPIO_ReadInputPin(ARF_PORT,TRSDAT);  //ARF_PORT 就是GPIOC,
		//if (GPIO_ReadInputPin(ARF_PORT,TRSDAT)==1) //检测TRSDAT位是不是为高
		if(GPIOC->IDR&TRSDAT) //检测TRSDAT位是不是为高
			val |= 1;
		TRSCLK_U;
		nop();nop();nop();
		TRSCLK_D;
	}
	return val;
}
之前并没有使用   if(GPIOC->IDR&TRSDAT) 这种方式,而是使用的库函数if(GPIO_ReadInputPin(ARF_PORT,TRSDAT)==1),但总是没有进入过,一开始以为是其它如延时,访问时序的问题所致,将那些代码仔细检查过了都没有问题。于是考虑将GPIO_ReadInputPin(ARF_PORT,TRSDAT)读出来看看,是什么玩意。d=GPIO_ReadInputPin(ARF_PORT,TRSDAT); 总是返回为0 也就是RESET状态。

        原型如下:

BitStatus GPIO_ReadInputPin(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef GPIO_Pin)
{
  return ((BitStatus)(GPIOx->IDR & (u8)GPIO_Pin));
}


typedef enum {
  RESET = 0,
  SET = !RESET
}
FlagStatus, ITStatus, BitStatus;

       注意这里存在一个使用上的问题,这个函数是不能这样判断的  if(GPIO_ReadInputPin(GPIOC,TRSDAT)==1) ,这是错误的,按库函数的意思是,返回非0就表示是高电平。一定得注意。但我出现的问题并不在这里,而是这个函数总是返回0,如下图:


TRSDAT是连接在PC3口,这里PC_IDR 为0x88    10001000b 第3位为1,意味着是存在高电平的,但变量d的值仍是0 RESET,操蛋了个去。

接着往下执行,下图:

完全正常,可问题就是为什么这

GPIO_ReadInputPin(ARF_PORT,TRSDAT)
就不正常呢???? 


反正是可以正常读出寄存器值了,接着往下写驱动了。


总结:

      BJX8F101BTG 就是STM8S系列,但有些管脚上的微微差别。

      BJX-LINK-001仿真器就是ST-LINK。

      出现"chip does not answer" 很可能需要给板子供电。

      使用库函数时一定注意用法,而且不能全信。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这段代码是一个函数`my_para_qtinit`,接受一个指向`sjz`类型结构体的指针`td`作为参数。函数的作用是初始化一些参数值,并将其赋值给结构体`td`的相应成员变量。 首先,将`td->bd[0]`的值赋给`td->cs[0]`。然后,依次将`td->bd[1]`、`td->bd[2]`和`td->bd[3]`的值分别赋给`td->cs[1]`、`td->cs[2]`和`td->cs[3]`。 接下来,将`td->bd[0]`的值赋给`td->biaoq[0]`,表示零气的样品值。然后,将`td->bd[1]`的值乘以80再除以100,并赋给`td->biaoq[1]`表示样品值1。类似地,将`td->bd[2]`的值乘以80再除以100,并赋给`td->biaoq[2]`表示样品值2。将`td->bd[3]`的值乘以80再除以100,并赋给`td->biaoq[3]`表示样品值3。 接着,将`td->biaoq[1]`的值赋给`td->wucx[0]`,表示零气的误差限。将`td->biaoq[1]`的值赋给`td->wucx[1]`表示误差限1。将`td->biaoq[2]`的值除以2,并赋给`td->wucx[2]`表示误差限2。将`td->biaoq[3]`的值除以2,并赋给`td->wucx[3]`表示误差限3。 然后,计算并赋值给`td->bjx`和`td->bjs`,分别为报警下限和报警上限。`td->bjx`的值是`td->bd[0] - td->bd[2]`,而`td->bjs`的值是`td->bd[3] + td->bd[2]`。 将`td->bd[1]`的值赋给`td->gaojck`,表示告警窗口。 接下来,通过位操作设置结构体成员变量`td->ctl`中的一些标志位。例如,通过`BBM(td->ctl, MY_TDCTL_LC0) = 0`将标定量程的第0位设置为0。 最后,设置了其他一些标志位,如超限告警使能为1,测量模式为校正值等。 请注意,代码中使用了宏定义,如`BBM`和一些结构体成员变量,这些宏定义和结构体成员变量可能在其他地方进行了定义。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值