本帖最后由 suncat0504 于 2023-10-27 10:22 编辑
#申请原创#
本次评测准备以两种方式测试OLED显示屏的显示刷新速度。一种是非DMA方式传递显示数据,一种是以DMA方式喜欢滴显示数据。作为另一个对比,一个是采用片内IIC外设方式处理显示,另一个是以IO口模拟方式。OLED使用常见的那种0.96英寸的128*64点阵的OLED。为了搭建整个测试工程,我们先一步一步来,先建立一个能产生1秒中断的工程。依旧使用雅特力的Work Bench来创建基于雅特力IDE的工程。
首先我们使用IO模拟IIC、非DMA方式,来处理OLED的显示。根据芯片的封装,
使用PC2和PC3来模拟IIC通讯,在这两个IO口的旁边是I2C3外设,方便以后作为对比用。PC2模拟SCL,PC3模拟SDA。由于IIC设备中SDA是开漏设计,连接线路的时候需要上拉电阻,所以PC3口和PC2口一样,都设计为设计为上拉电阻模式。PD13是用来驱动板载LED2用的IO口。
为了测试刷新速度,需要加入定时器。通过定时器中断获取1秒的计时单位,统计刷新OLED显示的次数,来计算刷新速度。因此需要实现定时器1的溢出中断。
使用Work Bench配置定时器1的设置时,还是摸索着弄,对不对也不知道。边学习边上吧。有错了,后面再改好了。
为了能及时反馈中间的处理信息,加上串口输出,也很有必要。因此再加上一个串口,并配置串口中断功能。
因为是需要发送,不处理接收。因此只设置TXD,使用PA9。设置已经完成,生成工程代码。
确定,生成工程代码。
然后使用雅特力的IDE导入这个工程。
在代码总加了一个全局标志变量gi_flag_1s,用来检查是否发生了秒中断。当秒中断发生时,翻转LED显示,因此这个LED的闪烁周期应该是两秒。
在生成的的代码中,在at32f423_wk_config.c文件中的wk_tmr1_init函数中在tmr_counter_enable处理代码的后面要加一行代码:
tmr_interrupt_enable(TMR1, TMR_OVF_INT, TRUE);
这行代码的作用,如函数名所示,是启动定时器1的溢出中断。没有这行代码,你的程序启动起来,定时器不会发生中断。
在中断处理函数TMR1_OVF_TMR10_IRQHandler中,追加以下代码: if(tmr_flag_get(TMR1, TMR_OVF_FLAG) == SET) {
gi_flag_1s = 1;
// 清除溢出标志
tmr_flag_clear(TMR1, TMR_OVF_FLAG);
}
这段代码的作用是,在定时器产生了溢出中断时,建立1秒钟中断发生标志。为什么是一秒呢,因为我们在最初设计的时候,通过Work Bench已经设置好了参数,在初始化设置代码
tmr_base_init(TMR1, 14999, 9999);
中也能看到这个设置。
为了验证秒中断是否能发生,在main.c中的主循环处理中,我们加入以下代码:if (gi_flag_1s) {
// 发生了1秒中断,清除标志,翻转LED2
gi_flag_1s = 0;
gpio_bits_toggle(LED_PIN_GPIO_PORT, LED_PIN_PIN);
}
现在我们可以测试一下了。用USB电缆连接好电脑和开发板,建立程序运行设置(具体步骤可以参照我之前发过的用Work Bench建立ATIDE工程的那个帖子)
点击“RUN”。好了,现在我们可以欣赏LED以2秒周期的频率闪烁了。该说不说,使用Work Bench设置定时器,改变参数,可以直接看到计算结果,实在是太方便了。而且是中文界面,这可比看示例代码中的英文注释简单多了。
到这里,定时器的准备工作完成,下一步我们把OLED的相关处理代码移植进工程中,进行测试。
|