[活动]

【APM32F107VCT6 MINI测评】OLED液晶显示UASRT接收完整帧数据

[复制链接]
371|15
手机看帖
扫描二维码
随时随地手机跟帖
forgot|  楼主 | 2023-2-14 09:52 | 显示全部楼层 |阅读模式
本帖最后由 forgot 于 2023-2-14 10:13 编辑

评测实现功能:
1、开机液晶显示相关信息:
"Hello Geehy"
"APM32F107_MINI"
"USART_2_OLED"

2、可通过PC端串口发送数据到串口2,通过空闲中断判断完整帧,然后将接收到的完整帧数据显示在0.96寸的OLED液晶屏上。
"USART2_REV:xxxxx",具体内容看图片。

3、接收数据过程中LED闪烁。

开机效果:
FormatFactoryPart1.gif

串口接收显示效果:
FormatFactoryPart2.gif

外设使用情况:
PE6 推挽输出点灯
PA4PA6模拟I2C时序
USART2:接收中断与空闲中断PA2PA3

相关图片:
整体环境搭建
微信截图_20230214091626.png

开机显示:
微信截图_20230214091526.png

串口发送:
微信截图_20230214091700.png

串口接收显示:
微信截图_20230214091551.png
主要部分代码说明:
USART初始化代码:
void USART_Configuration(void)
{
    USART_Config_T USART_ConfigStruct;

    APM_MINI_LEDInit(LED2);

    RCM_EnableAPB2PeriphClock((RCM_APB2_PERIPH_T)(RCM_APB2_PERIPH_GPIOA | RCM_APB2_PERIPH_USART1));
    RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_USART2);

    USART_ConfigStruct.baudRate = 115200;
    USART_ConfigStruct.hardwareFlow = USART_HARDWARE_FLOW_NONE;
    USART_ConfigStruct.mode = USART_MODE_TX_RX;
    USART_ConfigStruct.parity = USART_PARITY_NONE;
    USART_ConfigStruct.stopBits = USART_STOP_BIT_1;
    USART_ConfigStruct.wordLength = USART_WORD_LEN_8B;
//    APM_MINI_COMInit(COM1, &USART_ConfigStruct);
    APM_MINI_COMInit(COM2, &USART_ConfigStruct);

//    USART_EnableInterrupt(USART1, USART_INT_TXBE);
    USART_EnableInterrupt(USART2, USART_INT_RXBNE);
    USART_EnableInterrupt(USART2,USART_INT_IDLE);

//    NVIC_EnableIRQRequest(USART1_IRQn, 2, 0);
    NVIC_EnableIRQRequest(USART2_IRQn, 1, 0);
}

模拟I2C初始化代码:
void IIC_Start()
{
    OLED_SCLK_Set();
    OLED_SDIN_Set();
    MY_Delay(1);
    OLED_SDIN_Clr();
    MY_Delay(1);
    OLED_SCLK_Clr();
    MY_Delay(1);
}


void IIC_Stop()
{
    OLED_SCLK_Set();
    MY_Delay(1);
    OLED_SDIN_Clr();
    MY_Delay(1);
    OLED_SDIN_Set();
    MY_Delay(1);
}


void IIC_Wait_Ack()
{
    OLED_SCLK_Set();
    MY_Delay(1);
    OLED_SCLK_Clr();
    MY_Delay(1);
}


void Write_IIC_Byte(unsigned char IIC_Byte)
{
    unsigned char i;
    unsigned char m,da;
    da=IIC_Byte;
    OLED_SCLK_Clr();
    MY_Delay(1);
    for(i=0; i<8; i++) {
        m=da;
        m=m&0x80;
        if(m==0x80) {
            OLED_SDIN_Set();
        } else
            OLED_SDIN_Clr();
        MY_Delay(1);
        da=da<<1;
        OLED_SCLK_Set();
        MY_Delay(1);
        OLED_SCLK_Clr();
        MY_Delay(1);
    }
}

/*************************************************/

void Write_IIC_Command(unsigned char IIC_Command)
{
    IIC_Start();
    Write_IIC_Byte(0x78);//Slave address,SA0=0
    IIC_Wait_Ack();
    Write_IIC_Byte(0x00);//write command
    IIC_Wait_Ack();
    Write_IIC_Byte(IIC_Command);
    IIC_Wait_Ack();
    IIC_Stop();
}

void Write_IIC_Data(unsigned char IIC_Data)
{
    IIC_Start();
    Write_IIC_Byte(0x78);//D/C#=0; R/W#=0
    IIC_Wait_Ack();
    Write_IIC_Byte(0x40);//write data
    IIC_Wait_Ack();
    Write_IIC_Byte(IIC_Data);
    IIC_Wait_Ack();
    IIC_Stop();
}

void OLED_WR_Byte(unsigned dat,unsigned cmd)
{
    if(cmd)
        Write_IIC_Data(dat);
    else
        Write_IIC_Command(dat);
}

液晶初始化代码:
void OLED_Init(void)
{
        Delay(5000);

        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
}

串口2中断代码:
void USART2_Isr(void)
{
    static u16 us_rlen;

    if(USART_ReadIntFlag(USART2, USART_INT_RXBNE)) {
        usart2_rxBuf[us_rlen++] = (uint8_t)USART_RxData(USART2);
        APM_MINI_LEDToggle(LED2);
    } else if(USART_ReadIntFlag(USART2, USART_INT_IDLE)) {
        if(us_rlen < 100) {
            memcpy(show_buf,usart2_rxBuf,us_rlen);
            show_buf[us_rlen] = '\0';
            us_rlen = 0;
        } else {
            us_rlen = 0;
        }
        USART_RxData(USART2);
    }
}

主程序代码:
int main(void)
{
    //外设初始化
    USART_Configuration();
    OLED_Configuration();
    OLED_Init();

    //全屏亮全屏灭
    OLED_Fill(0xFF);
    Delay(10000);
    OLED_Fill(0x00);
    Delay(10000);

    //开机显示
    OLED_ShowStr(0,0,(unsigned char*)"Hello Geehy",2);
    OLED_ShowStr(0,2,(unsigned char*)"APM32F107_MINI",2);
    OLED_ShowStr(0,4,(unsigned char*)"USART_2_OLED",2);
    Delay(10000000);
    OLED_CLS();
    while (1) {
        //OLED显示串口2接收的数据
        OLED_ShowStr(0,0,(unsigned char*)"USART2_REV:",2);
        OLED_ShowStr(0,2,(unsigned char*)show_buf,2);
        Delay(100);
    }
}

测试总结:
  很早就用过极海的F103片子做过一些产品,之前都是用ST的标准库进行开发直接烧进去的,这是第一次用极海的库来开发测试,感觉在部分功能代码要简洁不少,具体后面再慢慢研究。
  最大的遗憾就是F107的板子居然没有网口,看图片开始还以为那个银白色的电源接口是网口,本来是想着主要测试一下网络部分的,不过也没关系,好在IO都拉出来了,后面弄个模块接上去可以测试一下网络功能,毕竟这个是MINI板。
  厂家的SDK和相关文档做得还是少了一点,部分外设模块的常用功能就没有写相关例程,希望后续还是能够补充起来,这样可以帮助用户提高开发效率,另外我连F107的数据手册在官网都没找到。
  最后祝极海越做越好,祝国产越做越好!


使用特权

评论回复
lihuami| | 2023-3-4 20:39 | 显示全部楼层
可以移植printf到oled上吧。

使用特权

评论回复
sanfuzi| | 2023-3-4 20:59 | 显示全部楼层
可以接收图片吗?              

使用特权

评论回复
评论
forgot 2023-3-5 18:48 回复TA
可以做那个单色图 
1988020566| | 2023-3-5 10:24 | 显示全部楼层
可以移植printf到oled上吧。

使用特权

评论回复
评论
forgot 2023-3-5 18:48 回复TA
可以哦 
mmbs| | 2023-3-7 13:51 | 显示全部楼层
可以接收图片吗?              

使用特权

评论回复
kkzz| | 2023-3-7 19:52 | 显示全部楼层
这个oled最多显示多少的汉字?

使用特权

评论回复
评论
forgot 2023-3-7 21:09 回复TA
要看大小,很大的可以显示两个 
kmzuaz| | 2023-3-7 21:16 | 显示全部楼层
这个汉字字库是怎么做的?              

使用特权

评论回复
评论
forgot 2023-3-8 13:48 回复TA
用点阵工具生成数组,代进去显示就好了 
bestwell| | 2023-3-10 10:01 | 显示全部楼层
怎么实现oled的翻页功能?              

使用特权

评论回复
olivem55arlowe| | 2023-3-10 11:59 | 显示全部楼层
这个oled可以换行的吗?              

使用特权

评论回复
评论
forgot 2023-3-10 13:42 回复TA
可以的,铁子 
pmp| | 2023-3-10 14:14 | 显示全部楼层
可以提高APM32F107VCT6的速率吗?

使用特权

评论回复
minzisc| | 2023-3-10 14:21 | 显示全部楼层
这个驱动oled速度怎么样?              

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1188

主题

10595

帖子

49

粉丝