你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

怎样做个蜘蛛精(六)

[复制链接]
五哥1 发布时间:2019-2-2 01:07
怎样做个蜘蛛精(六)
大家别找了,(一)、(二)(三)(四)(五)都没有发表,本来这个(六)也没有想着发表(懒癌犯了),但是文中的一个函数的应用,不得不让我把它提前单独发表。
0.jpg
5.jpg 继续前面的,不会说话的蜘蛛精不是好蜘蛛精,为此我在网上看看了网友的用法,发现小柒的《会说话的小台灯》很有意思,这个可以拿来用用,于是在网上买了WT588D的语音模块和相应的写码器,一个语音模块7元,写码器30多元,
1.jpg
美滋滋的想着挂上就能用了,先是把厂家送的资料都看了看,把语音模块放入写码器,按规格写入一段语音,选用按键模式,给写码器配个耳机,语音模块在按键模式下正常,但是看看厂家给的三线模式的程序都是PIC,51的,没有STM32的,这个也难不倒我,上网查查看,找到了几个STM32的程序都是在正点原子程序中使用的,我用STM32F103RC测试一下,发现只有一个程序能用,唯一麻烦的是我的蜘蛛精主控是STM32F401CC,而且是用STM32CUBEMX,HAL库的,这个还要把程序改了才能用,这个又要改芯片,又要改程序,于是又把程序按照HAL库的写法,重新写过,Delay_us(150)的延时程序没有写,当时我就想,HAL库设计时没有考虑US级的延时,只考虑MS级的延时吗?不管这个函数的说明是怎样的,我试下HAL_Delay(0.15)能否代替Delay_us(150),如果不行,恐怕连编译都不能通过,然而,奇迹就此发生了,它通过了编译,并且成功使得我的蜘蛛精发出它的第一声叫喊“别碰我,你个臭唐僧,难道不知道我是蜘蛛精吗”。
3.jpg
4.jpg 下面是厂家提供的PIC单片机的程序,51的程序,STM32F103RC的正点原子的程序,STM32CUBEMX的程序,有兴趣的同学可以对比的看看,用移植角度来看,STM32CUBEMX有着巨大的优势,这就是我一直坚持用STM32CUBEMX的原因。
/*************51**************/
//三线
sbit  P_DATA_3A = P0^0;   //定义数据传输
sbit  CS_3A     = P0^1;    //定义片选
sbit  CLK_3A    = P0^2;    //定义时钟
bit  B_DATA;      //´«ÊäÊý¾Ýһλ
unsigned char   SB_DATA   = 0;  //传输数据一位
unsigned char   S_DATA    = 0x00;
   

/*--------------------------------------
;三线单字节低位在前串口通信函数
void Line_3A(unsigned char dat)
{
unsigned char i,key_copy = 0X00;
P_DATA = 1;
CLK_3A    = H;     //拉高

CS_3A= L;         //拉低片选
Delay_1ms(5);        //5ms
B_DATA = dat&0X01;
  
for(i=0;i<8;i++)
{
  CLK_3A    = L;     //拉低
  P_DATA_3A = B_DATA;   //传输数据一位
  
  Delay_10us(15);      //延时150us
  CLK_3A    = H;     //拉高
  Delay_10us(15);       //延时150us
      
  dat = dat>>1;     
  B_DATA = dat&0X01;   
}
P_DATA_3A  = 1;      //拉高电平
CS_3A  = H;     
CLK_3A = H;     
}
/****************51程序结束********************/
/***********标准库正点原子*****************/
//发送数据函数
//  PA14(SCL)            时钟
//  PA12(CS)             片选
//  PA13(DATA)        数据
//PBout(0)  复位信号
void  YUY_Chul(uint16_t addr)
{
       unsigned char i;
       delay_ms(20);
       GPIO_ResetBits(GPIOB,GPIO_Pin_12);   // CS=0;
       delay_ms(5);
        for(i=0;i<8;i++)
        {
     GPIO_ResetBits(GPIOB,GPIO_Pin_14);           //SCL=0;
         if(addr & 1)GPIO_SetBits(GPIOB,GPIO_Pin_13); //DATA=1;
         else GPIO_ResetBits(GPIOB,GPIO_Pin_13);      //DATA=0;
         addr>>=1;
         delay_us(150);  /* 150us */
         GPIO_SetBits(GPIOB,GPIO_Pin_14);          //SCL=1;   
         delay_us(150);  
       }
        GPIO_SetBits(GPIOB,GPIO_Pin_12);        //CS=1;
}
/***********标准库正点原子程序结束*************/
/***********HAL*****************/
//发送数据函数
//  PA14(SCL)           时钟
//  PA12(CS)             片选
//  PA13(DATA)        数据
//PBout(0)  复位信号
void  YUY_Chul(uint16_t addr)
{
       unsigned char i;
      HAL_Delay(20);
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET);// CS=0;
        HAL_Delay(5);
        for(i=0;i<8;i++)
        {
     HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_RESET); //SCL=0;
         if(addr & 1)
     HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_SET);//DATA=1;
         else      
     HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_RESET);//DATA=0;
         addr>>=1;
        HAL_Delay(0.15);/* 150us */
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_SET);//SCL=1;  
        HAL_Delay(0.15);/* 150us */
       }
       HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET);//CS=1;
}
/***********HAL程序结束*****************/
在此就HAL_Delay()函数和大家聊一聊,我一直没有发现有这样用的,而且发现正点原子的HAL库的程序也不用HAL_Delay()函数,好像是因为中断优先级缘故,导致程序跑飞。难道这个函数的设计这么不堪?毕竟是老外的设计,老外的思想咱一时还摸不透,有同学认为按着HAL_Delay()函数的定义,HAL_Delay(0.15)会等同于HAL_Delay(0),然而实事却不是这样,你们也许有更高明的解释,但是我只是突发奇想,并用实事告诉你,不是你理解有误,就是这个函数解释有问题。实事上我也没有最终搞明白这个HAL_Delay(0.15)这么用为啥能行。我还等着你的解释那。
2.jpg
收藏 1 评论7 发布时间:2019-2-2 01:07

举报

7个回答
STMCU-管管 回答时间:2019-2-2 14:55:04
哇哦
五哥1 回答时间:2019-2-2 18:28:32
哪位大侠有合理的解释呐?
奇迹 回答时间:2019-2-2 21:40:42
提示: 作者被禁止或删除 内容自动屏蔽
tanic 回答时间:2019-2-10 16:39:26
楼上说的在理,中断中不建议用长延时,短延时直接while(n--);即可
五哥1 回答时间:2019-2-11 12:51:04
tanic 发表于 2019-2-10 16:39
楼上说的在理,中断中不建议用长延时,短延时直接while(n--);即可

你能解释下为啥HAL_Delay(0.15);能用?
tanic 回答时间:2019-2-19 10:57:14
本帖最后由 tanic 于 2019-2-19 11:10 编辑
五哥1 发表于 2019-2-11 12:51
你能解释下为啥HAL_Delay(0.15);能用?

你确定能用?0.15有警告,实际会转化为0,等效HAL_Delay(0),里面有几行代码,估计也就是几个微秒就执行完毕。
你说0.15是150us,用示波器测试了吗?
五哥1 回答时间:2019-2-19 12:26:37
tanic 发表于 2019-2-19 10:57
你确定能用?0.15有警告,实际会转化为0,等效HAL_Delay(0),里面有几行代码,估计也就是几个微秒就执行完 ...

示波器测试还没有,但是根据WT588D的手册,这个延时时间必须控制在300US以内,否则就不起作用了。有个玩具示波器可以测试下。KILE里HAL_Delaly(0.15);不会报错,能通过编译。

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版