使用的是STM官方免费的IDE:STM32CubeIDE,有如下优点:
PC<—>STLINK<—>STM32开发板<—I2C总线—>OLED
非常简单的环境,主要是为了验证使用IDE和硬件Hal库。
进入到主页面后有许多的选项可供配置,包括DMA、时钟、GPIO等等,还有总线。这次主要使用的就是I2C总线。我用的这款STM32F103C8上有两个
硬件I2C。选用了其中的I2C1,看到选择完成后,PB6、PB7两个引脚就被选中了分别为SCL,SDA。ctrl+s保存一下,I2C初始化配置的代码就生成了。接下来要做的就是使用HAL库对硬件I2C的业务流程编码了。
注意: 第一次使用STM32CubeIDE时容易犯的一个错误是: 误关闭开发板的stlink的调试。生成代码前一定要在System Core–>SYS–>Debug中选择Serial Wire。否则发现成功下载一次后,以后再也下载不了程序了,因为debug模式被无情关闭了。。
Core主要是系统初始化的文件,我们主要使用的main函数就再main.c中。
Drivers主要是各种外设的驱动,包括I2C,DMA,GPIO,FLASH等。
注意: IDE生成的代码框架里有许多如下的注释,我们自己的代码一定要写到这些注释里面,才不会被代码生成器给删除掉。比如我还想增加一路I2C,这时去图形界面调整后,再生成代码,不在这些注释里的函数,都会被删除掉。
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注释中。实现将“每天快乐”这四个字打印到屏幕上。
本次主要使用的是模块自带的示例代码,只是将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实现的,后面再一一探索。