【CH549评测】第3篇 底层驱动软件对比评测-SPI接口LCD驱动
<div class='showpostmsg'> 本帖最后由 yang_alex 于 2019-7-31 14:25 编辑<p>【CH549评测】第3篇 底层驱动软件对比评测-SPI接口LCD驱动 <br />
<br />
关于软件开发环境和相关设置,我在之前的帖子“【CH554评测】第2篇 编译,软件开发环境评测<a href="https://bbs.eeworld.com.cn/thread-567677-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-567677-1-1.html</a>”中说的很详细,感兴趣的网友可以看看。</p>
<p> 在这里我想详细的对比一下CH554和CH549的底层驱动软件,以及相关调试。</p>
<p> 因为后续会用到LCD显示,所以这一贴就先说说后续准备用到的SPI接口的LCD的驱动调试。</p>
<p> 沁恒的SPI接口底层驱动程序写的还是不错的,我这次用的的SPI接口的LCD之前已经在其他芯片上驱动过了,已经有比较完善的驱动程序,只需把SPI接口的驱动程序移植一下就好。实际结果也是这样的。只是重新封装了一下SPI接口的写函数就可以了。</p>
<p> 原来的SPI写函数:</p>
<pre>
<code>static void SPIx_Write(uint16_t Value)
{
*(__IO uint8_t*)&SPI1 -> DR = (uint8_t)Value;
while(SPI1 -> SR & SPI_SR_BSY);
}</code></pre>
<p> CH549上的SPI写函数:</p>
<pre>
<code>unsigned char SPI_RW(unsigned char byte)
{
CH549SPIMasterWrite(byte);
return byte;
}
</code></pre>
<p> 原来的SPI片选和指令和数据选择宏定义:</p>
<pre>
<code>/* Chip Select macro definition */
#define LCD_CS_LOW() GPIOA -> BSRR = GPIO_BSRR_BR_0
#define LCD_CS_HIGH() GPIOA -> BSRR = GPIO_BSRR_BS_0
/* Set WRX High to send data */
#define LCD_CD_LOW() GPIOA -> BSRR = GPIO_BSRR_BR_1
#define LCD_CD_HIGH() GPIOA -> BSRR = GPIO_BSRR_BS_1</code></pre>
<p> CH549上的SPI片选和指令和数据选择宏定义:</p>
<pre>
<code>sbit LCD_CD =P1^3;
sbit LCD_CS =P1^4; </code></pre>
<p> 主程序部分,注意做好SPI接口模式和时钟设置:</p>
<pre>
<code> // 配置SPI //
SPIMasterModeSet(3); //SPI主机模式设置,模式3
SPI_CK_SET(2); //试2分频</code></pre>
<p> 再调用LCD的初始化函数LCD_Init()(这个都不需要修改);</p>
<pre>
<code> LCD_Init();</code></pre>
<p> 移植完成。</p>
<p> 整个过程下来,感觉沁恒CH549的SPI底层驱动写得很好,移植起来很方便。只是以前芯片是ARM Cortex-M3内核,现在改为增强51内核,有些小细节需要注意一下。</p>
<p> 首先,CH549虽然是增强51内核,但毕竟还是51内核。直接可用(直接寻址)的RAM只有128字节,不像许多ARM Cortex-M3内核的MCU,最少也有个4K字节 RAM。好在CH549毕竟是增强51内核,RAM也扩展了2K字节片内 xRAM,不过不能直接寻址,要用的话还需做些设置。</p>
<p> 上图提示地址空间溢出。仔细看可以发现 data = 190.5,而xdata = 0。</p>
<p> 在Keil的项目设置中如下图选择使用扩展的2K字节片内 xRAM:</p>
<p> 再编译就可以发现:</p>
<p> </p>
<p> 此外就是当LCD显示用的字库太大时,也会出现下面错误报警:</p>
<p> 此时,把字库空间定义到程序FLASHRAM中就好了,毕竟有64K不是!</p>
<p> 原来的代码:</p>
<pre>
<code>const unsigned char asc2_1206={
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*" ",0*/
。。。。。。
}; </code></pre>
<p>加关键字<span style="color:#e74c3c;"><strong> code </strong></span></p>
<pre>
<code>code const unsigned char asc2_1206={
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*" ",0*/
。。。。。。。。。。
};</code></pre>
<p>这样,移植就顺利地完成了。看一下效果吧: </p>
<p>这里还要注意一下,不同的MCU配合LCD时,提取字模的顺序可能不同。在CH549上配合ILI9341驱动的LCD,顺序如下图:</p>
<p> </p>
<p>接下来显示一下我做的初步测试界面:</p>
<p>白色底:</p>
<p></p>
<p>黑色底:</p>
<p>实际效果感觉黑色更好一些。</p>
<p>感觉整个过程要数字模最花时间了。</p>
<p> </p>
</div><script> var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;" style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
if(parseInt(discuz_uid)==0){
(function($){
var postHeight = getTextHeight(400);
$(".showpostmsg").html($(".showpostmsg").html());
$(".showpostmsg").after(loginstr);
$(".showpostmsg").css({height:postHeight,overflow:"hidden"});
})(jQuery);
} </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script> <p>干货收藏!<img height="50" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/onion/Onion--112.gif" width="50" /></p>
<p>感谢分享,学习啦,收藏一下备用<img height="50" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/onion/Onion--112.gif" width="50" /></p>
页:
[1]