前言:
通过STM32Cube 建立工程,配置GPIO口来模拟I2C,并配置USART2实现串口实时输出温度。最终实现I2C读取LM75A数字传感器的温度,来通过串口实时显示出来。

用到工具:
1.STM32F103ZET6开发板
2.STM32Cube软件
3.MDK-Keil 5
4.STM32F1XX HAL库
5.LM75A数字温度传感器

知识点:
1.通过STM32Cube创建例程
2.HAL库中的串口配置,GPIO口配置,定时器配置,系统时钟配置
3.GPIO模拟I2C时序
4.通过定时器来实现us级延时
5.LM75数字温度传感器的使用

硬件连接:

LM75--数字温度传感器 STM32
SCL PB10--I2C_SCL
SDA PB11--I2C_SDA
VCC VCC--5V
GND GND

USB转TTL线,一头连接电脑,另外一头连接USART2的TX口--PA2,和RX口--PA3

工程创建:
1.打开STM32Cube,新建工程,选择芯片型号,选择芯片封装。双击选择的芯片封装后,开始建立工程:







***编辑代码***
1.在tim.c中添加us延时函数(记得函数名称在tim.h声明一下)

/* USER CODE BEGIN 1 */
void delay_us(uint16_t us)
{uint16_t differ=0xffff-us-5;                  __HAL_TIM_SET_COUNTER(&htim6,differ);HAL_TIM_Base_Start(&htim6);                    while(differ<0xffff-6)                           {differ=__HAL_TIM_GET_COUNTER(&htim6);         }HAL_TIM_Base_Stop(&htim6);
}
/* USER CODE END 1 */

2.在gpio.c中添加有关GPIO口模拟I2C的函数
I2C时序:

主机向从机写数据:

主机从从机读数据:

先在main.h中宏定义一些函数

/* USER CODE BEGIN Private defines */
#define I2C_SCL_H HAL_GPIO_WritePin(I2C_SCL_GPIO_Port, I2C_SCL_Pin, GPIO_PIN_SET);
#define I2C_SCL_L HAL_GPIO_WritePin(I2C_SCL_GPIO_Port, I2C_SCL_Pin, GPIO_PIN_RESET);#define I2C_SDA_H HAL_GPIO_WritePin(I2C_SDA_GPIO_Port, I2C_SDA_Pin, GPIO_PIN_SET);
#define I2C_SDA_L HAL_GPIO_WritePin(I2C_SDA_GPIO_Port, I2C_SDA_Pin, GPIO_PIN_RESET);
/* USER CODE END Private defines */

再从gpio.c中写入GPIO模拟I2C的函数(记得函数名称在gpio.h中声明一下)

/* USER CODE BEGIN 2 */
/*设置SDA线路为输出模式,此时为主机写*/
void I2C_SDA_OUT()
{GPIO_InitTypeDef GPIO_InitStruct = {0};/*Configure GPIO pin Output Level *///HAL_GPIO_WritePin(GPIOB, I2C_SDA_Pin, GPIO_PIN_SET);/*Configure GPIO pins : PBPin PBPin */GPIO_InitStruct.Pin = I2C_SDA_Pin;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
/*设置SDA线路为输入模式,此时为主机读*/
void I2C_SDA_IN()
{GPIO_InitTypeDef GPIO_InitStruct = {0};/*Configure GPIO pin Output Level *///HAL_GPIO_WritePin(GPIOB, I2C_SDA_Pin, GPIO_PIN_SET);/*Configure GPIO pins : PBPin PBPin */GPIO_InitStruct.Pin = I2C_SDA_Pin;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_PULLUP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
/*I2C起始信号*/
void I2C_Start()
{I2C_SDA_OUT();I2C_SCL_H;I2C_SDA_H;delay_us(5);//watch: There is ---5usI2C_SDA_L;delay_us(6);I2C_SCL_L;
}
/*I2C停止信号*/
void I2C_Stop()
{I2C_SDA_OUT();I2C_SCL_H;I2C_SDA_L;delay_us(6);I2C_SDA_H;delay_us(6);
}
/*主机应答*/
void I2C_ACK() //Master ack
{I2C_SDA_OUT();I2C_SCL_L;I2C_SDA_L;delay_us(2);I2C_SCL_H;delay_us(6);I2C_SCL_L;delay_us(2);I2C_SDA_H;
}
/*主机非应答*/
void I2C_NACK() //Master NAck
{I2C_SDA_OUT();I2C_SCL_L;I2C_SDA_H;delay_us(2);I2C_SCL_H;delay_us(6);I2C_SCL_L;delay_us(2);I2C_SDA_L;
}
/*主机等待应答,0:有应答;1:无应答*/
uint8_t I2C_Wait_Ack()//wait slaver ack  0 means ack OK; 1 means ack Fail;
{uint8_t tempTime = 0;I2C_SDA_IN();I2C_SDA_H;delay_us(1);I2C_SCL_H;delay_us(1);while(HAL_GPIO_ReadPin(I2C_SDA_GPIO_Port,I2C_SDA_Pin)){tempTime++;if(tempTime>250){I2C_Stop();return 1;}}I2C_SCL_L;return 0;
}
/*主机写一个8位的数据*/
void I2C_Send_Byte(uint8_t txd)
{uint8_t i = 0;I2C_SDA_OUT();I2C_SCL_L;for(i=0;i<8;i++){if((txd & 0x80)>0){I2C_SDA_H;}else{I2C_SDA_L;}txd <<= 1;I2C_SCL_H;delay_us(2);I2C_SCL_L;delay_us(2);}
}
/*主机读一个8位的数据*/
uint8_t I2C_Read_Byte(uint8_t ack)
{uint8_t i = 0,receive = 0;I2C_SDA_IN();for(i=0;i<8;i++){I2C_SCL_L;delay_us(2);I2C_SCL_H;receive <<= 1;if(HAL_GPIO_ReadPin(I2C_SDA_GPIO_Port,I2C_SDA_Pin)){receive++;}delay_us(1);}if(ack == 0){I2C_NACK(); }else{I2C_ACK();}return receive;
}//read one Byte
/*从 从机设备 寄存器中读一个字节*/
uint8_t LM75_readoneByte(uint8_t addr)
{uint8_t temp = 0;I2C_Start();//send write hardware addr/*发送写从机设备地址*/I2C_Send_Byte(SlaveAddress);I2C_Wait_Ack();//send registor addr/*发送从机设备的寄存器地址*/I2C_Send_Byte(addr%256);I2C_Wait_Ack();I2C_Start();//send read hardware addr/*发送读从机设备地址*/I2C_Send_Byte(SlaveAddress+1);I2C_Wait_Ack();temp = I2C_Read_Byte(0);I2C_Stop();return temp;
}
/*向 从机设备 寄存器中写一个字节*/
void LM75_writeoneByte(uint8_t addr, uint8_t dt)
{I2C_Start();//send write hardware addr/*发送写从机设备地址*/I2C_Send_Byte(SlaveAddress);I2C_Wait_Ack();//send registor addr/*发送从机设备的寄存器地址*/I2C_Send_Byte(addr%256);I2C_Wait_Ack();I2C_Send_Byte(dt);I2C_Wait_Ack();I2C_Stop();HAL_Delay(10);
}//read two Byte
uint16_t LM75_readtwoByte(uint8_t addr)
{uint16_t temp = 0;I2C_Start();//send write hardware addrI2C_Send_Byte(SlaveAddress);I2C_Wait_Ack();//send registor addrI2C_Send_Byte(addr%256);I2C_Wait_Ack();I2C_Start();//send read hardware addrI2C_Send_Byte(SlaveAddress+1);I2C_Wait_Ack();temp = I2C_Read_Byte(1);temp <<= 8;temp = temp | I2C_Read_Byte(0);I2C_Stop();return temp;
}void LM75_writetwoByte(uint8_t addr, uint16_t dt)
{I2C_Start();//send write hardware addrI2C_Send_Byte(SlaveAddress);I2C_Wait_Ack();//send registor addrI2C_Send_Byte(addr%256);I2C_Wait_Ack();I2C_Send_Byte(dt>>8);I2C_Wait_Ack();I2C_Send_Byte(dt&0xff);I2C_Wait_Ack();I2C_Stop();HAL_Delay(10);
}/* USER CODE END 2 */

3.在usart.c中添加printf的重定向函数(记得函数名称在usart.h中声明一下)

/* USER CODE BEGIN 1 */
int fputc(int ch,FILE *f)
{HAL_UART_Transmit(&huart2,(uint8_t *)&ch,1,0xffff);return ch;
}int fgetc(FILE *f)
{uint8_t ch = 0;HAL_UART_Receive(&huart2,&ch,1,0xffff);return ch;
}
/* USER CODE END 1 */

4.在main.c函数中添加读取温度,并打印到串口的代码

int main(void)
{/* USER CODE BEGIN 1 */uint16_t temp = 0;float f_temp = 0;/* USER CODE END 1 *//**省略其中一些自己生成的代码**//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */temp = LM75_readtwoByte(0x00);temp >>= 5;if((temp & 0x0400) == 0x0400){f_temp = -temp*0.125;}else{f_temp = temp*0.125;}printf("temp = %.2f\n",f_temp);HAL_Delay(1000);}/* USER CODE END 3 */
}

STM32cube HAL库 I2C实现LM75数字温度传感器温度读取,并串口打印相关推荐

  1. STM32cube HAL库两条命令实现i2c通信---Nucleo L476RG用I2C实现tmp117模块温度读取并串口打印

    用stm32 cubemx默认配置i2c1和urart1,本例子是用硬件i2c非模拟i2c /* I2C1 GPIO Configuration PB6 ------> I2C1_SCLPB7 ...

  2. stm32cube,hal库来实现PS2手柄数据发送

    stm32cube,hal库来实现PS2手柄数据发送 很久前买了个PS2的手柄,如下,之前 以前不会使用cube来配置工程,导致写程序很麻烦,对我这样的新手很不友好,看卖家提供的程序也很麻烦,拉高拉低 ...

  3. STM32CubeMX | 基于STM32使用HAL库硬件SPI驱动WK2124一拖四SPI转四路串口芯片

    STM32CubeMX | 基于STM32使用HAL库硬件SPI驱动WK2124一拖四SPI转四路串口芯片 STM32基础工程生成 首先使用STM32CUBEMX生成STM32的基础工程,配置时钟到7 ...

  4. 硬石YS-F1Pro开发板HAL库例程持续更新\2. 软件设计之高级裸机例程(HAL库版本)\YSF1_HAL-121. MH-Z14A二氧化碳传感器模块

    /**   ******************************************************************************   *             ...

  5. STM32CubeIDE HAL库IIC实现气压计MS5637的数据读取

    目录 一.配置 二.MS5637工作流程 1.复位 2.读取出厂校准参数 3.开启ADC及转换 4.读取数据(重复开启和读取,分别得到温度和气压值) 5.通过参数和数据计算得到标准单位的数据 三.代码 ...

  6. STM32cube HAL库 UART串口中断方式收发任意长度 调试笔记

    STM32Cube对于新项目的开发能节省不少时间,从繁琐芯片初始化中解脱出来 1.STM32 UART初始化部分,配置好工程,采用STM32cube生成代码,初始化即已经完成. 2.串口中断方式的发动 ...

  7. 【CubeIDE】STM32 HAL库史上最详细教程(一):UART串口收发

    博主能力有限,有错误望大佬指出 0x00 文章内容: UART阻塞方式收发 UART中断方式收发 UART中断回调函数 UART DMA方式收发 printf()函数串口重定向 0x01 UART阻塞 ...

  8. Ardunio单片机读取HKH-11C呼吸传感器(并通过电脑串口打印)

    1.查看说明 2.流程 1)Aduino单片机给呼吸传感器传感器发送0xFF,0xCC,0x03 CKSUM 0xA0启动呼吸传感器 CKSUM(第四位):是一个校验的数值,这里就是0x03 + 0x ...

  9. STM32 HAL库、标准外设库、LL库(STM32 Embedded Software)

    STM32 Embedded Software 工作以来一直使用ST的STM32系列芯片,ST为开发者提供了非常方便的开发库.到目前为止,有标准外设库(STD库).HAL库.LL库 三种.前两者都是常 ...

  10. hal库选择滴答时钟函数_STM32入门 : HAL库、标准外设库、LL库

      国内使用STM32 单片机的人很多,ST 为开发者提供了非常方便的开发库:有标准外设库(SPL 库).HAL 库.LL 库 三种.前者是ST的老库,后两者是ST现在主推的开发库,其中 LL 库是 ...

最新文章

  1. April Fools Contest 2017 题解源码(A,数学 B,数学 C,数学 D,字符串 E,数字逻辑 F,排序,卡时间,G,数学)...
  2. MC34063组成DC-DC电路
  3. 数据消费过程_特色鲜卤现捞加盟店经营要如何抓准消费群体定位
  4. 【今日CV 计算机视觉论文速览 第146期】Mon, 22 Jul 2019
  5. FreeRTOS任务优先级说明
  6. 【英语学习】 - 君若不离不弃,吾当生死相依
  7. 孙鑫-MFC笔记十--修改应用程序外观
  8. 获取js文件后的参数
  9. 将base64格式的图片下载到本地
  10. 飞鼠溪·狼(flying squirrel creek)-- BleedingWolves
  11. 苹果输入法怎么换行_朋友圈长文字不折叠输入法,复制粘贴避免只显示一行
  12. Android 代码实现shape(GradientDrawable详解)
  13. 浅谈中国2050年人均受教育年限问题
  14. Unity游戏动画 从入门到住院 4:动画状态机
  15. 免费好用的征集工具 | 玩转穿搭征集、好物征集、攻略征集
  16. python DNA(算法竞赛刷题)
  17. Qt实现mqtt客户端和mqtt服务器搭建
  18. 超融合和服务器关系_超融合服务器和超融合一体机有什么区别
  19. guice的使用例子
  20. Python分析香港26281套在售二手房数据!寸土寸金啊!

热门文章

  1. python null类型
  2. 恶意软件清理助手 v2.50 Build 005
  3. 项目经理之项目的投资回报率
  4. FPGA--IP核之FIFO
  5. mov相关汇编指令| movs | movsx | movzx | movsb | movsw | movsd 图文详解
  6. 微分几何笔记(1) —— 预备知识 Proof of Mazur-Ulam Theorem
  7. SDS 2.0:能否让高端存储服“软”?
  8. 三维提取等值面的重建方法Marching Cubes
  9. 小程序的申请开通需要什么条件
  10. 【全面总结】大厂测试开发面试常见面试题101道