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

怎样做个蜘蛛精(六)

[复制链接]
五哥1 发布时间:2019-2-2 01:07
怎样做个蜘蛛精(六)
' O5 s( G+ |/ l  n+ ~1 \+ r6 }大家别找了,(一)、(二)(三)(四)(五)都没有发表,本来这个(六)也没有想着发表(懒癌犯了),但是文中的一个函数的应用,不得不让我把它提前单独发表。
7 U0 j( i: m1 }' _ 0.jpg
, y: n5 y$ x; M' H 5.jpg 继续前面的,不会说话的蜘蛛精不是好蜘蛛精,为此我在网上看看了网友的用法,发现小柒的《会说话的小台灯》很有意思,这个可以拿来用用,于是在网上买了WT588D的语音模块和相应的写码器,一个语音模块7元,写码器30多元,
3 t% y& @, P7 v+ Q# l' ]; P 1.jpg , T6 ?) C* D  u# n- w4 t
美滋滋的想着挂上就能用了,先是把厂家送的资料都看了看,把语音模块放入写码器,按规格写入一段语音,选用按键模式,给写码器配个耳机,语音模块在按键模式下正常,但是看看厂家给的三线模式的程序都是PIC,51的,没有STM32的,这个也难不倒我,上网查查看,找到了几个STM32的程序都是在正点原子程序中使用的,我用STM32F103RC测试一下,发现只有一个程序能用,唯一麻烦的是我的蜘蛛精主控是STM32F401CC,而且是用STM32CUBEMX,HAL库的,这个还要把程序改了才能用,这个又要改芯片,又要改程序,于是又把程序按照HAL库的写法,重新写过,Delay_us(150)的延时程序没有写,当时我就想,HAL库设计时没有考虑US级的延时,只考虑MS级的延时吗?不管这个函数的说明是怎样的,我试下HAL_Delay(0.15)能否代替Delay_us(150),如果不行,恐怕连编译都不能通过,然而,奇迹就此发生了,它通过了编译,并且成功使得我的蜘蛛精发出它的第一声叫喊“别碰我,你个臭唐僧,难道不知道我是蜘蛛精吗”。! X# `5 m; s5 c2 A- x" b4 W6 H3 l' o
3.jpg
1 Y1 _+ l  L5 @1 j& K 4.jpg 下面是厂家提供的PIC单片机的程序,51的程序,STM32F103RC的正点原子的程序,STM32CUBEMX的程序,有兴趣的同学可以对比的看看,用移植角度来看,STM32CUBEMX有着巨大的优势,这就是我一直坚持用STM32CUBEMX的原因。. n/ t& j+ |0 }/ K( A# C$ c
/*************51**************/4 [+ l  i1 S" C4 l$ u
//三线; M/ X# @' e5 D7 j; s) X0 t
sbit  P_DATA_3A = P0^0;   //定义数据传输% q" l0 T; G+ V) d8 I( G1 O- U! E
sbit  CS_3A     = P0^1;    //定义片选, w! l0 m3 f! b: F5 X1 j
sbit  CLK_3A    = P0^2;    //定义时钟
& S" w0 N2 m% |5 ^4 w* fbit  B_DATA;      //´«ÊäÊý¾Ýһλ& e, b4 ~8 {( k& K6 h) Z
unsigned char   SB_DATA   = 0;  //传输数据一位5 Z  Q4 n/ _( t+ Z( {! k
unsigned char   S_DATA    = 0x00;( Z& A2 \2 E3 y5 f' I
   
8 M4 c2 E4 @# j% A + Q& p% Z! F4 Y) {# w) k9 M# }! f( ]
/*--------------------------------------
3 n4 t7 [! Q+ v5 P% s% Z;三线单字节低位在前串口通信函数
  g$ S. B2 u8 lvoid Line_3A(unsigned char dat); _/ B/ a0 p% U: x4 q4 Q& M
{
) u" j0 ]: m6 D8 Q$ D+ k unsigned char i,key_copy = 0X00;
6 Y: I  r8 ^2 _9 X% U# a2 x# j$ k* O P_DATA = 1;
  C* H1 ]) s: ^3 T( J CLK_3A    = H;     //拉高
) E' _" m/ ^& c" s4 V, }2 I . Z+ q$ Y0 U0 }0 ^
CS_3A= L;         //拉低片选
- h8 p6 Z1 |/ a Delay_1ms(5);        //5ms6 U4 P4 w: B& W
B_DATA = dat&0X01;
# a2 P4 |& D4 e* z' j  
1 R$ [0 b! P  H/ `' E/ P" ? for(i=0;i<8;i++)2 X% w* w' u6 P+ a/ f
{: x& U& ?# c2 u
  CLK_3A    = L;     //拉低" C) _; i1 @6 @5 R$ w6 p1 V- U
  P_DATA_3A = B_DATA;   //传输数据一位
6 V; w2 u! h$ q  , r- E: O+ x! Y1 _6 n8 H9 Q
  Delay_10us(15);      //延时150us
! }: w$ A8 D# W2 P" o# T" z  CLK_3A    = H;     //拉高3 Z2 G2 Q8 `& X9 R2 Q- H
  Delay_10us(15);       //延时150us2 D! N  }, e! j/ @: p8 e7 Y) M
      
9 o  E* K( {, U! b5 i8 T8 U  dat = dat>>1;     
+ e1 u4 K  e; U& {1 J* o  B_DATA = dat&0X01;   5 z# J7 G/ r  O2 f
}
! Z0 @6 h: Y, ^9 C$ X, u$ Y P_DATA_3A  = 1;      //拉高电平
1 `: i) d0 p& }; x  |2 ` CS_3A  = H;     ( V1 k3 ?" a. {# [( U
CLK_3A = H;     
! a( @+ J& S  r; s. Z: k}; S! C+ F9 K8 l5 ?- r& [
/****************51程序结束********************/
5 J+ e) I5 W0 Q/***********标准库正点原子*****************/
. T% t  v! G) l//发送数据函数
! Y/ c9 K  ^4 S$ p( Q//  PA14(SCL)            时钟4 y- A( X* _8 V3 a  M" G+ Y( @
//  PA12(CS)             片选
6 s& e. H+ w0 I5 c8 H1 U7 \" w5 m( q//  PA13(DATA)        数据
/ @) P) T7 }2 k, v//PBout(0)  复位信号
, Z# W& q+ F) A& a4 D* Zvoid  YUY_Chul(uint16_t addr)
) j* `' I1 s. y: K2 H# S{2 V5 q$ q8 H! d0 w; j% c3 K9 p
       unsigned char i;# l8 H/ N, f1 _
       delay_ms(20);
7 y0 v/ s  u2 ?1 |, b7 N       GPIO_ResetBits(GPIOB,GPIO_Pin_12);   // CS=0; $ D' _2 n3 O0 n2 c! C) r
       delay_ms(5);& V( l% B; L, l1 m- q* x$ r
        for(i=0;i<8;i++) / a. V3 N8 W# k3 S4 ]
        {6 _5 g' w/ W  _2 ^# C, n* t0 B
     GPIO_ResetBits(GPIOB,GPIO_Pin_14);           //SCL=0;
7 }! @' F0 a1 n' p         if(addr & 1)GPIO_SetBits(GPIOB,GPIO_Pin_13); //DATA=1; $ I/ l% \1 F" M' x2 I7 t; e% l* q
         else GPIO_ResetBits(GPIOB,GPIO_Pin_13);      //DATA=0; # V8 h9 o4 D* w$ T
         addr>>=1; ) Y. u0 o! z* r
         delay_us(150);  /* 150us */ % o3 Z5 B# N# t5 a
         GPIO_SetBits(GPIOB,GPIO_Pin_14);          //SCL=1;   / U9 }( T4 [: I2 q# w% r
         delay_us(150);  
$ ~) k4 L' w4 s' t) `1 ]( i. x1 Q+ `       }
$ X. ?- _8 Z/ D. T. Z' F        GPIO_SetBits(GPIOB,GPIO_Pin_12);        //CS=1;- i. @6 _1 }9 g$ f
}
- w/ F: k3 Y; n: I/***********标准库正点原子程序结束*************/# e7 j  B' }0 l7 I( ^" A9 s
/***********HAL*****************/* Z. E! e" M6 G( d* C
//发送数据函数5 p" o& v' O6 ~! ]% b9 ]
//  PA14(SCL)           时钟
+ v2 B" R( n2 U( ^, w//  PA12(CS)             片选
' U: Y4 |5 o! U# `& w: c* Q0 I//  PA13(DATA)        数据2 ^' m! e; Y2 F, j8 _1 c+ @  A
//PBout(0)  复位信号# Q% k# }! ~- Q) X  w9 u  L
void  YUY_Chul(uint16_t addr)
' y' I) g4 Q) ^' }{% V7 e2 \3 [9 y% _9 ?2 N
       unsigned char i;
0 Y- T3 ]; l8 x) G8 _      HAL_Delay(20);0 l: q' U; ~7 }* C) e1 W
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET);// CS=0;
8 L/ u; E) M" J9 p+ l+ T2 d        HAL_Delay(5);8 c& Y, b  u" E9 B- V
        for(i=0;i<8;i++) 5 f  g- _( i% D5 H' C
        {
$ t" |2 u0 `% X& s' Y7 j! S9 M     HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_RESET); //SCL=0; ( \4 O; W3 |3 @3 `8 n7 f
         if(addr & 1)8 _  @( ^' I+ c, f
     HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_SET);//DATA=1;
$ E) \; w+ v6 W! ~/ F1 @6 R5 r' a         else      
! z6 t# s+ X7 F/ P1 C6 I) P  K/ `     HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_RESET);//DATA=0;
. _* {4 V5 G' D$ x! h  a6 b         addr>>=1;
2 ^6 ?$ a: _5 N1 |$ u8 P  [        HAL_Delay(0.15);/* 150us */" M; ]) G6 G1 N/ j
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_SET);//SCL=1;  
9 r! m4 ?9 {& Z6 w; y        HAL_Delay(0.15);/* 150us */
$ W0 ], u8 J4 V8 O. W: W       } : h  w* C6 k7 ?! C5 L
       HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET);//CS=1;
: o% b/ `) M# ?1 c}# Z: R& {1 T$ R3 g9 i
/***********HAL程序结束*****************/
/ T& ^# K  t+ x/ o' ^% Y) {# C在此就HAL_Delay()函数和大家聊一聊,我一直没有发现有这样用的,而且发现正点原子的HAL库的程序也不用HAL_Delay()函数,好像是因为中断优先级缘故,导致程序跑飞。难道这个函数的设计这么不堪?毕竟是老外的设计,老外的思想咱一时还摸不透,有同学认为按着HAL_Delay()函数的定义,HAL_Delay(0.15)会等同于HAL_Delay(0),然而实事却不是这样,你们也许有更高明的解释,但是我只是突发奇想,并用实事告诉你,不是你理解有误,就是这个函数解释有问题。实事上我也没有最终搞明白这个HAL_Delay(0.15)这么用为啥能行。我还等着你的解释那。$ l6 e' y5 y) M# _2 o2 i; b+ r
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
& w, a1 d2 a# C4 U3 m# }  D$ B% F楼上说的在理,中断中不建议用长延时,短延时直接while(n--);即可
! R: y1 J' n8 U- s1 O) C# n
你能解释下为啥HAL_Delay(0.15);能用?
tanic 回答时间:2019-2-19 10:57:14
本帖最后由 tanic 于 2019-2-19 11:10 编辑
/ z* v( a3 V2 J0 L$ m& `
五哥1 发表于 2019-2-11 12:510 d, L. j7 K, N$ d1 @5 }
你能解释下为啥HAL_Delay(0.15);能用?
3 X: o9 Q7 r1 b7 ^, ^
你确定能用?0.15有警告,实际会转化为0,等效HAL_Delay(0),里面有几行代码,估计也就是几个微秒就执行完毕。
/ W- b  a$ u. f6 h6 [2 b你说0.15是150us,用示波器测试了吗?% {- _, b2 y  W' G" Z
五哥1 回答时间:2019-2-19 12:26:37
tanic 发表于 2019-2-19 10:57
/ F* B% n* k9 \* b' n! `6 o9 G6 F你确定能用?0.15有警告,实际会转化为0,等效HAL_Delay(0),里面有几行代码,估计也就是几个微秒就执行完 ...
: P% }0 }0 J' B7 w
示波器测试还没有,但是根据WT588D的手册,这个延时时间必须控制在300US以内,否则就不起作用了。有个玩具示波器可以测试下。KILE里HAL_Delaly(0.15);不会报错,能通过编译。
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版