stm32-hal库

总线结构

cubemx给i2c生成了一个句柄 hi2c1

c 复制代码
    uint8_t commands[] = {
      0x00,// oled写命令
      0xAE, // 关闭屏幕
      0x8d,0x14,//使用电荷泵
      0xAF,// 打开屏幕
    };

    /**
     *  HAL_OK : 成功
     *  HAL_ERROR : 发送出错
     *  HAL_BUSY  : i2c接口忙
     *  HAL_TIMEOUT : 发送超时
     *
     */
   HAL_I2C_Master_Transmit(&hi2c1,0x78,commands,sizeof(commands)/sizeof(commands[0]),HAL_MAX_DELAY);


    uint8_t dataRcvd;
    HAL_I2C_Master_Receive(&hi2c1,0x78,&dataRcvd,1,HAL_MAX_DELAY);


    if ((dataRcvd & (0x01 << 6)) == 0) {
      HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);
    }else {
      HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);
    }

USART代码

c 复制代码
  /**
  *HAL_OK : 成功
  *HAL_ERROR : 失败
  *HAL_BUSY : 串口忙
  *HAL_TIMEOUT : 超时
  *
  */
  uint8_t byteNumber = 0x5a;
  char *str = "hello world";
  // int8_t
  HAL_UART_Transmit(&huart1,&byteNumber,1,HAL_MAX_DELAY);
  HAL_UART_Transmit(&huart1,(uint8_t*)str,strlen(str),HAL_MAX_DELAY);
c 复制代码
   uint8_t receive;
    HAL_UART_Receive(&huart1,&receive,1,HAL_MAX_DELAY);
    if (receive == '0') {
      HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);
    }else {
      HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);
    }

串口中断

weak表示可以被覆盖,,,

c 复制代码
  // 收5次中断,,这五个中断都执行完了的话,,,会执行最终的回调函数
  // 中断是hal自己完成的,,我们只需要关注完成之后的那个函数
  HAL_UART_Receive_IT(&huart1,&receiveData,1);

每次接收一个,,进入中断后再启动下一次的中断

c 复制代码
/**
 *串口中断完成进入函数
 * @param huart  哪一个串口句柄
 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {

  if (huart == &huart1) {
    if (receiveData == '1') {
      blinkTime = 1000;
    }else if (receiveData == '2') {
      blinkTime = 400;
    }else if (receiveData == '3') {
      blinkTime = 200;
    }

    HAL_UART_Receive_IT(&huart1,&receiveData,1);
  }

}

实际寄存器

影子寄存器