移植ds18b20到stm32f103遇到的问题
时间:12-02
来源:互联网
点击:
之前在AVR单片机上用过DS18B20温度传感器,现在需要在STM32F103平台下使用,就直接在原先的代码基础上做了相应修改,调试时遇到的问题是测量值总是显示127.9375(读取的温度数据为0x7fff),用示波器看波形也没有发现问题,以为是18B20出问题了,又回到AVR下测试,结果正常。后来发现,不同之处在于供电:AVR用的5V,而STM32是3.3V。把18B20的供电电压换成5V就能正常工作了。又测试了18B20用3.3V供电,DQ脚5V上拉,测量数据还是不对,而且与上拉电阻值无关。数据手册上明明写的供电电压3~5.5V,难道是管子的问题?
总结一下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);
}
总结一下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);
}
移植ds18b20stm32f10 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)