找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 20501|回复: 30
收起左侧

STM8 SHT30库函数(温湿度传感器)

  [复制链接]
ID:212884 发表于 2017-6-20 11:05 | 显示全部楼层 |阅读模式
SHT30是盛世瑞最新出品的低端低价温湿度传感器,在精度和尺寸上都优于SHT20.
附件是SHT30的STM8驱动,用的是库函数,自己写的,可行。
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 "iic.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=0x88;
  30. u8t _i2cReadHeader=0x89;

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

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

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

  64.   error = SHT3X_StartWriteAccess();

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

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

  80.   return error;
  81. }

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

  86.   error = SHT3X_StartWriteAccess();

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

  93.   SHT3X_StopAccess();

  94.   return error;
  95. }

  96. //==============================================================================
  97. u8t SHT3X_ClearAllAlertFlags(void){
  98. //==============================================================================
  99.   u8t error; // error code

  100.   error = SHT3X_StartWriteAccess();

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

  103.   SHT3X_StopAccess();

  104.   return error;
  105. }

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


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

  136.   error = SHT3X_StartWriteAccess();

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

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

  156.   SHT3X_StopAccess();

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

  163.   return error;
  164. }

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

  174.   error  = SHT3X_StartWriteAccess();

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

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

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

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

  212.   SHT3X_StopAccess();

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

  219.   return error;
  220. }

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

  226.   error = SHT3X_StartWriteAccess();

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

  291.   SHT3X_StopAccess();

  292.   return error;
  293. }

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

  300.         error = SHT3X_StartWriteAccess();

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

  318. //==============================================================================
  319. u8t SHT3X_EnableHeater(void){
  320. //==============================================================================
  321.   u8t error; // error code

  322.   error = SHT3X_StartWriteAccess();

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

  325.   SHT3X_StopAccess();

  326.   return error;
  327. }

  328. //==============================================================================
  329. u8t SHT3X_DisbaleHeater(void){
  330. //==============================================================================
  331.   u8t error; // error code

  332.   error = SHT3X_StartWriteAccess();

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

  335.   SHT3X_StopAccess();

  336.   return error;
  337. }

  338. //==============================================================================
  339. u8t SHT3X_SoftReset(void){
  340. //==============================================================================
  341.   u8t error; // error code

  342.   error = SHT3X_StartWriteAccess();

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

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

  349.   return error;
  350. }

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

  356.         // wait 100 ms
  357.         DelayMicroSeconds(100000);
  358.        
  359.         // release reset
  360.         //RESET_HIGH();
  361.        
  362.         // wait 50 ms after reset
  363.         DelayMicroSeconds(50000);
  364. }

  365. //==============================================================================
  366. u8t SHT3X_StartWriteAccess(void){
  367. //==============================================================================
  368.   u8t error; // error code

  369.   // write a start condition
  370.   I2C_START();

  371.   // write the sensor I2C address with the write flag
  372.   error = I2C_TX(_i2cWriteHeader);

  373.   return error;
  374. }

  375. //==============================================================================
  376. u8t SHT3X_StartReadAccess(void){
  377. //==============================================================================
  378.   u8t error; // error code

  379.   // write a start condition
  380.   I2C_START();

  381.   // write the sensor I2C address with the read flag
  382.   error = I2C_TX(_i2cReadHeader);

  383.   return error;
  384. }

  385. //==============================================================================
  386. void SHT3X_StopAccess(void){
  387. //==============================================================================
  388.   // write a stop condition
  389.   I2C2_Stop();
  390. }

  391. //==============================================================================
  392. u8t SHT3X_WriteCommand(etCommands cmd){
  393. //==============================================================================
  394.   u8t error; // error code

  395.   // write the upper 8 bits of the command to the sensor
  396.   error  = I2C_TX(cmd >> 8);

  397.   // write the lower 8 bits of the command to the sensor
  398.   error |= I2C_TX(cmd & 0xFF);

  399.   return error;
  400. }

  401. //==============================================================================
  402. u8t SHT3X_Read2BytesAndCrc(u16t *data, etI2cAck finaleAckNack, u8t timeout){
  403. //==============================================================================
  404.   u8t error;    // error code
  405.   u8t     bytes[2]; // read data array
  406.   u8t     checksum; // checksum byte

  407.   // read two data bytes and one checksum byte
  408.   /*
  409.                               error = I2c_ReadByte(&bytes[0], ACK, timeout);
  410.         if(error == NO_ERROR) error = I2c_ReadByte(&bytes[1], ACK, 0);
  411.         
  412.         
  413.   if(error == NO_ERROR) error = I2c_ReadByte(&checksum, finaleAckNack, 0);
  414.   */
  415.   
  416.   bytes[0]=I2C_RX(ACK);
  417.   bytes[1]=I2C_RX(ACK);
  418.   checksum=I2C_RX(finaleAckNack);
  419.   // verify checksum
  420.   if(error == NO_ERROR) error = SHT3X_CheckCrc(bytes, 2, checksum);
  421.   
  422.   // combine the two bytes to a 16-bit value
  423.   *data = (bytes[0] << 8) | bytes[1];
  424.   
  425.   return error;
  426. }

  427. //==============================================================================
  428. u8t SHT3X_Write2BytesAndCrc(u16t data){
  429. //==============================================================================
  430.   u8t error;    // error code
  431.   u8t     bytes[2]; // read data array
  432.   u8t     checksum; // checksum byte
  433.        
  434.         bytes[0] = data >> 8;
  435.         bytes[1] = data & 0xFF;
  436.         checksum = SHT3X_CalcCrc(bytes, 2);

  437.         // write two data bytes and one checksum byte
  438.                               error = I2C_TX(bytes[0]); // write data MSB
  439.         if(error == NO_ERROR) error = I2C_TX(bytes[1]); // write data LSB
  440.         if(error == NO_ERROR) error = I2C_TX(checksum); // write checksum
  441.   
  442.   return error;
  443. }

  444. //==============================================================================
  445. u8t SHT3X_CalcCrc(u8t data[], u8t nbrOfBytes){
  446. //==============================================================================
  447.         u8t bit;        // bit mask
  448.   u8t crc = 0xFF; // calculated checksum
  449.   u8t byteCtr;    // byte counter
  450.   
  451.   // calculates 8-Bit checksum with given polynomial
  452.   for(byteCtr = 0; byteCtr < nbrOfBytes; byteCtr++)
  453.   {
  454.     crc ^= (data[byteCtr]);
  455.     for(bit = 8; bit > 0; --bit)
  456. ……………………

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

所有资料51hei提供下载:
SHT3X.zip (6.78 KB, 下载次数: 338)

评分

参与人数 3黑币 +60 收起 理由
jipinxlm + 5 共享资料的黑币奖励!
liuxin549521 + 5 很给力!
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:242049 发表于 2017-10-23 11:49 | 显示全部楼层
感谢分享,就是黑币不够 下载不了
回复

使用道具 举报

ID:239391 发表于 2017-10-31 14:07 | 显示全部楼层
扣除了我5个 然后服务器内部错误 再下载就没币了!

评分

参与人数 1黑币 +30 收起 理由
admin + 30 补偿,应该是服务器忙 稍后就可以了

查看全部评分

回复

使用道具 举报

ID:239391 发表于 2017-10-31 14:08 | 显示全部楼层
啥情况 没回复上!!!
回复

使用道具 举报

ID:252291 发表于 2017-11-22 15:32 | 显示全部楼层
感谢分享,然而没有黑币下不了
回复

使用道具 举报

ID:252569 发表于 2017-11-23 10:12 | 显示全部楼层
感谢分享,就是黑币不够 下载不了
回复

使用道具 举报

ID:266522 发表于 2017-12-25 14:50 | 显示全部楼层
同样的,没有黑币下载不了。
回复

使用道具 举报

ID:271543 发表于 2018-1-4 19:26 | 显示全部楼层
感谢分享
回复

使用道具 举报

ID:276487 发表于 2018-1-16 10:48 | 显示全部楼层

感谢分享,可惜黑币不够 下载不了
回复

使用道具 举报

ID:282582 发表于 2018-2-6 13:14 | 显示全部楼层
感谢分享
回复

使用道具 举报

ID:282582 发表于 2018-2-6 13:14 | 显示全部楼层
感谢分享可惜没法下载
回复

使用道具 举报

ID:282582 发表于 2018-2-8 17:01 | 显示全部楼层
感谢分享可惜没法下载
回复

使用道具 举报

ID:281021 发表于 2018-2-28 14:26 | 显示全部楼层
正在找,感谢分享
回复

使用道具 举报

ID:291387 发表于 2018-3-14 14:05 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:158812 发表于 2018-4-25 18:11 | 显示全部楼层
谢谢分享,谢谢
回复

使用道具 举报

ID:68832 发表于 2018-5-7 10:41 | 显示全部楼层
谢谢分享,谢谢
回复

使用道具 举报

ID:328593 发表于 2018-5-13 00:24 | 显示全部楼层

谢谢分享,谢谢
回复

使用道具 举报

ID:371955 发表于 2018-7-15 14:33 | 显示全部楼层
十分感谢分享。
回复

使用道具 举报

ID:227986 发表于 2018-8-28 11:23 | 显示全部楼层
谢谢分享,谢谢
回复

使用道具 举报

ID:328148 发表于 2018-10-8 18:31 | 显示全部楼层
感谢分享科学没有黑币下载
回复

使用道具 举报

ID:406578 发表于 2018-11-1 16:33 | 显示全部楼层
为啥只扣分,下载不了呀?都扣了2次了,就是显示下载人数太多,要等待2分钟才能下载?
回复

使用道具 举报

ID:406578 发表于 2018-11-1 16:43 | 显示全部楼层
这程序代码就是官网发的。如果用在stm32L151低功耗系列上是没办法用的。
回复

使用道具 举报

ID:171207 发表于 2018-11-29 13:07 | 显示全部楼层

好东西要学习
回复

使用道具 举报

ID:443786 发表于 2018-12-11 08:37 | 显示全部楼层
好东西,值得分享,谢谢啦
回复

使用道具 举报

ID:378250 发表于 2019-1-4 18:19 | 显示全部楼层
刚好用到 拿来参考 感谢!!!
回复

使用道具 举报

ID:409991 发表于 2019-2-25 16:53 | 显示全部楼层
多谢,给力,不错
回复

使用道具 举报

ID:453848 发表于 2019-12-29 16:18 | 显示全部楼层
不错,谢谢!!!!!!!!
回复

使用道具 举报

ID:334781 发表于 2020-3-2 16:05 | 显示全部楼层
看了一下,感觉好复杂呢,有点蒙了。
回复

使用道具 举报

ID:492050 发表于 2020-3-15 22:16 | 显示全部楼层
这个资料很好    谢谢楼主分享
回复

使用道具 举报

ID:293590 发表于 2021-4-19 10:15 | 显示全部楼层
我也一样,扣除了5个币,就没有然后了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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