[AT32F457] 【AT-START-F457测评】+硬件IIC驱动OLED显示

[复制链接]
158|1
wuyu40 发表于 2026-1-26 15:07 | 显示全部楼层 |阅读模式
AT32F455/456/457 系列微控制器内部集成了:32 ARM® Cortex®-M4F 处理器,多个 16 位和 32 位的定时器,
红外线接口 IRTMRDMA 控制器,实时时钟 ERTCSPI 通信接口,I2C 通信接口,USART/UART通信接口,
CAN 总线控制器,外部存储控制器 XMCUSB2.0 OTG 全速接口,HICK 自动时钟校准 ACC12 ADC PVM 模块等外设。
大量的外设和存储器。Cortex®-M4F 处理器支持增强的高效 DSP 指令集,包含扩展的单周期 16/32 位乘法累加器(MAC)、
16 MAC 指令、优化的 8/16 SIMD 运算及饱和运算指令,并且具有单精度(IEEE-754)浮点运算单元(FPU)。
目前 AT32F455/AT32F456/AT32F457 开发板都自带 AT-Link-EZ 调试工具,AT-Link-EZ 如下图左边红框所示,它也可拆开后
单独搭配其他电路板使用,支持 IDE 在线调试、在线烧录、USB 转串口等功能。
736606977123408794.png

AT-START-F457AT32F457ZET7为中心,外设配置LED灯,按钮,一个USB type-C和一个type-A的连接器,一个CANFD接口,
一个以太网RJ45连接器,ArduinoTMUno R3扩展接口,和经由QSPI1扩充的16M字节SPI闪存存储器。此开发板自带嵌入式
调试/烧录工具AT-Link-EZ,不需接入额外开发工具即可对芯片调试使用,并支持AT32 Workbench  ------------
https://www.arterytek.com/cn/support/tools.jsp?index=0图形化配置软件。更多资料请移步雅特力官网,点击AT32F457系列主流型MCU----------https://www.arterytek.com/cn/product/AT32F457.jsp#Resource即可查阅/下载相关资料
    本次测评完成硬件IIC驱动OLED,并显示ADC转换数据;0.96OLED显示屏,该屏有以下特点:
10.96 OLED有黄蓝,白,蓝三种颜色可选;其中黄蓝是屏上1/4部分为黄光,下3/4为蓝;而且是固定区域显示固定颜色,颜色和
显示区域均不能修改
2、分辨率为128*64
3、多种接口方式; OLED裸屏总共种接口包括: 68008080 两种并行接口方式、3线或4线的串行SPI接口方式、IIC 接口方式(只需要
2根线就可以控制OLED!),这五种接口是通过屏上的BSO~BS2来配置的。
4、接口分别为七针的SPI/IIC 兼容模块,四针的IIC模块。


直接使用IIC硬件模块好处是响应速度快,节约CPU资源,使用IIC完成OLED的驱动需要移植OLED底层头文件与C文件放在如下位置:
34856977127403f66.png
C文件与放置位置:
778046977127f13048.png
OLED硬件接线为scl --- pb6sda --- pb7还要接好VCCGND;使用如下代码完成IIC初始化:
void i2c_lowlevel_init(i2c_handle_type* hi2c)
{
  gpio_init_type gpio_init_structure;
  if(hi2c->i2cx == I2Cx_PORT)
  {
    /* i2c periph clock enable */
    crm_periph_clock_enable(I2Cx_CLK, TRUE);
    crm_periph_clock_enable(I2Cx_SCL_GPIO_CLK, TRUE);
    crm_periph_clock_enable(I2Cx_SDA_GPIO_CLK, TRUE);
    /* gpio configuration */
    gpio_pin_mux_config(I2Cx_SCL_GPIO_PORT,I2Cx_SCL_GPIO_PinsSource,I2Cx_SCL_GPIO_MUX);
gpio_pin_mux_config(I2Cx_SDA_GPIO_PORT,I2Cx_SDA_GPIO_PinsSource,I2Cx_SDA_GPIO_MUX);
    /* configure i2c pins: scl */
    gpio_init_structure.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
    gpio_init_structure.gpio_mode           = GPIO_MODE_MUX;
    gpio_init_structure.gpio_out_type       = GPIO_OUTPUT_OPEN_DRAIN;
    gpio_init_structure.gpio_pull           = GPIO_PULL_UP;
    gpio_init_structure.gpio_pins           = I2Cx_SCL_GPIO_PIN;
    gpio_init(I2Cx_SCL_GPIO_PORT, &gpio_init_structure);
    /* configure i2c pins: sda */
    gpio_init_structure.gpio_pins           = I2Cx_SDA_GPIO_PIN;
    gpio_init(I2Cx_SDA_GPIO_PORT, &gpio_init_structure);
    /* config i2c */
    i2c_init(hi2c->i2cx, 0x0F, I2Cx_CLKCTRL);
    i2c_own_address1_set(hi2c->i2cx, I2C_ADDRESS_MODE_7BIT, I2Cx_ADDRESS);
  }
}
设置IIC7位地址模式,对象地址为:
#define I2Cx_ADDRESS       0x78
修改IIC写数据函数:
void OLED_WR_Byte(u8 dat,u8 mode)
{   uint8_t tx_buf[2] = {0x00, 0x00};
        i2c_handle_type hi2cx;
        hi2cx.i2cx =I2C1;
        if(mode)tx_buf[0]=0x40;
           else tx_buf[0]=0x00;
    tx_buf[1]=dat;        
        i2c_master_transmit(&hi2cx,OLED_ADDRESS,tx_buf,2,0xFFFFFFF);}
修改OLED初始化函数:
void OLED_Init(void)
{  i2c_handle_type hi2cx;
hi2cx.i2cx =I2C1;
   i2c_config(&hi2cx);
        
        OLED_WR_Byte(0xAE,OLED_CMD);//--turn off oled panel
        OLED_WR_Byte(0x00,OLED_CMD);//---set low column address
        OLED_WR_Byte(0x10,OLED_CMD);//---set high column address
        OLED_WR_Byte(0x40,OLED_CMD);
         OLED_WR_Byte(0x81,OLED_CMD);//--set contrast control register
        OLED_WR_Byte(0xCF,OLED_CMD);// Set SEG Output Current Brightness
        OLED_WR_Byte(0xA1,OLED_CMD);//
        OLED_WR_Byte(0xC8,OLED_CMD);//Set COM/Row Scan Direction   
        OLED_WR_Byte(0xA6,OLED_CMD);//--set normal display
        OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)
        OLED_WR_Byte(0x3f,OLED_CMD);//--1/64 duty
        OLED_WR_Byte(0xD3,OLED_CMD);
        OLED_WR_Byte(0x00,OLED_CMD);//-not offset
        OLED_WR_Byte(0xd5,OLED_CMD);//--set display clock divide ratio/oscillator frequency
        OLED_WR_Byte(0x80,OLED_CMD);//--set divide ratio, Set Clock as 100 Frames/Sec
        OLED_WR_Byte(0xD9,OLED_CMD);//--set pre-charge period
        OLED_WR_Byte(0xF1,OLED_CMD);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
        OLED_WR_Byte(0xDA,OLED_CMD);//--set com pins hardware configuration
        OLED_WR_Byte(0x12,OLED_CMD);
        OLED_WR_Byte(0xDB,OLED_CMD);//--set vcomh
        OLED_WR_Byte(0x30,OLED_CMD);//Set VCOM Deselect Level
        OLED_WR_Byte(0x20,OLED_CMD);//-Set Page Addressing Mode (0x00/0x01/0x02)
        OLED_WR_Byte(0x02,OLED_CMD);//
        OLED_WR_Byte(0x8D,OLED_CMD);//--set Charge Pump enable/disable
        OLED_WR_Byte(0x14,OLED_CMD);//--set(0x10) disable
        OLED_Clear();
        OLED_WR_Byte(0xAF,OLED_CMD);}
main中调用如下:
hi2cx.i2cx = I2Cx_PORT;
  i2c_config(&hi2cx);
        OLED_Init();
        OLED_DisPlay_On();
  while(1)
  {     OLED_ShowChinese(0,0,0,16,1);//?
                OLED_ShowChinese(18,0,1,16,1);//?
                OLED_ShowChinese(36,0,2,16,1);//?
                OLED_ShowChinese(54,0,3,16,1);//?
                OLED_ShowChinese(72,0,4,16,1);//?
                OLED_ShowChinese(90,0,5,16,1);//?
                OLED_ShowChinese(108,0,6,16,1);//?
                OLED_ShowString(8,16,"ZHONGJINGYUAN",16,1);
                OLED_ShowString(20,32,"2014/05/01",16,1);
                OLED_ShowNum(0,48,adc1_ordinary_valuetab[0],12,16,1);
                OLED_Refresh();}
实验结果如下:
616586977129764353.png
































LightCatcher 发表于 2026-1-28 07:22 | 显示全部楼层
中景园是你的公司名字么?可以顺带把地球号或者企鹅号一起么,打个广告。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

38

主题

173

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部
0