打印
[应用相关]

stm32 +lora 测试

[复制链接]
楼主: hanzhen654
手机看帖
扫描二维码
随时随地手机跟帖
21
hanzhen654|  楼主 | 2019-8-25 17:35 | 只看该作者 回帖奖励 |倒序浏览
I2C 写一个字节数据
void I2C_WriteByte(uint8_t addr,uint8_t data)
{
  while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));
       
        I2C_GenerateSTART(I2C1, ENABLE);//开启I2C1
        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));/*EV5,主模式*/

        I2C_Send7bitAddress(I2C1, OLED_ADDRESS, I2C_Direction_Transmitter);//器件地址 -- 默认0x78
        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

        I2C_SendData(I2C1, addr);//寄存器地址
        while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));

        I2C_SendData(I2C1, data);//发送数据
        while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
       
        I2C_GenerateSTOP(I2C1, ENABLE);//关闭I2C1总线
}

使用特权

评论回复
22
hanzhen654|  楼主 | 2019-8-25 17:37 | 只看该作者
写命令
void WriteCmd(unsigned char I2C_Command)//写命令
{
        I2C_WriteByte(0x00, I2C_Command);
}

使用特权

评论回复
23
hanzhen654|  楼主 | 2019-8-25 17:38 | 只看该作者
写数据
void WriteDat(unsigned char I2C_Data)//写数据
{
        I2C_WriteByte(0x40, I2C_Data);
}

使用特权

评论回复
24
hanzhen654|  楼主 | 2019-8-25 17:38 | 只看该作者
OLED初始化
void OLED_Init(void)
{
        SysTick_delay_ms(100); //这里的延时很重要
       
        WriteCmd(0xAE); //display off
        WriteCmd(0x20);        //Set Memory Addressing Mode       
        WriteCmd(0x10);        //00,Horizontal Addressing Mode;01,Vertical Addressing Mode;10,Page Addressing Mode (RESET);11,Invalid
        WriteCmd(0xb0);        //Set Page Start Address for Page Addressing Mode,0-7
        WriteCmd(0xc8);        //Set COM Output Scan Direction
        WriteCmd(0x00); //---set low column address
        WriteCmd(0x10); //---set high column address
        WriteCmd(0x40); //--set start line address
        WriteCmd(0x81); //--set contrast control register
        WriteCmd(0xff); //亮度调节 0x00~0xff
        WriteCmd(0xa1); //--set segment re-map 0 to 127
        WriteCmd(0xa6); //--set normal display
        WriteCmd(0xa8); //--set multiplex ratio(1 to 64)
        WriteCmd(0x3F); //
        WriteCmd(0xa4); //0xa4,Output follows RAM content;0xa5,Output ignores RAM content
        WriteCmd(0xd3); //-set display offset
        WriteCmd(0x00); //-not offset
        WriteCmd(0xd5); //--set display clock divide ratio/oscillator frequency
        WriteCmd(0xf0); //--set divide ratio
        WriteCmd(0xd9); //--set pre-charge period
        WriteCmd(0x22); //
        WriteCmd(0xda); //--set com pins hardware configuration
        WriteCmd(0x12);
        WriteCmd(0xdb); //--set vcomh
        WriteCmd(0x20); //0x20,0.77xVcc
        WriteCmd(0x8d); //--set DC-DC enable
        WriteCmd(0x14); //
        WriteCmd(0xaf); //--turn on oled panel
}

使用特权

评论回复
25
hanzhen654|  楼主 | 2019-8-25 17:40 | 只看该作者
设置起始点坐标
void OLED_SetPos(unsigned char x, unsigned char y) //设置起始点坐标
{
        WriteCmd(0xb0+y);
        WriteCmd(((x&0xf0)>>4)|0x10);
        WriteCmd((x&0x0f)|0x01);
}

使用特权

评论回复
26
hanzhen654|  楼主 | 2019-8-25 17:47 | 只看该作者
全屏填充
void OLED_Fill(unsigned char fill_Data)//全屏填充
{
        unsigned char m,n;
        for(m=0;m<8;m++)
        {
                WriteCmd(0xb0+m);                //page0-page1
                WriteCmd(0x00);                //low column start address
                WriteCmd(0x10);                //high column start address
                for(n=0;n<128;n++)
                        {
                                WriteDat(fill_Data);
                        }
        }
}

使用特权

评论回复
27
hanzhen654|  楼主 | 2019-8-25 17:47 | 只看该作者
清屏
void OLED_CLS(void)//清屏
{
        OLED_Fill(0x00);
}

使用特权

评论回复
28
hanzhen654|  楼主 | 2019-8-25 17:48 | 只看该作者
将OLED从休眠中唤醒
void OLED_ON(void)
{
        WriteCmd(0X8D);  //设置电荷泵
        WriteCmd(0X14);  //开启电荷泵
        WriteCmd(0XAF);  //OLED唤醒
}

使用特权

评论回复
29
hanzhen654|  楼主 | 2019-8-25 17:49 | 只看该作者
让OLED休眠 -- 休眠模式下,OLED功耗不到10uA
void OLED_OFF(void)
{
        WriteCmd(0X8D);  //设置电荷泵
        WriteCmd(0X10);  //关闭电荷泵
        WriteCmd(0XAE);  //OLED休眠
}

使用特权

评论回复
30
hanzhen654|  楼主 | 2019-8-25 17:49 | 只看该作者
OLED在指定位置显示一个字符
void OLED_ShowChar(unsigned char x,unsigned char y,unsigned char ch,unsigned char TextSize)
{
        unsigned c=0,i;
         c = ch - 32;
   switch(TextSize)
        {
                case 1:
                            OLED_SetPos(x,y);
                             for(i=0;i<6;i++)
                                        WriteDat(F6x8[c][i]);
                break;
                case 2:
                           OLED_SetPos(x,y);
                                for(i=0;i<8;i++)
                                        WriteDat(F8X16[c*16+i]);
                                OLED_SetPos(x,y+1);
                                for(i=0;i<8;i++)
                                        WriteDat(F8X16[c*16+i+8]);
                break;
        }
}

使用特权

评论回复
31
hanzhen654|  楼主 | 2019-8-25 17:50 | 只看该作者
OLED在指定位置显示字符串
void OLED_ShowStr(unsigned char x, unsigned char y, unsigned char ch[], unsigned char TextSize)
{
        unsigned char c = 0,i = 0,j = 0;
        switch(TextSize)
        {
                case 1:
                {
                        while(ch[j] != '\0')
                        {
                                c = ch[j] - 32;
                                if(x > 126)
                                {
                                        x = 0;
                                        y++;
                                }
                                OLED_SetPos(x,y);
                                for(i=0;i<6;i++)
                                        WriteDat(F6x8[c][i]);
                                x += 6;
                                j++;
                        }
                }break;
                case 2:
                {
                        while(ch[j] != '\0')
                        {
                                c = ch[j] - 32;
                                if(x > 120)
                                {
                                        x = 0;
                                        y++;
                                }
                                OLED_SetPos(x,y);
                                for(i=0;i<8;i++)
                                        WriteDat(F8X16[c*16+i]);
                                OLED_SetPos(x,y+1);
                                for(i=0;i<8;i++)
                                        WriteDat(F8X16[c*16+i+8]);
                                x += 8;
                                j++;
                        }
                }break;
        }
}

使用特权

评论回复
32
hanzhen654|  楼主 | 2019-8-25 17:51 | 只看该作者
OLED在指定位置显示汉子
void OLED_ShowCN(unsigned char x, unsigned char y, unsigned char N)
{
        unsigned char wm=0;
        unsigned int  adder=32*N;
        OLED_SetPos(x , y);
        for(wm = 0;wm < 16;wm++)
        {
                WriteDat(F16x16[adder]);
                adder += 1;
        }
        OLED_SetPos(x,y + 1);
        for(wm = 0;wm < 16;wm++)
        {
                WriteDat(F16x16[adder]);
                adder += 1;
        }
}

使用特权

评论回复
33
hanzhen654|  楼主 | 2019-8-25 18:02 | 只看该作者
OLED显示BMP图

void OLED_DrawBMP(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,unsigned char BMP[])
{
        unsigned int j=0;
        unsigned char x,y;

  if(y1%8==0)
                y = y1/8;
  else
                y = y1/8 + 1;
        for(y=y0;y<y1;y++)
        {
                OLED_SetPos(x0,y);
    for(x=x0;x<x1;x++)
                {
                        WriteDat(BMP[j++]);
                }
        }
}

使用特权

评论回复
34
hanzhen654|  楼主 | 2019-8-25 18:05 | 只看该作者
2.        LORA串口部分:
Lora串口2初始化
/****Lora串口2初始化*****/
/*******TXD PA2**********/
/*******RXD PA3**********/
void Lora_USART_Config()
{
  GPIO_InitTypeDef   GPIO_InitStructure;
        USART_InitTypeDef  USART_InitStucture;
        NVIC_InitTypeDef   NVIC_InitStructure;
        //打开GPIOA时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  //打开串口2外设时钟       
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
       
        //将USART_TX GPIO配置为推挽输出
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;                                 
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;               
  GPIO_Init(GPIOA, &GPIO_InitStructure);       
        //将USART_RX GPIO配置为浮空输入模式
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;                                 
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;                        
  GPIO_Init(GPIOA, &GPIO_InitStructure);
       
        USART_InitStucture.USART_BaudRate = 9600; //波特率
        USART_InitStucture.USART_WordLength = USART_WordLength_8b;//数据位
        USART_InitStucture.USART_StopBits = USART_StopBits_1;//停止位
        USART_InitStucture.USART_Parity = USART_Parity_No;//校验位
        USART_InitStucture.USART_HardwareFlowControl =
        USART_HardwareFlowControl_None;  //配置硬件流
        USART_InitStucture.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
        USART_Init(USART2,&USART_InitStucture);
        USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);//是能串口接收中断
        USART_Cmd(USART2,ENABLE); //是能串口
       
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
        NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; //配置串口的中断源
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //抢占优先级
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //子优先级
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  //是能中断
        NVIC_Init(&NVIC_InitStructure);
}

使用特权

评论回复
35
hanzhen654|  楼主 | 2019-8-25 18:05 | 只看该作者
LoRa串口接收中断函数
/****LoRa串口接收中断函数****/
void USART2_IRQHandler(void)
{
  uint8_t Res;
        if(USART_GetFlagStatus(USART2,USART_IT_RXNE) != RESET)   //接收中断
        {
                 USART_ClearFlag(USART2, USART_FLAG_RXNE);
           Res = USART_ReceiveData(USART2);  //读取接收的数据
                 if(!(LoraUartRxSta&0x8000))       //未接收完成
                 {
                    if(LoraUartRxSta&0x4000)       //已经接收到0x0d  "\r"
                                {
                                   if(Res != 0x0a)
                                         {
                                           LoraUartRxSta = 0;        //接收错误
                                         }
                                         else                        //接收完成
                                         {
                                           LoraUartRxSta |= 0x8000;
                                         }
                                }
                                else                            //还没有接收到0x0d  "\r"
                                {
                                  if(Res == 0x0d)
                                        {
                                                LoraUartRxSta |= 0x4000;
                                        }               
                                        else
                                        {
                                          LoraUartRxBuf[LoraUartRxSta&0x3fff] = Res;
                                                LoraUartRxSta++;
                                        }
                                }
                 }
        }
}

使用特权

评论回复
36
hanzhen654|  楼主 | 2019-8-25 18:07 | 只看该作者
//接收数据结构体
typedef struct LoraReceiveBuff
{
        uint8_t LoraId[3];      //ID号
        uint8_t HumiData[3];    //温度信息
  uint8_t TempData[3];    //湿度信息
}LoraReceiveData;

使用特权

评论回复
37
hanzhen654|  楼主 | 2019-8-25 18:07 | 只看该作者
void LoraTestData()
{

  OLED_ShowStr(0,0," Node1 ReData",2);
        OLED_ShowStr(0,3,"Temp: ",2);
        OLED_ShowStr(100,3,"C",2);
        OLED_ShowStr(0,6,"Humi: ",2);
        OLED_ShowStr(100,6,"H",2);
        if(LoraUartRxSta&0x8000)
        {
                loradata.LoraId[0] = LoraUartRxBuf[0];
                loradata.LoraId[1] = LoraUartRxBuf[1];
                loradata.LoraId[2] = LoraUartRxBuf[2];
                loradata.TempData[0] = LoraUartRxBuf[3];
                loradata.TempData[1] = LoraUartRxBuf[4];
                loradata.TempData[2] = LoraUartRxBuf[5];
                loradata.HumiData[0] = LoraUartRxBuf[6];
                loradata.HumiData[1] = LoraUartRxBuf[7];
                loradata.HumiData[2] = LoraUartRxBuf[8];
                if((loradata.LoraId[0]=='#')&&(loradata.LoraId[1]=='0')&&(loradata.LoraId[2]=='1'))
                {
                        OLED_ShowChar(60,3,loradata.TempData[0],2);
                        OLED_ShowChar(68,3,loradata.TempData[1],2);
                        OLED_ShowChar(76,3,loradata.TempData[2],2);
                        OLED_ShowChar(60,6,loradata.HumiData[0],2);
                        OLED_ShowChar(68,6,loradata.HumiData[1],2);
                        OLED_ShowChar(76,6,loradata.HumiData[2],2);
                }
                LoraUartRxSta =0;
        }
}

使用特权

评论回复
38
goodluck09876| | 2019-8-26 08:44 | 只看该作者
SX1278吗?

使用特权

评论回复
39
hanzhen654|  楼主 | 2019-8-26 14:03 | 只看该作者

是的,正点原子那个Lora模组

使用特权

评论回复
40
goodluck09876| | 2019-8-26 14:23 | 只看该作者
hanzhen654 发表于 2019-8-26 14:03
是的,正点原子那个Lora模组

这个应该是很好用的!你选择PA了吗?就是无线功放?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则