移植ds18b20到stm32f103遇到的问题
总结一下STM32与AVR单片机在使用DS18B20的区别。
18B20使用一线值,单片机控制DQ引脚既需要输出电平,同时需要读取引脚电平。AVR单片机是通过设置DDRx寄存器来控制引脚的输入/输出状态。读引脚时,读取PIN,输出的时候写PORT。STM32的引脚可以配置为开漏输出模式,读输入数据寄存器就可得到引脚状态,省去来回切换输入输出模式,需要加上拉电阻。并且按照18B20数据手册,DQ引脚需要4.7k上拉电阻。
/*
*********************************************************************************************************
* 函 数 名: DS18B20_GPIOConfiguration
* 功能说明: 18b20端口配置为开漏输出
* 形 参:无
* 返 回 值: 无
*********************************************************************************************************
*/
void DS18B20_GPIOConfiguration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(DQ_GPIORCC, ENABLE);
DQ_1; // 需要先写输出寄存器为1,否则初始化后默认输出0
GPIO_InitStructure.GPIO_Pin = Pin18B20;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; //开漏输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIO18B20, &GPIO_InitStructure);
}
uint8_t BUSY(void) //读温度传感器数据引脚
{
return GPIO_ReadInputDataBit(GPIO18B20, Pin18B20);
}
评论