打印
[APM32E0]

【APM32E030R Micro-EVB开发板评测】+光照传感器与oled显示

[复制链接]
235|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wuyu40|  楼主 | 2025-7-29 19:02 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 wuyu40 于 2025-7-29 19:06 编辑

 极海APM32E030R芯片是32 位 Arm®Cortex®-M0+内核,最高工作频率:72MHz,Flash 存储器:64KB,SRAM 存储器:8KB
开发方式如下:
1)连接 H2/H3 或 H4/H5 可使用板载 Geehy LINK 进行串口调试
2)断开 Geehy LINK 连接后,第三方调试工具可通过 JP1 连接仿真器进行 MCU 烧录调试
3)Type-C(数据通信)直接连接 PC 端进行 MCU 仿真调试
4)使用keil v 5.36编译环境
到官网找到如下文件:

使用的操作系统为win10(GEEHY-LINK(WinUSB)设备不支持在 Windows7 上免驱使用)假定已经安装keil (版本 V5.29 以上),安装Geehy.APM32E030_DFP.1.0.3也就是mcu支持包,阅读用户手册,按照指示连接硬件;该固件基于 CMSIS-DAP V1,会使用 USB 枚举成一个 HID 和 MSC 设备。
使用 USB 线成功连接电脑后,设备管理器上会出现:CMSIS DAP winUSB

在 keil 软件上配置选择使用 SW 模式或者 JTAG 模式。点击“Options for Target” ,在打开的界面中选择“Debug”,然后再选择“CMSIS-DAP Debugger”,如图 :

点击“Settings”按钮进入设置界面,选择 SWD 或者 JTAG 模式以及频率:

完成以上配置之后移植Oled工程,步骤如下:
  复制必要文件到已有工程中,然后在项目管理器中添加OLED相关文件:

添加头文件路径:

按照以下代码将oled的4根线(包含VCC、GND)接到开发板引脚上:
//-----------------OLED端口定义----------------
#define OLED_SCL_Clr()  GPIO_ClearBit(GPIOB, GPIO_PIN_8)  //SCL
#define OLED_SCL_Set() GPIO_SetBit(GPIOB,GPIO_PIN_8)
#define OLED_SDA_Clr() GPIO_ClearBit(GPIOB, GPIO_PIN_9)//DIN
#define OLED_SDA_Set() GPIO_SetBit(GPIOB,GPIO_PIN_9)
修改oled_init函数:
void OLED_Init(void)
{GPIO_Config_T gpioConfig;
    RCM_EnableAHBPeriphClock(RCM_AHB_PERIPH_GPIOB);
    /* LED2 GPIO configuration */
    gpioConfig.pin = GPIO_PIN_8;
    gpioConfig.mode = GPIO_MODE_OUT;
    gpioConfig.outtype = GPIO_OUT_TYPE_PP;
    gpioConfig.speed = GPIO_SPEED_50MHz;
    gpioConfig.pupd = GPIO_PUPD_NO;
    GPIO_Config(GPIOB, &gpioConfig);
    /* LED3 GPIO configuration */
    gpioConfig.pin = GPIO_PIN_9;
    GPIO_Config(GPIOB, &gpioConfig);
//OLED_RES_Clr();
delay_ms(200);
//OLED_RES_Set();
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);//--set start line address  Set Mapping RAM Display Start Line (0x00~0x3F)
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);//--Set SEG/Column Mapping    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);//-set display offsetShift Mapping RAM Counter (0x00~0x3F)
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(0x40,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_WR_Byte(0xA4,OLED_CMD);// Disable Entire Display On (0xa4/0xa5)
OLED_WR_Byte(0xA6,OLED_CMD);// Disable Inverse Display On (0xa6/a7)
OLED_Clear();
OLED_WR_Byte(0xAF,OLED_CMD);
}
其他需要进行头文件和数据类型定义修改,按照报错提示进行;接下来加入ADC转换代码;
使用了PA0引脚输入模拟信号,这个引脚接到光照传感器模拟信号端;
void ADCInit(void)
{GPIO_Config_T gpioConfig;
    ADC_Config_T  adcConfig;
    /* RCM Enable*/
    RCM_EnableAHBPeriphClock(RCM_AHB_PERIPH_GPIOA);
    RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_ADC1);
    RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_SYSCFG);
    /* GPIO Configuration */
    gpioConfig.pin = GPIO_PIN_0;
    gpioConfig.mode = GPIO_MODE_AN;
    gpioConfig.pupd = GPIO_PUPD_PU;
    GPIO_Config(GPIOA, &gpioConfig);
    /* ADC Configuration */
    ADC_Reset();
    ADC_ConfigStructInit(&adcConfig);
    /* Set resolution*/
    adcConfig.resolution = ADC_RESOLUTION_12B;
    /* Set dataAlign*/
    adcConfig.dataAlign  = ADC_DATA_ALIGN_RIGHT;
    /* Set scanDir*/
    adcConfig.scanDir    = ADC_SCAN_DIR_UPWARD;
    /* Set convMode continous*/
    adcConfig.convMode   = ADC_CONVERSION_CONTINUOUS;
    /* Set extTrigConv*/
    adcConfig.extTrigConv  = ADC_EXT_TRIG_CONV_TRG0;
    /* Set TrigEdge*/
    adcConfig.extTrigEdge    = ADC_EXT_TRIG_EDGE_NONE;
    ADC_Config(&adcConfig);
    ADC_ConfigChannel(ADC_CHANNEL_0, ADC_SAMPLE_TIME_239_5);
    /* Enable Interrupt*/
    ADC_EnableInterrupt(ADC_INT_CS);
    NVIC_EnableIRQRequest(ADC1_IRQn, 2);
    /* Calibration*/
    ADC_ReadCalibrationFactor();
    /* Enable ADC*/
    ADC_Enable();}
ADC转换使用了中断进行采集数据,并且在中断函数中调用了以下函数:
void ADC_Isr()
{
    uint32_t adcData = 0;
    uint32_t voltage = 0;
    if (ADC_ReadIntFlag(ADC_INT_FLAG_CS) == SET)
    {
        /* The interrupt flag bit must be cleared first. */
        ADC_ClearIntFlag(ADC_INT_FLAG_CS);
        /* Read ADC Conversion value */
        adcData = ADC_ReadConversionValue();
        /*  voltage(mV) =  adcData * (3300mV / 4095) */
        voltage = (adcData * 3300) / 4095;
  ADC_voltage=voltage;
        /* output to serial port */
      // 设置全局变量用来进行oled显示
    }
}
将光照信号经ADC转换之后在oled上显示,主程序如下:
char adc01[12];
ADCInit();
    /* Wait until ADC is ready */
    while (!ADC_ReadStatusFlag(ADC_FLAG_ADRDY));
    ADC_StartConversion();
OLED_Init();
OLED_ColorTurn(0);
OLED_DisplayTurn(0);
while(1)
{OLED_Refresh();
delay_ms(5000);
OLED_Clear();
sprintf(adc01, "%d", ADC_voltage);
OLED_ShowString(8,16,adc01,16,1);
OLED_ShowString(20,32,"2014/05/01",16,1);
OLED_ShowString(0,48,"ADC:",16,1);  
OLED_ShowString(8,16,str,16,1);
OLED_ShowString(63,48,adc01,16,1);
OLED_Refresh();}
接线图如下:




使用特权

评论回复
沙发
发光的梦| | 2025-7-30 07:07 | 只看该作者
这I2C通讯是使用了GPIO模拟的方式吗?

使用特权

评论回复
板凳
fanzq2005| | 2025-7-30 08:29 | 只看该作者
收到,谢谢分享,大家一起进步!

使用特权

评论回复
地板
wuyu40|  楼主 | 2025-7-30 15:59 | 只看该作者
发光的梦 发表于 2025-7-30 07:07
这I2C通讯是使用了GPIO模拟的方式吗?

是的

使用特权

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

本版积分规则

15

主题

49

帖子

1

粉丝