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

基于STM32模拟IIC驱动sht30温湿度传感器经验分享

[复制链接]
攻城狮Melo 发布时间:2023-5-1 17:34
最近有在使用sht30这个传感器,相比于新手常用的dht11传感器,sht30更精确,自己花了半小时调好了
% ?  h# F, s, @  v% S; f  l( j" m
所以拿出来分享给大家。
/ l2 _6 t( A2 v. k1 `1 Q
  r8 @7 u1 `( i1 C7 X7 u% Y: t: y
sht30外观
% w6 z. L1 q5 c6 L* ?  V
: I; c# U/ ?) [& M0 \$ i1 M% e
bffa7cbd45b741099fa0e90f0f74a175.jpg
8 _4 |; t* f5 ]# p5 w0 t: r8 N1 m4 z6 n! O5 E5 z0 b/ q: k) k
驱动不是自己写的, 是采用CSDN上的一位朋友的 ,这里贴出来的代码不是本文的主旨, 重要是教会大/ k, w) o; }- N5 d
) _5 W0 c- K& W
家如何配置各个端口(因为是模拟iic 所以大多数引脚都模拟为SCLK和DATA)。/ F4 t& O% Z# r: ~
/ ?. C, f! C! N1 X% M$ B" C" y- a
串口输出图7 F# o; p* A, s1 A1 `
% v/ k; n' X6 r# m9 z6 @. J
52ceba75d06043168c6b13052ebbc1e2.png ! _( r- f9 g! }9 M3 Q: Y, m& E: f

4 R) M& i3 b) t

# o  F9 m3 `3 v0 t* f7 e8 e5 s驱动代码, l5 O+ ?8 v0 w! s" j

8 j+ S% v. ^1 S0 y. Q1 T2 b4 K

; V. ~* e7 C4 @$ V" `sht30.c

5 ?3 i* K- ~7 |
  1. #include "SHT30.h" & A# k$ l0 c) ~7 ?1 H3 ~: Q
  2. 0 J8 _" m! _7 s! K( M
  3. #define write 0
    , M# V/ y  |* d4 d
  4. #define read  14 c8 c0 b2 j! b2 w: s9 n
  5. ' k% r: I7 e, E$ s
  6. //IIC总线接口定义
    ( P/ u# C& }5 r
  7. #define SCL PAout(5)
      f/ {, R! e' D1 b0 }1 O4 Y
  8. #define SDA_OUT PAout(6)
    / d1 i0 E' Y) L9 A9 ]& j- T
  9. #define SDA_IN PAin(6)
    2 D( F8 c# s4 X8 ?- c/ _
  10. #define IIC_INPUT_MODE_SET()  {GPIOA->CRL&=0XF0FFFFFF;GPIOA->CRL|=8<<24;}
    0 {" d, d0 P% I. N8 O7 g# W
  11. #define IIC_OUTPUT_MODE_SET() {GPIOA->CRL&=0XF0FFFFFF;GPIOA->CRL|=3<<24;}
    . [0 C$ v7 r2 P$ S3 ~
  12. 1 a  B# t$ [2 C- q; e( t$ f
  13. % V* e4 H% T; x7 e- d9 X
  14. float humiture[4];/ O7 G( w+ i( C0 ~- O# _3 g/ r
  15. u8 humiture_buff1[20];5 |4 |) ~! \, z7 X

  16. 4 g% U+ f7 g5 ]6 O: l& i
  17. void SHT30_Init(void)
    ) M7 q5 {8 W' l- k( Q  D9 T
  18. {; d0 p! J$ |; _' Y: P
  19.         GPIO_InitTypeDef GPIO_InitStructure;  @0 E# I  Z0 p: n4 w* u
  20.         //RCC->APB2ENR|=1<<4;//先使能外设IO PORTC时钟 3 ~/ b3 {! j( t
  21.         RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOA, ENABLE );       
      U: V) c2 B# |( ~0 A6 K
  22.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6;
    $ z0 u8 H2 n4 |( W" L& l
  23.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //推挽输出
    ' @. v' y! z) E+ A0 m. n9 D5 N2 Q
  24.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    $ l5 f8 K- o8 y( i* R/ @! }
  25.         GPIO_Init(GPIOA, &GPIO_InitStructure);
    & C$ q& n+ o8 o6 X( ^  B! T% |! Q
  26.         SCL=1;
    0 {3 O( U' E5 Y- _' A
  27.         SDA_OUT=1;- S# g/ N) b9 V1 ^
  28. }        2 _, [& O% c0 |- S2 x/ {
  29. /*主机发送ACK*/6 K$ d! Q$ f! \* r+ x
  30. void IIC_ACK(void)
    9 H1 r$ v: V  _0 ?4 w+ o/ u. ~, f
  31. {
    - l( u  }5 f* h, S: T- K
  32.   IIC_OUTPUT_MODE_SET();
    / R$ ^) a8 B# ?* K  ], k% v3 Z% O
  33.   SCL=0;& A' Q' L; f+ M9 R4 ^  u  r* s/ I+ r, ]
  34.   delay_us(2);
    4 c! X4 W/ }% ~0 @1 q) l- d
  35.   SDA_OUT=0;, ~* O0 j8 r8 s. [
  36.   delay_us(2);     
    ) o. H; R3 R7 T4 I1 u! H
  37.   SCL=1;
    " p4 `/ R; M3 A. c9 g
  38.   delay_us(2);                  - x$ g1 G% ?4 v, U, M
  39.   SCL=0;                     ) `% m% W* c3 F8 [
  40.   delay_us(1);    * \  P0 u' T# }  l. }7 u7 _, Z
  41. }
    , c" |. G: q" p% s6 `) n
  42. /*主机不发送ACK*/* O7 [; g. b% i' H% N* V* Z0 _
  43. void IIC_NACK(void)
    ; `& B* d8 Z+ M( U3 q3 H1 z
  44. {# U% }3 U! L9 k( u- q
  45.   IIC_OUTPUT_MODE_SET();& d3 a/ {" R! ]/ M
  46.   SCL=0;  R+ w* |! d# T! V2 Z' x3 s
  47.   delay_us(2);
    9 l; x1 r- W% @0 r4 t) R/ l
  48.   SDA_OUT=1;8 e. b) ], y1 H/ N, v0 f2 y- |
  49.   delay_us(2);      
    8 A' |8 P+ i* Y+ u7 O
  50.   SCL=1;3 Z5 ]4 ~1 D: h- f* U
  51.   delay_us(2);                   " _7 g5 m  E3 O5 l
  52.   SCL=0;                     3 u; n: m  V, h5 }2 d% Q
  53.   delay_us(1);   
    $ ~) q  J0 _$ [# Z8 R/ a
  54. }
    - ~3 {3 M) A: I0 K
  55. /*主机等待从机的ACK*/$ m3 L9 q6 i5 R1 O7 f0 u4 G
  56. u8 IIC_wait_ACK(void)" h7 T+ k/ k( P8 L0 S* \9 b$ o8 N
  57. {
      W; @+ j  u$ V+ F
  58.     u8 t = 200;! R, {/ w$ |9 R8 `# t: {
  59.     IIC_OUTPUT_MODE_SET();
    . J/ K# }+ i) j% k
  60.     SDA_OUT=1;//8位发送完后释放数据线,准备接收应答位 . u7 W) o9 y4 T, q, D+ n8 Y
  61.     delay_us(1);, \$ s; n% b; E
  62.     SCL=0;: @4 O! a3 H. r& B+ a
  63.     delay_us(1); % ~. Y8 o& g( g4 h& b; t: c- L6 ?
  64.     IIC_INPUT_MODE_SET();
    7 e% |8 ~, t' l" s  ~7 _0 k  g
  65.     delay_us(1);
    # B/ R: a! _3 O: _6 M2 A" t& ]
  66.     while(SDA_IN)//等待SHT30应答
    9 X& z1 S; y* d1 Z3 p9 F
  67.     {
    2 \- I8 `1 }9 C7 s% p, h; v
  68.         t--;
    , Q7 e$ h, r( R; J5 Y
  69.         delay_us(1); ' N+ o5 A( A9 C" D, D) i
  70.         if(t==0). f' h9 X* J& ]% Y' `% [# k# e) h
  71.         {
    + _* }2 t9 n& O7 D9 _
  72.           SCL=0;
    6 W5 |. t3 \$ X3 P& W1 \+ |
  73.           return 1;6 X; G- o: C6 O9 l% h
  74.         }9 _& s) X$ [. J/ X2 F1 I  r: ^9 v
  75.         delay_us(1); ' o9 i2 y; Z- |+ G- U" v8 v/ Z
  76.     }1 p# q4 \$ \% j' e
  77.     delay_us(1);      
    , r+ l1 y9 @! x' {) Q! e( F
  78.     SCL=1;) U# r$ C( \) y( k: s
  79.     delay_us(1);8 L- c' W6 N' b9 v# d3 W' Y) l+ A
  80.     SCL=0;            
    - q! O8 V/ x/ Y' {
  81.     delay_us(1);    1 V# X, m' Q; I" u
  82.     return 0;       
    7 K: }6 K  f3 ]* M5 l& O6 F' n) a! Z
  83. }
    & ]4 p5 M5 d7 N7 ^$ E" U- {
  84. /*******************************************************************( U+ k3 i: }- Q
  85. 功能:启动I2C总线,即发送I2C起始条件.  ) ]- U, S4 a0 U2 ^& a( t5 r# X
  86. ********************************************************************/
    % G2 x8 k7 x' U
  87. void IIC_Start(void)
    & t" e% a/ J" X
  88. {( M5 V* K$ @- z2 c+ w9 u2 H
  89.   IIC_OUTPUT_MODE_SET();8 _- i3 v2 J7 ~* n3 a, ~
  90.   SDA_OUT=1;
    5 C+ B3 r  W0 {- G
  91.   SCL=1;
    2 F8 v! G" H. d% f( Z; P
  92.   delay_us(4);       
    " S7 a5 T, K" S! A+ @# i  x
  93.   SDA_OUT=0;( ~, X  ]3 M/ G
  94.   delay_us(4);
    , D% K# a, o" ~( M3 J
  95.   SCL=0;
    / r# N  [' u6 ]$ Q3 k. v" l: k* n
  96. }- w- z" u$ x! N8 g  Q

  97. , q* g+ U3 T' o7 p" [& m- b5 u
  98. /*******************************************************************8 |% x+ O$ t- K$ z$ P$ e6 ]
  99. 功能:结束I2C总线,即发送I2C结束条件.  
    ( G3 {' g# F8 h5 T+ {- ]* h" j
  100. ********************************************************************/
    % p0 t* l- f6 g! _
  101. void IIC_Stop(void)) j, d/ X6 ~0 q% N3 i
  102. {$ L8 I+ ^+ P9 ?$ [: r5 Z, e5 g
  103.         IIC_OUTPUT_MODE_SET();
      \$ d$ p& s9 A+ d, v  W7 {4 b
  104.         SCL=0;- A0 j* h* Z2 J6 h% L$ o. Z8 \
  105.         SDA_OUT=0;  
    3 K# k4 }9 M6 G9 `. z+ K) v0 r
  106.         delay_us(4);       
    . Q) ]3 ~/ I* e+ k9 N5 ~/ E# V
  107.         SCL=1;
    3 R1 Q0 L' l5 {9 I6 A3 @
  108.         delay_us(4);( Z, V+ H3 ^0 j% ]2 z3 J. N
  109.         SDA_OUT=1;
    : {/ G) g! A$ g5 o
  110.         delay_us(4);6 N5 n, O2 a& I. m% B
  111. }
    " K& Z; n* a' _" o3 w5 D

  112. : U* y1 J! r8 i) ]3 h# ]
  113. /*******************************************************************
    , y2 ]9 ^7 S) u2 U# l% O
  114. 字节数据发送函数               
    ; f& J( B+ |2 I5 s8 j% `3 ?' Y
  115. 函数原型: void  SendByte(UCHAR c);- C( y8 H! d" z# i0 A
  116. 功能:将数据c发送出去,可以是地址,也可以是数据
    - \. B* k- z6 H( M4 ~2 q$ Z- x" d
  117. ********************************************************************/
    3 U. ?5 P) O  C7 u, |
  118. void  IIC_SendByte(u8 byte)# _# a9 K3 r1 }! J5 {$ d
  119. {4 g3 t) U7 g) r/ Y: s
  120.         u8  BitCnt;
    & X% Y. {: U+ L0 H4 v- a* k' `
  121.         IIC_OUTPUT_MODE_SET();
    1 k  M. P  Q7 Q* A. L. T; E: j
  122.         SCL=0;6 z0 c0 g/ w. {# i  e$ q5 K" N, j
  123.         for(BitCnt=0;BitCnt<8;BitCnt++)//要传送的数据长度为8位; k+ Q5 [; C) K9 |8 W+ b2 H8 c
  124.         {
    $ |# H; t0 Y' A0 {! s2 [
  125.                 if(byte&0x80) SDA_OUT=1;//判断发送位
    ( l5 q5 L/ {# ]3 b- U% B3 N
  126.                 else SDA_OUT=0;
    0 Z5 t8 C  p7 G' r( Y
  127.                 byte<<=1;
    % g4 A5 [5 {$ L0 [) y. Q* Z
  128.                 delay_us(2); ; Q; x# s  ^* y$ t' G
  129.                 SCL=1;
    ) b% R5 \) i# U# D4 ]' i
  130.                 delay_us(2);
    9 m& P: p9 X( a
  131.                 SCL=0;+ ?% B. s  Z0 \* V
  132.                 delay_us(2);8 w  Q( {) D: ]3 B
  133.         }9 d4 i8 O- ?6 m
  134. }
    3 I  b9 V6 H% d0 H$ d" }
  135. /*******************************************************************, Q+ G1 X$ H0 g' O2 {
  136. 字节数据接收函数               
    . h2 W: F) R) Z- k% q  B, t
  137. 函数原型: UCHAR  RcvByte();) u- K8 f# }# B' v4 p; E
  138. 功能: 用来接收从器件传来的数据  
    ) W% O3 E0 f9 }+ f0 D8 Z3 P
  139. ********************************************************************/    / @4 ~! ?, g) ~: Z5 Q
  140. u8 IIC_RcvByte(void)
    + _  o7 G+ X4 j/ t* {( [
  141. {# y( l2 X* x+ v, |
  142.   u8 retc;
    4 Z- w$ _; k* d; e' K: t, x
  143.   u8 BitCnt;
    ( F7 _/ r( C  y! f) Y  b; B0 l, T
  144.   retc=0; & T0 a# O. p+ C# T" c
  145.   IIC_INPUT_MODE_SET();//置数据线为输入方式
    : u6 @: l8 b; Y9 u; ?0 T  o
  146.   delay_us(1);                    0 n5 c- }( |* R3 Y
  147.   for(BitCnt=0;BitCnt<8;BitCnt++): Z9 x5 S& j* c! c
  148.   {  
    # u- K/ E% A  s
  149.         SCL=0;//置时钟线为低,准备接收数据位6 C4 E9 t; \6 c: C/ l7 a- }' w+ e
  150.         delay_us(2);               . a9 {* r* i' \5 U! }, a
  151.         SCL=1;//置时钟线为高使数据线上数据有效               
    ( \0 U2 j; D+ ?
  152.         retc=retc<<1;
    - R# _$ ?6 ]  D3 ?& O6 O4 M" c
  153.         if(SDA_IN) retc |=1;//读数据位,接收的数据位放入retc中
    : Z8 |" h( N# p: ^, x$ Z! N. W) p& W  a
  154.         delay_us(1);
    / B! H3 Y7 E& ]5 U) `) X* b
  155.   }
    8 [5 V% i- \7 K
  156.   SCL=0;   
    " F; b8 p) f- E6 @  m  g
  157.   return(retc);
    ; _4 S2 ?8 s2 i
  158. }
    5 {1 B& p0 J' A* ?
  159. /*******************************************************************0 c0 q3 _  x0 e. f
  160. 温湿度获取函数               
    " m% W( b7 e0 T/ V6 ~5 E# s+ A' F3 ^
  161. 函数原型: SHT30_read_result(u8 addr);1 a/ l' f7 ]$ ]* T! j
  162. 功能: 用来接收从器件采集并合成温湿度
    4 R5 W( Z6 x# y1 ~, v" J9 i8 I6 h& ^
  163. ********************************************************************/
    5 `9 D% M: C+ E5 o8 t
  164. void SHT30_read_result(u8 addr)* U3 G9 Z7 V2 v- `( G
  165. {
    9 A2 y! ?! x* X& G8 P
  166.         u16 tem,hum;
    $ V! H  |# ~1 I
  167.         u16 buff[6];
    ! W8 i; H) z& X/ U! C7 D2 ~
  168.         float Temperature=0;
    ) B& C6 @  d8 ?# Q( O
  169.         float Humidity=0;
    * N6 n" w* g4 Y* e0 Y8 p
  170.        
    % _: l* H! V% b$ ?
  171.         IIC_Start();6 W  J- D; v1 {9 M  I+ m& ?7 s
  172.         IIC_SendByte(addr<<1 | write);//写7位I2C设备地址加0作为写取位,1为读取位
    & T" f8 U! ~) l" ]# A, h
  173.         IIC_wait_ACK();
    5 ]- I* K+ k; r" o( z
  174.         IIC_SendByte(0x2C);' ]& A# a& T, T  q) W, S  F
  175.         IIC_wait_ACK();
    % L6 `/ |. G  B) L9 Z' E; ?
  176.         IIC_SendByte(0x06);
    1 h6 |& h6 a7 j+ x
  177.         IIC_wait_ACK();# e9 K2 L; A! K' D
  178.         IIC_Stop();
      I' J' V$ b9 U: z4 R
  179.         delay_ms(50);* |6 j% Z8 n4 @" V0 s
  180.         IIC_Start();' p  T0 p2 W* O2 Z% Q- o. }' q
  181.         IIC_SendByte(addr<<1 | read);//写7位I2C设备地址加0作为写取位,1为读取位
    / i7 C2 U% F, D
  182.         if(IIC_wait_ACK()==0)8 [- l6 @+ E9 @) _, B# X4 m
  183.         {
      l. q: L1 n& u! ?) N* z
  184.                 buff[0]=IIC_RcvByte();; H: S! C* J5 u2 t( x
  185.                 IIC_ACK();# w. a: q4 w! M8 U1 C+ i
  186.                 buff[1]=IIC_RcvByte();
    + G" F$ r+ o  D; D2 p( X+ ]
  187.                 IIC_ACK();
      t9 K) R% A: D' a. i
  188.                 buff[2]=IIC_RcvByte();
    ( n; C7 A2 \3 Z/ a' @. D+ C
  189.                 IIC_ACK();' ]/ k9 L- C6 \. L! F
  190.                 buff[3]=IIC_RcvByte();1 B. T: C3 i2 N9 V6 R1 s1 b5 G
  191.                 IIC_ACK();
    " }. B) Y% @/ {5 N6 n2 a
  192.                 buff[4]=IIC_RcvByte();
    : ]9 z1 I1 B* x2 A7 q% o
  193.                 IIC_ACK();8 d& C7 e7 W6 ~) m
  194.                 buff[5]=IIC_RcvByte();! p7 E# D: v" K% A0 l3 n
  195.                 IIC_NACK();
    6 r, B+ K+ q5 O1 q) q9 _! U
  196.                 IIC_Stop();  K% O& p1 Q$ R# I0 l4 j, j; p6 r9 T
  197.         }
    - n7 T' c7 ~: P! a
  198.         4 @; y! b# r1 F8 P: T
  199.         tem = ((buff[0]<<8) | buff[1]);//温度拼接
    ; D# @4 ?! R( {6 [  T. X
  200.         hum = ((buff[3]<<8) | buff[4]);//湿度拼接
    ; M4 J+ t5 L2 h# A3 Z6 A& v6 M" c8 y& M
  201.        
      ~& h" M# _& S, H( X
  202.         /*转换实际温度*/
    7 L  ?5 V" Z, B$ y+ y. X
  203.         Temperature= (175.0*(float)tem/65535.0-45.0) ;// T = -45 + 175 * tem / (2^16-1)8 y; p+ G6 \! e0 w" q$ t. A
  204.         Humidity= (100.0*(float)hum/65535.0);// RH = hum*100 / (2^16-1)0 F0 q0 `" y: v
  205.        
    % v" C3 y1 v: {" @2 [9 s3 f# v
  206.         if((Temperature>=-20)&&(Temperature<=125)&&(Humidity>=0)&&(Humidity<=100))//过滤错误数据
    9 [7 H' D) q* Q* M- d
  207.         {& `6 Y# |2 A1 _. J, n
  208. //                humiture[0]=Temperature;) H4 y. w: Z# l0 @- n  B, y
  209. //                humiture[2]=Humidity;
    5 |# u4 l7 j) k: o/ q
  210.                 sprintf(humiture_buff1,"%6.2f*C %6.2f%%",Temperature,Humidity);//111.01*C 100.01%(保留2位小数)- L* K/ c, x- W
  211.         }
    , v; V7 G: ?' T1 t
  212.         printf("温湿度:%s\n",humiture_buff1);2 k& b$ q! ~9 S! N5 N: Q/ H
  213.         hum=0;8 ?7 n7 v( ^, w$ @* ^3 Y* Y
  214.         tem=0;
    3 y7 k* k+ H! G
  215. }; \0 W% X% s1 N- V' d  v
  216. 6 S1 |! k2 t3 b8 T
复制代码

2 g; B  S; z# d; H; j) f. O, G2 p4 K
sht30.h4 p+ {# G/ L( R. D
  1. #ifndef SHT30_H
    ; D/ ?  K- _9 c6 y! y
  2. #define SHT30_H
    $ b8 `* @- w4 ~8 d) n8 H+ ]6 z5 |4 G; F
  3. #include "delay.h"
    ; B! ~6 g( J0 h
  4. #include "sys.h"  F9 C& x/ s2 @$ u
  5. #include "stdio.h"* i3 o$ N7 X; k7 p7 u
  6. #include "usart.h"
    2 f9 P4 C6 `0 g4 E% q9 @+ S
  7. #include "string.h"5 r: }8 Q" [8 s$ h

  8. 0 b1 U' O, d( S/ f: T
  9. extern u8 humiture_buff1[20];3 s( j8 O% @8 e3 j3 q8 I
  10. ( F5 n2 x- q+ x/ f* @: ~
  11. void SHT30_Init(void);2 k, V3 G- [1 _5 s
  12. void IIC_ACK(void);; M) Y* m0 K2 Y, k' N* S* T% X
  13. void IIC_NACK(void);
    ; A( O- Q  `& ^% i- z: t
  14. u8 IIC_wait_ACK(void);. B  d4 Z2 E8 _1 h% Q* l
  15. void IIC_Start(void);- Q  i) B! t7 M* b( [! d$ q8 h
  16. void IIC_Stop(void);3 S  `) K5 e4 m% O% n6 Q
  17. void IIC_SendByte(u8 byte);
    9 M7 ~9 o5 U0 N+ s# P/ g/ y( i
  18. u8 IIC_RcvByte(void);0 D# M# r3 I" @; f! v
  19. void SHT30_read_result(u8 addr);
    " v  _" W5 V1 d4 d7 K* z
  20. / i# U" a+ `6 n& U7 O9 _
  21. #endif
    ) C/ _: n* D  W& P4 Y

  22. $ b) Z8 _" H; b5 U. K4 \5 m: Z$ D
复制代码
: t+ B! m7 u! L, [' `- |% G* t% x7 k

( e" T. p) R) b! D$ e% _) p" T主函数(while循环可以写个测试的printf)

9 B9 m# K, p" K8 W& \8 z) l$ g
  1. #include "delay.h"% N( y3 J1 \" l0 S
  2. #include "sys.h"
    " m% f. V- ~0 ^. D4 G2 ?
  3. #include "usart.h"# ~3 M7 G3 [! A: o
  4. #include "SHT30.h"0 @/ J/ U9 y3 l& r& C, v) k4 f
  5.           8 D, T+ z: z" H
  6. " O% F6 h& q$ d' m/ H9 q
  7. int main(void)* H+ D! u8 y' L0 X# x$ C# c
  8. {   |# l8 q/ w! d: W1 F) g
  9.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2
    - j! `2 c, O. K1 s1 `% o: y
  10.         delay_init();                     //延时函数初始化         " ~- [" Z! U& X4 |, p
  11.         uart_init(9600);                 //串口初始化为9600
    ( x# a7 s/ k5 H! j6 c
  12.         SHT30_Init();9 d3 l. b4 `- |# w
  13.         while(1)
    1 x4 [; _+ g. F5 f
  14.         {
    " ~/ n: ^* ]/ N, ~3 N, D3 c
  15.         //printf("123456");4 @) b0 N0 V3 i% X5 _
  16.         SHT30_read_result(0x44);5 s7 e. Z# V: D! t
  17.         delay_ms(300);        , ?" T& a" H3 I' W1 w4 ~
  18.         3 [9 ]; A8 y9 K9 y8 H1 s) a
  19.         }9 o/ _) r% O6 r0 F2 l; @$ a& [
  20. }% E; o8 B# ~9 V3 f  K& ?
复制代码
  g) [; E" u2 D. S7 A
5 H. O4 ?: f  b# v0 g6 s; e! F
代码实测能用 ,直接复制即可, 但是如果想改端口继续往下看。! r2 d! q% B2 p" T
, R6 [% y6 `7 O0 D6 L4 X% d
6774c10dea2042098e99e8631077a6d7.png , m- ]. s& A2 b' _0 n3 f

* Y, a. y* ^; f7 f9 T/ E' p' B/ ~

% y* d9 {3 C( |上图红色框选的是换端口所有需要改变的地方 这里漏框了上面的几个宏定义, 上面几个也要改。4 [9 R' B3 Y% ?6 h8 i3 Z, f7 n
1 p1 W0 [6 t' c8 p  [1 o
2e802c2982f548c4beeccdef58986892.png
: i: L7 \, z3 `8 ]

6 Y( n% H$ P: B  c, d& tGPIOA->CRL&=0XF0FFFFFF;理解为 清零了32位数据中的4位
! L. d! E" }5 D8 ]GPIOA->CRL|=8<<24;理解为置位了32位中的(24,25,26,27)的值
2 y* A5 o. v# h$ D3 _( ?  b" M0 e7 _4 l3 _( e
46cf89261805482cad2f5e489dc4d963.png : B1 o4 F8 U, j* }! ]3 A8 S3 q

; z% v2 _/ m2 t  H7 N% V
2674b0d15ec04fb5bd7d02e88244a690.png
5 q3 f5 R) S! y( J; c" }
9 [0 [5 o9 r" \4 t3 T# T
edd016c6192946cc96302a02c4e43e61.png
) T4 P: p( V  v2 ?1 g4 ]% T' |6 a# p

/ U4 ?3 u# _/ x: j% n* m上面两副图来自stm32中文手册 ,意思很明了, 有两个寄存器用来配置io口模式,CRL配置GPIO0-7, CRH配置GPIO8-15,第三副图是教你具体怎么配置,按照手册就可以选择配置你想用的端口了。; @# ^! ]6 Q. ~' h' X
————————————————* w7 e6 T# _2 w3 a
版权声明:文某9
/ o/ g$ }7 ?/ t# [( G- d如有侵权请联系删除! n1 u  _$ [/ t4 [1 N: B" t
+ x( g  g4 ]- |5 O' P. i# w- \

9 J1 q% g2 j' H- {3 J" }7 G) M; ~. S' r+ m& R9 _
收藏 评论0 发布时间:2023-5-1 17:34

举报

0个回答

所属标签

相似技术帖

官网相关资源

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