找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2029|回复: 3
打印 上一主题 下一主题
收起左侧

STM8L单片机SI4463无线芯片IAR例程 厂家资料 好移植

[复制链接]
跳转到指定楼层
楼主
ID:316232 发表于 2019-2-15 14:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM8L-SI4463 IAR例程 厂家资料 好移植

单片机源程序如下:
  1. #include <stdio.h>
  2. #include <stdarg.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include "gpio.h"
  6. #include "uart.h"
  7. #include "oled.h"
  8. #include "function.h"
  9. #include "sensor.h"
  10. #include "rf.h"

  11. //SI4463 RF @STM8L151
  12. void frameProcess( u8 *buf, u8 size )
  13. {
  14.   u8 cmd = buf[0];
  15.   u8 len = buf[1];
  16.   
  17.   LED_RX=1;
  18.   
  19.   switch ( cmd )
  20.   {
  21.   case CMD_TEMP_HUM:
  22.    
  23.     if ( rfAck )
  24.     { //收到协议数据,立即发送应答
  25.       sendBuf[0]        = CMD_ACK;
  26.       sendBuf[1]        = 0;
  27.       RFSendData( sendBuf, 2 );
  28.       msg( "send reply..." );
  29.     }

  30.     if ( len == sizeof(float) )
  31.     { //拿到温湿度数据,更新显示
  32.       memcpy( &temperature, buf + 2, 2 );
  33.       memcpy( &humidity, buf + 4, 2 );
  34.       //发送串口显示
  35.       rf2uart( temperature, humidity);
  36.       msg( "get sensor dat" );
  37.     }
  38.     break;
  39.    
  40.   case CMD_ACK:
  41.     //发送后收到应答
  42.     msg( "get reply" );
  43.     break;
  44.    
  45.   default:
  46.     //无线接收转串口透传
  47.     UartSend( buf, size);
  48.     msg( "get rf data" );
  49.     break;
  50.   }
  51.   
  52.   LED_RX=0;
  53. }

  54. int main( void )
  55. { int len;
  56.   
  57.     asm("sim");   //全局中断关闭
  58.    
  59.     GPIOInit();   //IO初始化
  60.     Soft_I2C_Int();
  61.     GpioFicker(); //上电两灯闪
  62.    
  63.     UartInit();   //UART初始化
  64.    
  65.     LED_Init();   //OLED屏初始化
  66.    
  67.     getSensor();  //获取初始温湿度值
  68.    
  69.     RFInit();     //射频模块初始化
  70.    
  71.     RFRxMode();   //设置RF接收模式
  72.    
  73.     asm("rim");   //全局中断开启
  74.   
  75.     msg( "system start" );//显示开机信息

  76.     /*infinite loop begin*/
  77.     while(1)
  78.     {
  79.         OledDisplay();      //OLED屏幕刷新显示
  80.    
  81.         keyProcess();       //按键监测处理
  82.    
  83.         timerTask();        //定期更新传感器读数
  84.    
  85.         uart2rf();          //串口转无线透传
  86.    
  87.         len = RFRevData( revBuf );  //接收无线数据
  88.         if ( len > 0 )
  89.         {
  90.             frameProcess( revBuf, len );//对收到的数据进行处理
  91.         }
  92.    
  93.         if ( rfContinueSend() )     //连续发送处理
  94.         {
  95.             delay_ms( 500 );
  96.         }
  97.     }/*infinite loop end*/
  98. }
复制代码

  1. #include <stdio.h>
  2. #include <stdarg.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include "function.h"
  6. #include "oled.h"
  7. #include "uart.h"
  8. #include "gpio.h"


  9. #include "rf.h"
  10. #include "sensor.h"


  11. unsigned short continueSendCnt=0; //连续发包数
  12. unsigned short continueSendIndex=0;

  13. void delay_us(u16 t)
  14. {
  15.   u16 i;
  16.   for(i=0;i<t;i++)
  17.   {
  18.    
  19.     asm("NOP");
  20.    
  21.   }
  22. }

  23. void delay_ms(u16 t)
  24. {
  25.   u16 i;
  26.   u16 j;
  27.   for(i=0;i<t;i++)
  28.     for(j=0;j<400;j++);
  29. }
  30. /* ------------------------------------------------------------------------ */
  31. void GpioFicker( void )
  32. {
  33. //上电两灯闪
  34.        LED_TX=1; //两灯亮
  35.        LED_RX=1;
  36.        delay_ms(500);
  37.        LED_TX=0;
  38.        LED_RX=0;
  39.        delay_ms(500);
  40.        LED_TX=1; //两灯亮
  41.        LED_RX=1;
  42.        delay_ms(500);
  43.        LED_TX=0;
  44.        LED_RX=0;
  45. }

  46. void keyProcess( void )
  47. {
  48.   if ( GPIO_ReadInputDataBit( GPIOA, GPIO_Pin_4 ) == 0x00 ) /* S1 C13 */
  49.   {
  50.     delay_ms( 20 );
  51.     if ( GPIO_ReadInputDataBit( GPIOA, GPIO_Pin_4 ) == 0x00 )
  52.     {

  53.       
  54.         msg( "clear ...." );
  55.         iSend        = 0;
  56.         iRev        = 0;
  57.         while ( GPIO_ReadInputDataBit( GPIOA, GPIO_Pin_4 ) == 0x00 )
  58.           ;                                                       /* 等待按键释放 */
  59.         
  60.     }
  61.   }
  62.   
  63.   if ( GPIO_ReadInputDataBit( GPIOA, GPIO_Pin_6 ) == 0x00 )                               /* S2 A0 */
  64.   {
  65.     delay_ms( 10 );
  66.    
  67.     if ( GPIO_ReadInputDataBit( GPIOA, GPIO_Pin_6 ) == 0x00 )
  68.     {
  69.       u8 len = 0;
  70.       while ( GPIO_ReadInputDataBit( GPIOA, GPIO_Pin_6 ) == 0x00 )
  71.         ;                                                               /* 等待按键释放 */
  72.       sendBuf[0]        = CMD_TEMP_HUM;                                 /* cmd: 1发送传感器数据  2应答成功 */
  73.       sendBuf[1]        = 4;
  74.       getSensor();
  75.       /* 数据长度 */
  76.       memcpy( &sendBuf[2], &temperature, 2 );
  77.       memcpy( &sendBuf[4], &humidity, 2 );
  78.       
  79.       
  80.       LedRed( On );
  81.       len = RFSendData( sendBuf, 6 );
  82.       if ( len > 0 )
  83.         msg( "send ok" );
  84.       else
  85.         msg( "send fail" );
  86.       
  87.       LedRed( Off );
  88.     }
  89.   }
  90.   
  91.   
  92.   if ( GPIO_ReadInputDataBit( GPIOA, GPIO_Pin_5 ) == 0x00 )
  93.   {
  94.     delay_ms( 10 );
  95.     if ( GPIO_ReadInputDataBit( GPIOA, GPIO_Pin_5 ) == 0x00 )
  96.     {
  97.       
  98.       while ( GPIO_ReadInputDataBit( GPIOA, GPIO_Pin_5 ) == 0x00 )
  99.         ;               /* 等待按键释放 */
  100.       
  101.       continueSendCnt+=50;
  102.       
  103.       
  104.     }
  105.   }
  106. }

  107. char rfContinueSend(void)
  108. {
  109.   if(continueSendIndex>=continueSendCnt)return 0;
  110.   continueSendIndex++;
  111.   LedRed( On );
  112.   getSensor();
  113.   sendBuf[0]        = CMD_TEMP_HUM;    /* cmd: 1发送传感器数据  2应答成功 */
  114.   sendBuf[1]        = 4;    /* 数据长度 */
  115.   memcpy( &sendBuf[2], &temperature, 2 );
  116.   memcpy( &sendBuf[4], &humidity, 2 );
  117.   
  118.   
  119.   RFSendData( sendBuf, 6 );
  120.   sprintf( (char *) sendBuf, "AutoSend:%d/%d", continueSendIndex,continueSendCnt );
  121.   msg( (char *) sendBuf );
  122.   
  123.   LedRed( Off );
  124.   OledDisplay();
  125.   return 1;
  126.   
  127.   
  128. }
  129. /* ------------------------------------------------------------------------ */

  130. void uart2rf(void)
  131. {
  132.   static u8 uart_rx_len_last=0;
  133.   u8 i,tmp=0;
  134.   if(uart_rx_len_last>0)
  135.   {
  136.       LED_TX=1;
  137.       if(uart_rx_len_last==uart_rx_len)
  138.       {
  139.          while(uart_rx_len)
  140.          {
  141.             u8 len=uart_rx_len>32?32:uart_rx_len;
  142.             RFSendData(uart_rx_buf+tmp,len);
  143.             uart_rx_len-=len;
  144.             tmp+=len;
  145.             delay_ms( 10 );
  146.          }
  147.          LED_TX=0;
  148.       }
  149.   }
  150.   
  151.   uart_rx_len_last=uart_rx_len;
  152. }

  153. void rf2uart(s16 tem,s16 hum)
  154. {
  155.    u8 sbuf[64];
  156.    sprintf( sbuf, "Tem%.1f Hum%.1f%%\n", tem / 10.0, hum / 10.0 );
  157.    UartSend( sbuf, 18);
  158. }

  159. void timerTask(void)
  160. {
  161.   static u32        count;
  162.   //static u8        flag = 0;
  163.   static int lastRevByte=-1;
  164.   
  165.   static u8 delay=1;
  166.   
  167.   if ( ++count > 2 )
  168.   {
  169.     count        = 0;
  170.    
  171.    
  172.     //收到数据5秒内显示收到的数据而不是显示采集到的本地数据
  173.     if(lastRevByte!=iRev)
  174.     {
  175.       lastRevByte=iRev;
  176.       delay=10;
  177.     }else{
  178.       if(--delay==0)
  179.       {
  180.         if(delay==0)delay=5;
  181.         getSensor();
  182.       }
  183.     }
  184.   }
  185. }

  186. void debug( const char* fmt, ... )
  187. {
  188.   va_list args;
  189.   va_start( args, fmt );
  190.   vprintf( fmt, args );
  191.   va_end( args );
  192. }

  193. /*
  194. * ------------------------------------------------------------------------
  195. * ------------------------------------------------------------------------
  196. * --------------------     私有函数定义            ------------------------------
  197. */
  198. void msg( char *msg )                                   /* 如果要显示中文,OLED点阵字库必须有相应数据,英文则不需要 */
  199. {
  200.   static u8 count=0;
  201.   char buf[8];
  202.   LED_PXx16MixStr( 0, 3, "                " );   /* 16个字母 */
  203.   sprintf(buf,"%d:",++count%10);
  204.   LED_PXx16MixStr(0,3,buf);
  205.   LED_PXx16MixStr( 14, 3, msg );
  206.   //debug( msg );
  207.   
  208. }                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            


  209. void OledDisplay( void )
  210. {
  211.   char buf[64] = "";
  212.   static char flag=0;
  213.   
  214.   if(!flag)
  215.   {
  216.     sprintf( buf, "%s + SI7021", rfName );
  217.    
  218.     LED_PXx16MixStr( 0, 0, buf );
  219.    
  220.     flag=1;
  221.   }
  222.   
  223.   sprintf( buf, "Tem%.1f Hum%.1f%%", temperature / 10.0, humidity / 10.0 );
  224.   
  225.   
  226.   LED_PXx16MixStr( 0, 1, buf );
  227.   
  228.   sprintf( buf, "Snd:%d Rev:%d", iSend, iRev );
  229.   
  230.   LED_PXx16MixStr( 0, 2, buf );
  231. }
复制代码


所有资料51hei提供下载:
STM8L_4463.7z (892.6 KB, 下载次数: 40)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:18591 发表于 2019-2-17 12:31 | 只看该作者
感謝~~~~~~~~~~~~
回复

使用道具 举报

板凳
ID:268693 发表于 2019-3-16 11:39 | 只看该作者
感谢喔!
回复

使用道具 举报

地板
ID:116773 发表于 2019-3-16 18:51 | 只看该作者
以前用51开发时买过这种模块,但一直没有用起来,这个资料很好,可以参考,谢谢楼主!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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