[问题讨论] 基于GD32的仓库温度报警系统---GPIO初始化与延时设定

yin_wu_qing   2018-10-7 22:04 楼主
     哎,国庆节就这样过去了,但项目的bug迟迟没有得到解决,实感惭愧。
     代码如下:
     void udelay(uint32_t nTime)
{
        uwTick = nTime;
        while(0U != uwTick){
    }
}

void GPIO_Init(uint32_t gpio_periph,GPIO_InitPara *Para)
{
    rcu_periph_clock_enable(RCU_GPIOB);
    GPIO_BOP(gpio_periph) = Para->GPIO_Pin;
    GPIO_OSPD0(gpio_periph) = Para->GPIO_Speed;
    GPIO_OMODE(gpio_periph) = Para->GPIO_Mode;
       
    GPIO_BC(gpio_periph) = Para->GPIO_Pin;
}

void TempGPIOInit(void)
{
        rcu_periph_clock_enable(RCU_GPIOB);

        GPIO_InitStructure.GPIO_Pin = GPIO_PIN_12;
        GPIO_InitStructure.GPIO_Mode = GPIO_MODE_OUT_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ;
        GPIO_Init(GPIOB,&GPIO_InitStructure);
}

void TempGPIOin(void)
{
        GPIO_InitStructure.GPIO_Pin = GPIO_PIN_12;
        GPIO_InitStructure.GPIO_Mode = GPIO_MODE_IN_FLOATING;
        GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ;
        GPIO_Init(GPIOB,&GPIO_InitStructure);
}

void TempGPIOout(void)
{
        GPIO_InitStructure.GPIO_Pin = GPIO_PIN_12;
        GPIO_InitStructure.GPIO_Mode = GPIO_MODE_OUT_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ;
        GPIO_Init(GPIOB,&GPIO_InitStructure);
}
static void ds18b20_write8(unsigned char data)
{
        int i;
          unsigned long flags;
        TempGPIOout();
       for (i = 0; i < 8; i++) {
                if ((data & 0x1) == 1) {
                        gpio_bit_reset(GPIOB, GPIO_PIN_12);
                        udelay(3);
                        gpio_bit_set(GPIOB, GPIO_PIN_12);
                        udelay(80);
                } else {
                        gpio_bit_reset(GPIOB, GPIO_PIN_12);
                        udelay(80);
                        gpio_bit_set(GPIOB, GPIO_PIN_12);
                        udelay(3);
                }
                data >>= 1;
       }

}

static unsigned char ds18b20_read8(void)
{
        int i;
        unsigned char bit;
        unsigned char data = 0;

        for (i = 0; i < 8; i++) {
                    TempGPIOout();
                gpio_bit_reset(GPIOB, GPIO_PIN_12);
                udelay(2);
                    TempGPIOin();
                bit = gpio_input_bit_get(GPIOB, GPIO_PIN_12);
                data |= (bit << i);
                udelay(60);
        }
                   
        return data;
}

static void ds18b20_reset(void)
{
        unsigned char ret;
       
          TempGPIOout();
        gpio_bit_reset(GPIOB, GPIO_PIN_12);
        udelay(500);
         gpio_bit_set(GPIOB, GPIO_PIN_12);
        udelay(30);
          gpio_bit_write(GPIOB, GPIO_PIN_12,0x00);
        TempGPIOin();
          
        ret = (gpio_input_bit_get(GPIOB, GPIO_PIN_12));
        udelay(500);
        if (ret == 0) {
                EvbUart1Printf("reset ok.\n");
        } else {
                EvbUart1Printf("reset failed.\n");
        }
}

static uint32_t ds18b20_read()
{
        unsigned char h8, l8;
        int temp = 0;

        ds18b20_reset();
        ds18b20_write8(DS18B20_SKIP_ROM);
        ds18b20_write8(DS18B20_COVERTT);

        ds18b20_reset();
        ds18b20_write8(DS18B20_SKIP_ROM);
        ds18b20_write8(DS18B20_READ_MEM);

        l8 = ds18b20_read8();
        h8 = ds18b20_read8();

        temp = (h8 << 8) | l8;

        temp *= 625;

        return temp;
}

以上不知道是gpio的初始化有问题还是延时精准度不对,毕竟对于单线式通讯协议时钟的设置精度要求比较高。
测试的结果总是如图所示,请高人指点,谢谢!

  • 微信截图_20181007220354.png

回复评论 (2)

路过,鼓励一下,加油!
专注智能产品的研究与开发,专注于电子电路的生产与制造……QQ:2912615383,电子爱好者群: void
点赞  2018-10-8 15:18
用逻辑分析仪抓取时序图看看,如果有示波器则更好。
点赞  2018-10-8 17:35
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复