找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3655|回复: 4
收起左侧

STM32单片机+SHT30温湿度计程序PCB文件 UART输出

  [复制链接]
ID:261562 发表于 2019-6-20 16:43 | 显示全部楼层 |阅读模式
挺不错的资料,已经量产,对制作温湿度计的很有帮助

如果您需要再次烧录,请按此HEX文件进行烧录即可,芯片的Option选型按默认配置即可。

演示,烧录文件STM32F0XX_MD.HEX,HEX格式)放置在这个目录下面:
...\Project\SHT30\EWARM\STM32F0XX_MD(STM32F0x1xx)\Exe\

烧录工具一般用 ST-LINK/V2, 或者J-LINK都可以!

Altium Designer画的PCB图如下:(51hei附件中可下载工程文件)
0.png

单片机源程序如下:
  1. //==============================================================================
  2. //    S E N S I R I O N   AG,  Laubisruetistr. 44, CH-8712 Staefa, Switzerland
  3. //==============================================================================
  4. // Project   :  SHT3x Sample Code (V1.0)
  5. // File      :  sht3x.c (V1.0)
  6. // Author    :  RFU
  7. // Date      :  16-Jun-2014
  8. // Controller:  STM32F100RB
  9. // IDE       :  礦ision V4.71.2.0
  10. // Compiler  :  Armcc
  11. // Brief     :  Sensor Layer: Implementation of functions for sensor access.
  12. //==============================================================================

  13. //-- Includes ------------------------------------------------------------------
  14. #include "sht3x.h"
  15. #include "i2c_hal.h"

  16. //-- Defines -------------------------------------------------------------------
  17. // CRC
  18. #define POLYNOMIAL  0x131 // P(x) = x^8 + x^5 + x^4 + 1 = 100110001

  19. //------------------------------------------------------------------------------
  20. // IO-Pins                             /* -- adapt the defines for your uC -- */
  21. //------------------------------------------------------------------------------
  22. // Reset on port B, bit 12
  23. #define RESET_LOW()  (GPIOB->BSRR = 0x10000000) // set Reset to low
  24. #define RESET_HIGH() (GPIOB->BSRR = 0x00001000) // set Reset to high

  25. // Alert on port B, bit 10
  26. #define ALERT_READ   (GPIOB->IDR  & 0x0400)     // read Alert
  27. //------------------------------------------------------------------------------

  28. //-- Global variables ----------------------------------------------------------
  29. u8t _i2cWriteHeader;
  30. u8t _i2cReadHeader;

  31. //==============================================================================
  32. void SHT3X_Init(u8t i2cAdr){              /* -- adapt the init for your uC -- */
  33. //==============================================================================
  34.         // init I/O-pins
  35.         RCC->APB2ENR |= 0x00000008;  // I/O port B clock enabled
  36.         
  37.   // Alert on port B, bit 10
  38.         GPIOB->CRH   &= 0xFFFFF0FF;  // set floating input for Alert-Pin
  39.   GPIOB->CRH   |= 0x00000400;  //
  40.         
  41.   // Reset on port B, bit 12
  42.         GPIOB->CRH   &= 0xFFF0FFFF;  // set push-pull output for Reset pin
  43.   GPIOB->CRH   |= 0x00010000;  //
  44.         RESET_LOW();
  45.         
  46.   I2c_Init(); // init I2C
  47.   SHT3X_SetI2cAdr(i2cAdr);
  48.         
  49.         // release reset
  50.         RESET_HIGH();
  51. }

  52. //==============================================================================
  53. void SHT3X_SetI2cAdr(u8t i2cAdr){
  54. //==============================================================================
  55.   _i2cWriteHeader = i2cAdr << 1;
  56.   _i2cReadHeader = _i2cWriteHeader | 0x01;
  57. }

  58. //==============================================================================
  59. etError SHT3x_ReadSerialNumber(u32t *serialNbr){
  60. //==============================================================================
  61.   etError error; // error code
  62.   u16t serialNumWords[2];

  63.   error = SHT3X_StartWriteAccess();

  64.   // write "read serial number" command
  65.   error |= SHT3X_WriteCommand(CMD_READ_SERIALNBR);
  66.   // if no error, start read access
  67.   if(error == NO_ERROR) error = SHT3X_StartReadAccess();
  68.   // if no error, read first serial number word
  69.   if(error == NO_ERROR) error = SHT3X_Read2BytesAndCrc(&serialNumWords[0], ACK, 100);
  70.   // if no error, read second serial number word
  71.   if(error == NO_ERROR) error = SHT3X_Read2BytesAndCrc(&serialNumWords[1], NACK, 0);

  72.   SHT3X_StopAccess();
  73.   
  74.   // if no error, calc serial number as 32-bit integer
  75.   if(error == NO_ERROR)
  76.   {
  77.     *serialNbr = (serialNumWords[0] << 16) | serialNumWords[1];
  78.   }

  79.   return error;
  80. }

  81. //==============================================================================
  82. etError SHT3X_ReadStatus(u16t *status){
  83. //==============================================================================
  84.   etError error; // error code

  85.   error = SHT3X_StartWriteAccess();

  86.   // if no error, write "read status" command
  87.   if(error == NO_ERROR) error = SHT3X_WriteCommand(CMD_READ_STATUS);
  88.   // if no error, start read access
  89.   if(error == NO_ERROR) error = SHT3X_StartReadAccess();
  90.   // if no error, read status
  91.   if(error == NO_ERROR) error = SHT3X_Read2BytesAndCrc(status, NACK, 0);

  92.   SHT3X_StopAccess();

  93.   return error;
  94. }

  95. //==============================================================================
  96. etError SHT3X_ClearAllAlertFlags(void){
  97. //==============================================================================
  98.   etError error; // error code

  99.   error = SHT3X_StartWriteAccess();

  100.   // if no error, write clear status register command
  101.   if(error == NO_ERROR) error = SHT3X_WriteCommand(CMD_CLEAR_STATUS);

  102.   SHT3X_StopAccess();

  103.   return error;
  104. }

  105. //==============================================================================
  106. etError SHT3X_GetTempAndHumi(ft         *temp,
  107.                              ft         *humi,
  108.                              etRepeatab repeatab,
  109.                              etMode     mode,
  110.                              u8t        timeout){
  111. //==============================================================================
  112.   etError error;
  113.                               
  114.   switch(mode)
  115.   {   
  116.     case MODE_CLKSTRETCH: // get temperature with clock stretching mode
  117.       error = SHT3X_GetTempAndHumiClkStretch(temp, humi, repeatab, timeout); break;
  118.     case MODE_POLLING:    // get temperature with polling mode
  119.       error = SHT3X_GetTempAndHumiPolling(temp, humi, repeatab, timeout); break;
  120.     default:              
  121.       error = PARM_ERROR; break;
  122.   }
  123.   
  124.   return error;
  125. }


  126. //==============================================================================
  127. etError SHT3X_GetTempAndHumiClkStretch(ft         *temp,
  128.                                        ft         *humi,
  129.                                        etRepeatab repeatab,
  130.                                        u8t        timeout){
  131. //==============================================================================
  132.   etError error;        // error code
  133.   u16t    rawValueTemp; // temperature raw value from sensor
  134.   u16t    rawValueHumi; // humidity raw value from sensor

  135.   error = SHT3X_StartWriteAccess();

  136.   // if no error ...
  137.   if(error == NO_ERROR)
  138.   {
  139.     // start measurement in clock stretching mode
  140.     // use depending on the required repeatability, the corresponding command
  141.     switch(repeatab)
  142.     {
  143.       case REPEATAB_LOW:    error = SHT3X_WriteCommand(CMD_MEAS_CLOCKSTR_L); break;
  144.       case REPEATAB_MEDIUM: error = SHT3X_WriteCommand(CMD_MEAS_CLOCKSTR_M); break;
  145.       case REPEATAB_HIGH:   error = SHT3X_WriteCommand(CMD_MEAS_CLOCKSTR_H); break;
  146.       default:              error = PARM_ERROR; break;
  147.     }
  148.   }

  149.   // if no error, start read access
  150.   if(error == NO_ERROR) error = SHT3X_StartReadAccess();
  151.   // if no error, read temperature raw values
  152.   if(error == NO_ERROR) error = SHT3X_Read2BytesAndCrc(&rawValueTemp, ACK, timeout);
  153.   // if no error, read humidity raw values
  154.   if(error == NO_ERROR) error = SHT3X_Read2BytesAndCrc(&rawValueHumi, NACK, 0);

  155.   SHT3X_StopAccess();

  156.   // if no error, calculate temperature in 癈 and humidity in %RH
  157.   if(error == NO_ERROR)
  158.   {
  159.     *temp = SHT3X_CalcTemperature(rawValueTemp);
  160.     *humi = SHT3X_CalcHumidity(rawValueHumi);
  161.   }

  162.   return error;
  163. }

  164. //==============================================================================
  165. etError SHT3X_GetTempAndHumiPolling(ft         *temp,
  166.                                     ft         *humi,
  167.                                     etRepeatab repeatab,
  168.                                     u8t        timeout){
  169. //==============================================================================
  170.   etError error;           // error code
  171.   u16t    rawValueTemp;    // temperature raw value from sensor
  172.   u16t    rawValueHumi;    // humidity raw value from sensor

  173.   error  = SHT3X_StartWriteAccess();

  174.   // if no error ...
  175.   if(error == NO_ERROR)
  176.   {
  177.     // start measurement in polling mode
  178.     // use depending on the required repeatability, the corresponding command
  179.     switch(repeatab)
  180.     {
  181.       case REPEATAB_LOW:    error = SHT3X_WriteCommand(CMD_MEAS_POLLING_L); break;
  182.       case REPEATAB_MEDIUM: error = SHT3X_WriteCommand(CMD_MEAS_POLLING_M); break;
  183.       case REPEATAB_HIGH:                error = SHT3X_WriteCommand(CMD_MEAS_POLLING_H); break;
  184.       default:                                 error = PARM_ERROR; break;
  185.     }
  186.   }

  187.   // if no error, wait until measurement ready
  188.   if(error == NO_ERROR)
  189.   {
  190.     // poll every 1ms for measurement ready until timeout
  191.     while(timeout--)
  192.     {
  193.       // check if the measurement has finished
  194.       error = SHT3X_StartReadAccess();

  195.       // if measurement has finished -> exit loop
  196.       if(error == NO_ERROR) break;

  197.       // delay 1ms
  198.       DelayMicroSeconds(1000);
  199.     }
  200.                
  201.                 // check for timeout error
  202.                 if(timeout == 0) error = TIMEOUT_ERROR;
  203.   }
  204.         
  205.         // if no error, read temperature and humidity raw values
  206.   if(error == NO_ERROR)
  207.   {
  208.     error |= SHT3X_Read2BytesAndCrc(&rawValueTemp, ACK, 0);
  209.     error |= SHT3X_Read2BytesAndCrc(&rawValueHumi, NACK, 0);
  210.   }

  211.   SHT3X_StopAccess();

  212.   // if no error, calculate temperature in 癈 and humidity in %RH
  213.   if(error == NO_ERROR)
  214.   {
  215.     *temp = SHT3X_CalcTemperature(rawValueTemp);
  216.     *humi = SHT3X_CalcHumidity(rawValueHumi);
  217.   }

  218.   return error;
  219. }

  220. //==============================================================================
  221. etError SHT3X_StartPeriodicMeasurment(etRepeatab  repeatab,
  222.                                       etFrequency freq){
  223. //==============================================================================
  224.   etError error;        // error code

  225.   error = SHT3X_StartWriteAccess();

  226.         // if no error, start periodic measurement
  227.         if(error == NO_ERROR)
  228.         {
  229.     // use depending on the required repeatability and frequency,
  230.           // the corresponding command
  231.                 switch(repeatab)
  232.                 {
  233.                         case REPEATAB_LOW: // low repeatability
  234.                                 switch(freq)
  235.                                 {
  236.                                         case FREQUENCY_HZ5:  // low repeatability,  0.5 Hz
  237.                                                 error |= SHT3X_WriteCommand(CMD_MEAS_PERI_05_L); break;                                       
  238.                                         case FREQUENCY_1HZ:  // low repeatability,  1.0 Hz
  239.                                                 error |= SHT3X_WriteCommand(CMD_MEAS_PERI_1_L); break;                                       
  240.                                         case FREQUENCY_2HZ:  // low repeatability,  2.0 Hz
  241.                                                 error |= SHT3X_WriteCommand(CMD_MEAS_PERI_2_L); break;                                       
  242.                                         case FREQUENCY_4HZ:  // low repeatability,  4.0 Hz
  243.                                                 error |= SHT3X_WriteCommand(CMD_MEAS_PERI_4_L); break;                                       
  244.                                         case FREQUENCY_10HZ: // low repeatability, 10.0 Hz
  245.                                                 error |= SHT3X_WriteCommand(CMD_MEAS_PERI_10_L); break;                                       
  246.                                         default:
  247.                                                 error |= PARM_ERROR; break;
  248.                                 }
  249.                           break;
  250.                                 
  251.                         case REPEATAB_MEDIUM: // medium repeatability
  252.                                 switch(freq)
  253.                                 {
  254.                                         case FREQUENCY_HZ5:  // medium repeatability,  0.5 Hz
  255.                                                 error |= SHT3X_WriteCommand(CMD_MEAS_PERI_05_M); break;
  256.                                         case FREQUENCY_1HZ:  // medium repeatability,  1.0 Hz
  257.                                                 error |= SHT3X_WriteCommand(CMD_MEAS_PERI_1_M); break;                                
  258.                                         case FREQUENCY_2HZ:  // medium repeatability,  2.0 Hz
  259.                                                 error |= SHT3X_WriteCommand(CMD_MEAS_PERI_2_M); break;                                
  260.                                         case FREQUENCY_4HZ:  // medium repeatability,  4.0 Hz
  261.                                                 error |= SHT3X_WriteCommand(CMD_MEAS_PERI_4_M); break;                        
  262.                                         case FREQUENCY_10HZ: // medium repeatability, 10.0 Hz
  263.                                                 error |= SHT3X_WriteCommand(CMD_MEAS_PERI_10_M); break;
  264.                                         default:
  265.                                                 error |= PARM_ERROR; break;
  266.                                 }
  267.                           break;
  268.                                 
  269.                         case REPEATAB_HIGH: // high repeatability
  270.                                 switch(freq)
  271.                                 {
  272.                                         case FREQUENCY_HZ5:  // high repeatability,  0.5 Hz
  273.                                                 error |= SHT3X_WriteCommand(CMD_MEAS_PERI_05_H); break;
  274.                                         case FREQUENCY_1HZ:  // high repeatability,  1.0 Hz
  275.                                                 error |= SHT3X_WriteCommand(CMD_MEAS_PERI_1_H); break;
  276.                                         case FREQUENCY_2HZ:  // high repeatability,  2.0 Hz
  277.                                                 error |= SHT3X_WriteCommand(CMD_MEAS_PERI_2_H); break;
  278.                                         case FREQUENCY_4HZ:  // high repeatability,  4.0 Hz
  279.                                                 error |= SHT3X_WriteCommand(CMD_MEAS_PERI_4_H); break;
  280.                                         case FREQUENCY_10HZ: // high repeatability, 10.0 Hz
  281.                                                 error |= SHT3X_WriteCommand(CMD_MEAS_PERI_10_H); break;
  282.                                         default:
  283.                                                 error |= PARM_ERROR; break;
  284.                                 }
  285.                           break;
  286.                         default:
  287.                                 error |= PARM_ERROR; break;
  288.                 }
  289.         }

  290.   SHT3X_StopAccess();

  291.   return error;
  292. }

  293. //==============================================================================
  294. etError SHT3X_ReadMeasurementBuffer(ft *temp, ft *humi){
  295. //==============================================================================
  296.   etError  error;        // error code
  297.         u16t     rawValueTemp; // temperature raw value from sensor
  298.   u16t     rawValueHumi; // humidity raw value from sensor

  299.         error = SHT3X_StartWriteAccess();

  300.         // if no error, read measurements
  301.         if(error == NO_ERROR)        error = SHT3X_WriteCommand(CMD_FETCH_DATA);
  302.         if(error == NO_ERROR)        error = SHT3X_StartReadAccess();        
  303.         if(error == NO_ERROR)        error = SHT3X_Read2BytesAndCrc(&rawValueTemp, ACK, 0);
  304.         if(error == NO_ERROR) error = SHT3X_Read2BytesAndCrc(&rawValueHumi, NACK, 0);
  305.         
  306.         // if no error, calculate temperature in 癈 and humidity in %RH
  307.         if(error == NO_ERROR)
  308.         {
  309.                 *temp = SHT3X_CalcTemperature(rawValueTemp);
  310.                 *humi = SHT3X_CalcHumidity(rawValueHumi);
  311.         }
  312.         
  313.         SHT3X_StopAccess();
  314.         
  315.         return error;
  316. }

  317. //==============================================================================
  318. etError SHT3X_EnableHeater(void){
  319. //==============================================================================
  320.   etError error; // error code

  321.   error = SHT3X_StartWriteAccess();

  322.   // if no error, write heater enable command
  323.   if(error == NO_ERROR) error = SHT3X_WriteCommand(CMD_HEATER_ENABLE);

  324.   SHT3X_StopAccess();

  325.   return error;
  326. }

  327. //==============================================================================
  328. etError SHT3X_DisbaleHeater(void){
  329. //==============================================================================
  330.   etError error; // error code

  331.   error = SHT3X_StartWriteAccess();

  332.   // if no error, write heater disable command
  333.   if(error == NO_ERROR) error = SHT3X_WriteCommand(CMD_HEATER_DISABLE);

  334.   SHT3X_StopAccess();

  335.   return error;
  336. }

  337. //==============================================================================
  338. etError SHT3X_SoftReset(void){
  339. //==============================================================================
  340.   etError error; // error code

  341.   error = SHT3X_StartWriteAccess();

  342.   // write reset command
  343.   error |= SHT3X_WriteCommand(CMD_SOFT_RESET);

  344.   SHT3X_StopAccess();
  345.         
  346.         // if no error, wait 50 ms after reset
  347.         if(error == NO_ERROR) DelayMicroSeconds(50000);

  348.   return error;
  349. }

  350. //==============================================================================
  351. void SHT3X_HardReset(void){
  352. //==============================================================================
  353.         // set reset low
  354.         RESET_LOW();


  355. ……………………

  356. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
SHT30评估板模块_PDF_C85041_.7z (1.97 MB, 下载次数: 131)
回复

使用道具 举报

ID:601925 发表于 2019-8-20 12:32 | 显示全部楼层
看起来不错
回复

使用道具 举报

ID:337808 发表于 2019-12-27 22:56 | 显示全部楼层
谢谢楼主分享,受用非浅。
回复

使用道具 举报

ID:702004 发表于 2020-6-30 02:03 | 显示全部楼层
压缩包里有原理图吗
回复

使用道具 举报

ID:845778 发表于 2021-9-9 11:50 | 显示全部楼层
请问这个开发软件是哪个,是keil5吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表