HC32F460,硬件IIC驱动OLED

本文详细介绍了如何在STM32HC32F460微控制器上使用I2C接口初始化OLED屏幕,包括I2C初始化步骤、地址设置以及OLED操作函数,如写命令和数据,展示了驱动OLED的基本功能实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于OLED的具体介绍可参考STM32-OLED屏幕显示教程_stm32 oled_LJX的博客-CSDN博客

这里只贴了HC32F460的代码

首先是IIC初始化

static en_result_t Master_Initialize(void)
{
    en_result_t enRet;
    stc_i2c_init_t stcI2cInit;
    float32_t fErr;

    I2C_DeInit(I2C_UNIT);

    MEM_ZERO_STRUCT(stcI2cInit);
    stcI2cInit.u32ClockDiv = I2C_CLK_DIV2;
    stcI2cInit.u32Baudrate = I2C_BAUDRATE;
    stcI2cInit.u32SclTime = 0ul;
    enRet = I2C_Init(I2C_UNIT, &stcI2cInit, &fErr);

    I2C_BusWaitCmd(I2C_UNIT, Enable);

    return enRet;
}

接着是写OLED的函数,这里主要是注意写地址那是0X3C,而网上一般是说地址是0X78,我也就是这里卡了很久。

实际上地址只有七位,其中一位是读/写,也就是0X78的第一位其实不是地址,而是写。所以实际地址是0X3C,且HC32F460底层的I2C_TransAddr有对这个进行处理,也就要填实际的地址,不带最后的读/写,读/写由I2CDirTrans来控制。

static en_result_t OLED_WR_Byte(uint8_t *pu8TxData)
{
    en_result_t enRet;
    I2C_Cmd(I2C_UNIT, Enable);

    I2C_SoftwareResetCmd(I2C_UNIT, Enable);
    I2C_SoftwareResetCmd(I2C_UNIT, Disable);
    enRet = I2C_Start(I2C_UNIT,TIMEOUT);        //START
    if(Ok == enRet)
    {

        enRet = I2C_TransAddr(I2C_UNIT, (uint8_t)0x3C, I2CDirTrans, TIMEOUT);//地址

        if(Ok == enRet)
        {
            enRet = I2C_TransData(I2C_UNIT, pu8TxData, 2,TIMEOUT);
        }
        
        if(Ok != enRet)
        {
            I2C_Stop(I2C_UNIT,TIMEOUT);
            I2C_SoftwareResetCmd(I2C_UNIT, Enable);
            I2C_SoftwareResetCmd(I2C_UNIT, Disable);
        }
    }

    I2C_Stop(I2C_UNIT,TIMEOUT);
    I2C_Cmd(I2C_UNIT, Disable);

    return enRet;
}
void WriteCmd(int8_t dat)
{
    uint8_t u8TxBuf[2];
    u8TxBuf[0]=0x00;
    u8TxBuf[1]=dat;
    OLED_WR_Byte(u8TxBuf);
}

void WriteDat(int8_t dat)
{
    uint8_t u8TxBuf[2];
    u8TxBuf[0]=0x40;
    u8TxBuf[1]=dat;
    OLED_WR_Byte(u8TxBuf);    
}

void Drv_Oled_Init (void)
{
	
	// 根据数据手册提供的例程,初始化OLED
	Ddl_Delay1ms(200);   // 延时200ms 

	WriteCmd(0xAE); //display off
	WriteCmd(0x20);	//Set Memory Addressing Mode	
	WriteCmd(0x10);	//00,Horizontal Addressing Mode;01,Vertical Addressing Mode;10,Page Addressing Mode (RESET);11,Invalid
	WriteCmd(0xb0);	//Set Page Start Address for Page Addressing Mode,0-7
	WriteCmd(0xc8);	//Set COM Output Scan Direction
	WriteCmd(0x00); //---set low column address
	WriteCmd(0x10); //---set high column address
	WriteCmd(0x40); //--set start line address
	WriteCmd(0x81); //--set contrast control register
	WriteCmd(0xff); //áá?èμ÷?ú 0x00~0xff
	WriteCmd(0xa1); //--set segment re-map 0 to 127
	WriteCmd(0xa6); //--set normal display
	WriteCmd(0xa8); //--set multiplex ratio(1 to 64)
	WriteCmd(0x3F); //
	WriteCmd(0xa4); //0xa4,Output follows RAM content;0xa5,Output ignores RAM content
	WriteCmd(0xd3); //-set display offset
	WriteCmd(0x00); //-not offset
	WriteCmd(0xd5); //--set display clock divide ratio/oscillator frequency
	WriteCmd(0xf0); //--set divide ratio
	WriteCmd(0xd9); //--set pre-charge period
	WriteCmd(0x22); //
	WriteCmd(0xda); //--set com pins hardware configuration
	WriteCmd(0x12);
	WriteCmd(0xdb); //--set vcomh
	WriteCmd(0x20); //0x20,0.77xVcc
	WriteCmd(0x8d); //--set DC-DC enable
	WriteCmd(0x14); //
	WriteCmd(0xaf); //--turn on oled panel
 

}
void SetPos(unsigned char x,unsigned char y)  //设置起点坐标
{
	WriteCmd(0xb0+y);
	WriteCmd((x&0xf0)>>4|0x10); //取高位
	WriteCmd((x&0x0f)|0x01);    //取低位
}

void OLED_Fill(unsigned char Fill_Data)  //全屏填充
{
	unsigned char m,n;
	
	for(m=0;m<8;m++){
		WriteCmd(0xb0+m);
		WriteCmd(0x00);
		WriteCmd(0x10);
	
	  for(n=0;n<128;n++){
		WriteDat(Fill_Data);
		}
	}
}
void OLED_Clean(void)  //清屏
{
	OLED_Fill(0x00);
}
void OLED_ON(void)   //打开OLED
{
	WriteCmd(0X8D);   //设置电荷泵
	WriteCmd(0X14);   //开启电荷泵
	WriteCmd(0XAF);   //OLED唤醒
}
 
void OLED_OFF(void)  //关闭OLED
{
	WriteCmd(0X8D);   //设置电荷泵
	WriteCmd(0X10);   //关闭电荷泵
	WriteCmd(0XAE);   //关闭OLED
}

其他指令都和其他的一样,可直接复制

### HC32F460 IIC 硬件驱动开发指南 HC32F460 是华大半导体推出的一款基于 ARM Cortex-M4 内核的高性能微控制器,广泛应用于工业控制、消费电子等领域。针对其 IIC (Inter-Integrated Circuit) 硬件驱动开发的需求,以下是详细的说明。 #### 1. IIC 协议基础 IIC 是一种两线制同步串行总线协议,用于短距离通信。它由数据线 SDA 和时钟线 SCL 组成,支持多主设备和多从设备之间的通信[^1]。在 HC32F460 中,IIC 功能通过专用外设模块实现,具体配置需遵循芯片的数据手册和技术文档。 #### 2. HC32F460IIC 外设功能概述 HC32F460 提供了多个独立的 IIC 控制器单元,能够工作于主机模式或从机模式下。这些控制器具有以下特性: - 支持标准模式(100 kbps)、快速模式(400 kbps)以及高速模式(3.4 Mbps)。 - 可编程地址匹配机制,适用于多种从设备场景。 - 自动重传错误处理能力,提升通信可靠性。 #### 3. 配置流程与初始化代码示例 为了启用 IIC 功能并完成基本设置,开发者通常需要执行以下几个操作: ##### (1)使能时钟源 确保目标 IIC 模块对应的时钟被正确开启。例如,在 HC32F460 上可以通过寄存器 `M4_PERIPH_CLOCK_ENABLE` 来激活所需资源。 ```c // 假设使用 IIC1 模块 PERIPHERAL_CLK->ENABLE |= PERIPHERAL_IIC1; ``` ##### (2)GPIO 初始化 将指定引脚分配给 SDA 和 SCL 功能,并将其配置为开漏输出模式以兼容外部上拉电阻电路设计需求。 ```c void GPIO_Init(void){ // 设置 P0_7 作为 SCL, P0_8 作为 SDA PORTA->AFSEL &= ~(PORT_PCR_MUX_MASK << PIN_SDA); PORTA->AFSEL |= (ALT_FUNC_IIC << PIN_SDA); PORTA->PCTL &= ~((PORT_PCR_ODE | PORT_PCR_PE) << PIN_SCL); } ``` ##### (3)参数设定 调整波特率分频因子以及其他高级选项来满足实际应用中的性能指标要求。 ```c struct IIC_Config { uint32_t speed; /* 数据传输速率 */ bool master_mode; /* 主/从角色切换标志位 */ }; /* 示例函数:初始化 IIC 参数 */ bool Init_IIC(struct IIC_Config config){ if(config.master_mode){ // 进入 Master Mode... } // 计算合适的预分频数值 uint16_t prescaler = SystemCoreClock / config.speed; // 将计算结果写回硬件寄存器中 IIC1->CON |= ((prescaler & 0xFF) << PRESCALE_OFFSET); } ``` 以上片段展示了如何利用 C 编程语言构建初始框架结构的一部分内容。 #### 4. 调试技巧与注意事项 当遇到无法正常收发数据的情况时,请检查以下几点: - 是否遗漏了必要的中断服务程序注册过程? - 地址帧格式是否符合对方器件预期定义? 另外值得注意的是,由于不同版本固件库之间可能存在差异性修改点,因此建议始终参照官方发布的最新版《HC32F460 EVB Introduction.pdf》获取权威指导信息。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值