OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2683|回复: 4

写了个程序,用到了oled和485通讯,但是发现不接oled,485就没法通讯,接上oled重新上电就行了,找不出问题在哪

[复制链接]

5

主题

15

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2020-4-29
在线时间
10 小时
发表于 2020-6-6 08:50:49 | 显示全部楼层 |阅读模式
1金钱

最佳答案

查看完整内容[请看2#楼]

不接OLED程序怎么执行呢?会不会卡在哪里呢?是卡在OLED初始化?还是什么现象?
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

778

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6745
金钱
6745
注册时间
2017-4-12
在线时间
1258 小时
发表于 2020-6-6 08:50:50 | 显示全部楼层
不接OLED程序怎么执行呢?会不会卡在哪里呢?是卡在OLED初始化?还是什么现象?
回复

使用道具 举报

5

主题

15

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2020-4-29
在线时间
10 小时
 楼主| 发表于 2020-6-6 08:51:31 | 显示全部楼层
#define FLASH_SAVE_ADDR  0X08007000   //设置FLASH 保存地址(必须为偶数,且其值要大于本代码所占用FLASH的大小+0X08000000)
#define FLASH_SAVE_ADDR1  0X08007010

void Uart1_send(uint8_t *pData,uint16_t rx_len)
{

       
}


  u16 Databuf[300];

  u16 pBuffer;
  uint8_t return_data[300];
        static void Return_data(uint16_t addr,uint8_t cmd,uint8_t len);
  u8 rs485buf[64];
int main(void)
{         

        u16 i,led_sta = 0;
        u16 data_addr=0X0000;//寄存器的起始地址
        u16 data;//数据
        u16 crc=0;
  short oo2;
        u16 g_usAddr;
        u16 v_o2;
        u8 rx_len = 0;
       
         u8 strbuf[64];
         short av=0;//平均值
         int o;
         
         
         
         
        delay_init();                  //延时函数初始化         
  LED_Init();       
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
  uart_init(9600);         //串口初始化为9600
        RS485_Init(9600);
        LED_Init();                 //LED端口初始化
        Adc_Init();
  IIC_Init();
  OLED_Init();
       
         STMFLASH_Read(FLASH_SAVE_ADDR,&g_usAddr,1);
         STMFLASH_Read(FLASH_SAVE_ADDR1,&v_o2,1);
        while(1)
        {
               
          oo2=Get_O2();
               
       
               
                for(o=0;o<17;o++)
                {
                         oo2=Get_O2();
                       
                        av+=oo2;
                       
                }
                av/=17;
                       
    #include "stm32f10x.h"                  // Device header
            sprintf((char*)strbuf,"%.1f",(float)oo2/10);
          
          
                  OLED_P16x16Ch(0,2,0);       //氧
                        OLED_P16x16Ch(18,2,1);      //气
                        OLED_P16x16Ch(40,2,2);      //浓
                        OLED_P16x16Ch(58,2,3);      //度
                        OLED_P16x16Ch(80,2,4);      //:
                  OLED_P8x16Str(0,4,(u8*)strbuf);
                  
               
                Databuf[0] =  g_usAddr;  
                Databuf[1] =  oo2;
                Databuf[2] =  v_o2;
       
                LED1 = led_sta;
                led_sta ^= 0x01;




                RS485_Receive_Data(rs485buf,&rx_len);
                if(rx_len == 8)//检验crc是否正确,标准长度是八位
        {
                crc = rs485buf[rx_len-2];  //crc等于数据长度-2的位
          crc <<= 8;    //左移八位
          crc |= rs485buf[rx_len-1];

                if(crc==CRC16(rs485buf,rx_len-2))
                {
                if(rs485buf[0] ==g_usAddr)//判断第零位是不是地址
                {
                        data_addr = rs485buf[2];//寄存器
                        data_addr <<=8;
                        data_addr|= rs485buf[3];
                       
                        data = rs485buf[4];//个数
                        data = data<<8;//左移八位
                        data += rs485buf[5];//第四位和第五位合并
                       
                        switch(rs485buf[1])
                        {
                                case 0x03:       //如果功能位等于03
                             for(i=0;i<data;i++)    //
                                        {
                                                        return_data[2*i+3]=Databuf[data_addr+i]/256;
                                                        return_data[2*i+4]=Databuf[data_addr+i]%256;
                                        }
                                                Return_data(g_usAddr,0x03,2*i);
                                                break;
                                       
                                        case 0x06:
                                        if(data_addr == 0x0000)//如果接受的寄存器地址是0000
                                        {
                                                if (data > 0 && data < 0xFF)
                                                {
                                                        STMFLASH_Write(FLASH_SAVE_ADDR, &data, 1);
                                                        RS485_Send_Data(rs485buf, rx_len);
                                                        NVIC_SystemReset();
                                                }
                                               
                                        }
                                        if(data_addr == 0x0002)//如果接受的寄存器地址是0002
                                        {
                                                if (data > 0 && data < 0xFF)
                                                {
                                                        STMFLASH_Write(FLASH_SAVE_ADDR1, &data, 1);
                                                        RS485_Send_Data(rs485buf, rx_len);
                                                        NVIC_SystemReset();
                                                }
                                               
                                        }
                                        break;
                                                default:
                                        break;
                        }
                               
                  }
                }
         }
}
        }

       
        void Return_data(uint16_t addr,uint8_t cmd,uint8_t len)
{
        uint16_t crc;

        return_data[0]=addr;
        return_data[1]=cmd;
        return_data[2]=len;
        crc = CRC16(return_data,len+3);
        return_data[len+3]=crc/256;
        return_data[len+4]=crc%256;
        RS485_Send_Data(return_data,len+5);
}
                               
       
回复

使用道具 举报

21

主题

2205

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5141
金钱
5141
注册时间
2014-8-26
在线时间
1317 小时
发表于 2020-6-6 16:40:25 | 显示全部楼层
用仿真器debug调试看下
回复

使用道具 举报

5

主题

15

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2020-4-29
在线时间
10 小时
 楼主| 发表于 2020-6-8 09:58:21 | 显示全部楼层
245925587 发表于 2020-6-7 09:10
不接OLED程序怎么执行呢?会不会卡在哪里呢?是卡在OLED初始化?还是什么现象?

卡在初始化了 初始化的时候有个while死循环  直接死在那里了
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-9 16:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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