1 Star 1 Fork 0

繁花云/AIR001_i2c_u8g2_test

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
main.c 7.05 KB
一键复制 编辑 原始数据 按行查看 历史
繁花云 提交于 2023-09-03 21:12 +08:00 . Initial commit
#include "air001xx_hal.h"
#include "air001_Core_Board.h"
#include "u8g2_hal.h"
#include "u8g2.h"
#include "oled_menu.h"
#include "button_hal.h"
#define I2C_ADDRESS 0xA0 /* 本机地址0xA0 */
#define I2C_SPEEDCLOCK 400000 /* 通讯速度400K */
#define I2C_DUTYCYCLE I2C_DUTYCYCLE_16_9 /* 占空比 */
u8g2_t u8g2;
I2C_HandleTypeDef I2cHandle;
static DMA_HandleTypeDef HdmaCh1;
static DMA_HandleTypeDef HdmaCh2;
static void APP_SystemClockConfig(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
/* 振荡器配置 */
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_LSI | RCC_OSCILLATORTYPE_LSE; /* 选择振荡器HSE,HSI,LSI,LSE */
RCC_OscInitStruct.HSIState = RCC_HSI_ON; /* 开启HSI */
RCC_OscInitStruct.HSIDiv = RCC_HSI_DIV1; /* HSI 1分频 */
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_24MHz; /* 配置HSI时钟16MHz */
RCC_OscInitStruct.HSEState = RCC_HSE_OFF; /* 关闭HSE */
/*RCC_OscInitStruct.HSEFreq = RCC_HSE_16_32MHz;*/
RCC_OscInitStruct.LSIState = RCC_LSI_OFF; /* 关闭LSI */
RCC_OscInitStruct.LSEState = RCC_LSE_OFF; /* 关闭LSE */
/*RCC_OscInitStruct.LSEDriver = RCC_LSEDRIVE_MEDIUM;*/
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; /* 开启PLL */
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; /* 选择时钟源为HSI */
/* 配置振荡器 */
HAL_RCC_OscConfig(&RCC_OscInitStruct);
/* 时钟源配置 */
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1; /* 选择配置时钟 HCLK,SYSCLK,PCLK1 */
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; /* 选择PLL作为系统时钟 */
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; /* AHB时钟 1分频 */
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; /* APB时钟 1分频 */
/* 配置时钟源 */
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1);
}
void i2c_config(void)
{
/* 初始化LED */
BSP_LED_Init(LED_RED);
/* I2C初始化 */
I2cHandle.Instance = I2C; /* I2C */
I2cHandle.Init.ClockSpeed = I2C_SPEEDCLOCK; /* I2C通讯速度 */
I2cHandle.Init.DutyCycle = I2C_DUTYCYCLE; /* I2C占空比 */
I2cHandle.Init.OwnAddress1 = I2C_ADDRESS; /* I2C地址 */
I2cHandle.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; /* 禁止广播呼叫 */
I2cHandle.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; /* 允许时钟延长 */
HAL_I2C_Init(&I2cHandle);
}
void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_SYSCFG_CLK_ENABLE(); /* SYSCFG时钟使能 */
__HAL_RCC_DMA_CLK_ENABLE(); /* DMA时钟使能 */
__HAL_RCC_I2C_CLK_ENABLE(); /* I2C时钟使能 */
__HAL_RCC_GPIOF_CLK_ENABLE(); /* GPIOF时钟使能 */
/**I2C引脚配置
PF0 ------> I2C1_SCL
PF1 ------> I2C1_SDA
*/
GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; /* 开漏 */
GPIO_InitStruct.Pull = GPIO_PULLUP; /* 上拉 */
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF12_I2C; /* 复用为I2C */
HAL_GPIO_Init(GPIOF, &GPIO_InitStruct); /* GPIO初始化 */
/*复位I2C*/
__HAL_RCC_I2C_FORCE_RESET();
__HAL_RCC_I2C_RELEASE_RESET();
/* I2C1中断初始化 */
HAL_NVIC_SetPriority(I2C1_IRQn, 0, 0); /* 中断优先级设置 */
HAL_NVIC_EnableIRQ(I2C1_IRQn); /* 使能I2C中断 */
/* 配置DMA请求映像 */
HAL_SYSCFG_DMA_Req(9); /* DMA1_MAP选择为IIC_TX */
HAL_SYSCFG_DMA_Req(0xA00); /* DMA2_MAP选择为IIC_RX */
/* */
/* 配置DMA(用于发送) */
HdmaCh1.Instance = DMA1_Channel1; /* 选择DMA通道1 */
HdmaCh1.Init.Direction = DMA_MEMORY_TO_PERIPH; /* 方向为从存储器到外设 */
HdmaCh1.Init.PeriphInc = DMA_PINC_DISABLE; /* 禁止外设地址增量 */
HdmaCh1.Init.MemInc = DMA_MINC_ENABLE; /* 使能存储器地址增量 */
HdmaCh1.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; /* 外设数据宽度为8位 */
HdmaCh1.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; /* 存储器数据宽度位8位 */
HdmaCh1.Init.Mode = DMA_NORMAL; /* 禁止循环模式 */
HdmaCh1.Init.Priority = DMA_PRIORITY_VERY_HIGH; /* 通道优先级为很高 */
HAL_DMA_Init(&HdmaCh1); /* 初始化DMA通道1 */
__HAL_LINKDMA(hi2c, hdmatx, HdmaCh1); /* DMA1关联IIC_TX */
/* 配置DMA(用于接收) */
HdmaCh2.Instance = DMA1_Channel2; /* 选择DMA通道1 */
HdmaCh2.Init.Direction = DMA_PERIPH_TO_MEMORY; /* 方向为从外设到存储 */
HdmaCh2.Init.PeriphInc = DMA_PINC_DISABLE; /* 禁止外设地址增量 */
HdmaCh2.Init.MemInc = DMA_MINC_ENABLE; /* 使能存储器地址增量 */
HdmaCh2.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; /* 外设数据宽度为8位 */
HdmaCh2.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; /* 存储器数据宽度位8位 */
HdmaCh2.Init.Mode = DMA_NORMAL; /* 禁止循环模式 */
HdmaCh2.Init.Priority = DMA_PRIORITY_HIGH; /* 通道优先级为高 */
HAL_DMA_Init(&HdmaCh2); /* 初始化DMA通道1 */
__HAL_LINKDMA(hi2c, hdmarx, HdmaCh2); /* DMA1关联IIC_RX */
HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0); /* 中断优先级设置 */
HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn); /* 使能DMA通道1中断 */
HAL_NVIC_SetPriority(DMA1_Channel2_3_IRQn, 0, 0); /* 中断优先级设置 */
HAL_NVIC_EnableIRQ(DMA1_Channel2_3_IRQn); /* 使能DMA通道2_3中断 */
}
int main(void)
{
HAL_Init();
__HAL_RCC_SYSCFG_CLK_ENABLE();
__HAL_RCC_PWR_CLK_ENABLE();
APP_SystemClockConfig();
BSP_USART_Config();
i2c_config();
u8g2_Setup_sh1106_i2c_128x64_noname_1(
&u8g2,
U8G2_R0,
//u8x8_byte_sw_i2c,
u8x8_byte_i2c,
u8x8_gpio_and_delay); // init u8g2 structure
u8x8_SetI2CAddress(&u8g2.u8x8, 0x78);
printf("u8g2_InitDisplay\r\n");
u8g2_InitDisplay(&u8g2); // send init sequence to the display, display is in sleep mode after this,
u8g2_SetContrast(&u8g2, 0x01);
printf("u8g2_SetPowerSave\r\n");
u8g2_SetPowerSave(&u8g2, 0); // wake up display
u8g2_ClearDisplay(&u8g2);
user_button_init();
menu_init();
while(1)
{
}
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/fhcloud/air001_i2c_u8g2_test.git
git@gitee.com:fhcloud/air001_i2c_u8g2_test.git
fhcloud
air001_i2c_u8g2_test
AIR001_i2c_u8g2_test
master

搜索帮助