AT32F455/456/457 系列微控制器内部集成了:32 位 ARM® Cortex®-M4F 处理器,多个 16 位和 32 位的定时器,
红外线接口 IRTMR,DMA 控制器,实时时钟 ERTC,SPI 通信接口,I2C 通信接口,USART/UART通信接口,
CAN 总线控制器,外部存储控制器 XMC,USB2.0 OTG 全速接口,HICK 自动时钟校准 ACC,12 位 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 转串口等功能。
AT-START-F457以AT32F457ZET7为中心,外设配置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.96寸OLED显示屏,该屏有以下特点:
1、0.96 寸OLED有黄蓝,白,蓝三种颜色可选;其中黄蓝是屏上1/4部分为黄光,下3/4为蓝;而且是固定区域显示固定颜色,颜色和
显示区域均不能修改
2、分辨率为128*64
3、多种接口方式; OLED裸屏总共种接口包括: 6800、8080 两种并行接口方式、3线或4线的串行SPI接口方式、IIC 接口方式(只需要
2根线就可以控制OLED了!),这五种接口是通过屏上的BSO~BS2来配置的。
4、接口分别为七针的SPI/IIC 兼容模块,四针的IIC模块。
直接使用IIC硬件模块好处是响应速度快,节约CPU资源,使用IIC完成OLED的驱动需要移植OLED底层头文件与C文件放在如下位置:
C文件与放置位置:
OLED硬件接线为scl --- pb6,sda --- pb7还要接好VCC和GND;使用如下代码完成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);
}
}
设置IIC为7位地址模式,对象地址为:
#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();}
实验结果如下:
|
|