STM32HAL库-硬件IIC

STM32HAL库-硬件IIC

    • 调试物料准备
    • 环境搭建
      • 软件环境
      • 硬件环境
    • 开始编码
      • 定制引脚功能
      • 生成的代码架构
      • main函数实现
      • 替换为I2C硬件写函数
    • 实现效果

调试物料准备

  1. STM32F103C8TX开发板
    STM32HAL库-硬件IIC_第1张图片

  2. STLINK-V2
    STM32HAL库-硬件IIC_第2张图片

  3. 0.96寸OLED模块
    STM32HAL库-硬件IIC_第3张图片

  4. 杜邦线若干

环境搭建

软件环境

使用的是STM官方免费的IDE:STM32CubeIDE,有如下优点:

  • 采用图形界面配置,代码生成,减少对时钟、IIC等硬件初始化的关注。
  • 集成的硬件Hal库可以直接调用,不必直接操作硬件寄存器。
  • 上面两个特点更适合快速开发,而且由于采用封装库,出bug的几率比较少。
    在这里插入图片描述

硬件环境

PC<—>STLINK<—>STM32开发板<—I2C总线—>OLED
非常简单的环境,主要是为了验证使用IDE和硬件Hal库。

开始编码

定制引脚功能

STM32HAL库-硬件IIC_第4张图片
进入到主页面后有许多的选项可供配置,包括DMA、时钟、GPIO等等,还有总线。这次主要使用的就是I2C总线。我用的这款STM32F103C8上有两个
硬件I2C。选用了其中的I2C1,看到选择完成后,PB6、PB7两个引脚就被选中了分别为SCL,SDA。ctrl+s保存一下,I2C初始化配置的代码就生成了。接下来要做的就是使用HAL库对硬件I2C的业务流程编码了。

注意: 第一次使用STM32CubeIDE时容易犯的一个错误是: 误关闭开发板的stlink的调试。生成代码前一定要在System Core–>SYS–>Debug中选择Serial Wire。否则发现成功下载一次后,以后再也下载不了程序了,因为debug模式被无情关闭了。。

生成的代码架构

STM32HAL库-硬件IIC_第5张图片
上面就是一个生成好的目录结构,包括两块:

  • Core
  • Drivers

Core主要是系统初始化的文件,我们主要使用的main函数就再main.c中。
Drivers主要是各种外设的驱动,包括I2C,DMA,GPIO,FLASH等。

注意: IDE生成的代码框架里有许多如下的注释,我们自己的代码一定要写到这些注释里面,才不会被代码生成器给删除掉。比如我还想增加一路I2C,这时去图形界面调整后,再生成代码,不在这些注释里的函数,都会被删除掉。

在这里插入图片描述

main函数实现

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_I2C1_Init(); //系统自动生成的I2C1初始化函数
  /* USER CODE BEGIN 2 */
  OLED_Init();
  OLED_ColorTurn(0);//0正常显示,1 反色显示
  OLED_DisplayTurn(0);//0正常显示 1 屏幕翻转显示
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
		OLED_ShowChinese(0,0,0,16);//每
		OLED_ShowChinese(18,0,1,16);//天
		OLED_ShowChinese(36,0,2,16);//快
		OLED_ShowChinese(54,0,3,16);//乐
		OLED_Refresh();
		memset(OLED_GRAM, 0, 144*8);
		OLED_Refresh();
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

上面代码就是main的实现,自己实现的代码都写到了USER CODE注释中。实现将“每天快乐”这四个字打印到屏幕上。

替换为I2C硬件写函数

本次主要使用的是模块自带的示例代码,只是将GPIO实现的软件I2C,替换为了硬件I2C。直接上电就好使了,没有debug。用HAL库+硬件I2C,对于快速上手,确实是方便不少,代码如下:

void OLED_WR_Byte(uint8_t dat,uint8_t mode)
{
	uint8_t ucMode[2] = {0};
    if(mode)
    {
    	ucMode[0] = 0x40;//命令
    }
    else
    {
    	ucMode[0] = 0;//数据
    }
    ucMode[1] = dat;

	while(HAL_I2C_Master_Transmit(&hi2c1, 0x78, &ucMode, 2, 10000)!= HAL_OK) //从机地址0x78 ,超时时间为10s
	{//HAL开头的都为库函数
	    if (HAL_I2C_GetError(&hi2c1) != HAL_I2C_ERROR_AF)
	    {
	        Error_Handler();
	    }
	}
}

HAL库中硬件I2C的发送接收有许多种实现方式,这次用到的是最简单的一种主机发送。复杂一些的还有通过中断和DMA实现的,后面再一一探索。

实现效果

STM32HAL库-硬件IIC_第6张图片
硬件I2C好使了!

你可能感兴趣的:(stm32,HAL)