注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题

lyzhangxiang的个人空间 http://home.eeworld.com.cn/space-uid-252424.html [收藏] [复制] [分享] [RSS]

日志

【R7F0C809】VGA-Gen 一些小结

已有 1129 次阅读2015-11-7 10:46

这个小玩意,一拖再拖,周末打算捡起来搞一下,发现没有示波器根本不行啊,信号看不到,没法trim也就没能继续了。但是还是要发个帖子把产出的一些代码和思路分享给大家,有板子的可以尝试一下,在我看来还是蛮有趣的,比较硬件很简单,只需要一个VGA的DB接口+一颗电阻就行了,电路上就连接三根线,尽量简化设计吧,毕竟这玩意很小。

我原本计划是做出一个UART2VGA的小板子,可以和MSP430-LaunchPad或者Arduino使用的这种小板子,当然了Arduino是有一款这种扩展板子的叫GD吧应该是了。可惜由于没有工具,也不好意思把这种业余的爱好带到公司去调试,所以这是我一直搁浅的原因,我想明年是应该入手一款示波器或者逻辑分析仪之类的小工具了,或者自己DIY一个也是蛮有用处的,看来计划的事情不少。
在写代码之初我尝试画了个草图,很多年没画过图了,很简单的一个图,就连一些接口都没有画上去,仅仅是必要的图。

图1.UART2VGA子板图

基本上就这了,看起来还真清爽,后面附件中提供了源文件大家有兴趣的可以下载继续把这个事情做结束。当然如果这个事情做成了我想瑞萨应该也是蛮高兴的,很可惜没有好的工具真的有点为难。


好继续说说软件上的设计思路,如何用资源紧凑的MCU产生VGA信号,参考老外TinyVGA的一些思路。先给大家说说我理解的VGA信号,这个是一个数字+模拟的混合信号,RGB是模拟信号这个有三路输出Singal。其次是VSYNC帧同步和HSYNC行同步信号,这两个信号至关重要,整个VGA信号的时序由他们控制。RGB信号受他们的约束,所以一般很少会提到RGB的速率是多少,因为这个是受屏幕分辨率和刷新频率的约束,而这些都是由行同步信号和帧同步信号决定的。从感官上理解分辨率低的情况下再时序要求的时间内传输的数据必然要比分辨率高的要少很多,可能大家用MCU驱动小尺寸的液晶屏有这种体会,基本上MCU搞定2.4/3.2/4.3寸这种屏幕还是蛮简单的如果要驱动7寸以上基本上望尘莫及了,不好发挥。其实这里分辨率的道理是一样的,只不过VGA给我们封装了一层不需要直接去操作屏幕/液晶的时序,而仅仅关心VGA的时序就好了,当然VGA可以用这么长的线就知道他肯定有他特别之处,这么长的线特别高的频率自然是不行了,干扰太严重,所以频率不高的,这一点大家要认识清楚,关于信号采用模拟的方式传输,减少干扰,因为这正是VGA显示的价值所在。


其实这些设计理念都是相通的,VGA这种模拟+数字的方式被工业领域很多通信借鉴,同样还是显示中的LVDS依然如此,当然他的层次更高,差分信号设计等。当然还有很多类似的这种设计,比如传感器变送,为何是模拟信号,这里我不是很了解,仅仅是想到了就写出来了,不太清楚这个行业,应该也是这个道理吧。好像闲话扯得有点多了,回归正题吧。


了解了这些我们再来分析如何去在这种资源性能不是那么强的MCU上去规划VGA产生的软件该如何设计,首先选择分辨率低一点刷新频率够用的这种显示器模式,一般VGA显示器默认的分辨率是640*480@60Hz,这个是工业场合的一个标准,基本上都是符合的。关于刷新频率这个一般60-70Hz,基本上高于50Hz就够了,这个概念不在做解释了。开始规划了,这里RGB三基色的理论也不在细说了,如果是彩色的话需要这三个模拟信号的叠加,什么多少色就是这里体现的分辨能力了。我采用RGB(0,0,0)和RGB(255,255,255)这两种就好了,毕竟想让MCU同时产生三个高速的信号还是蛮吃力的,这样的话RGB就同步了,我只需要把这三根信号线连在一起,仅仅需要MCU一个输出作为VGA的实际数据了,这里当做数字信号处理即可两种状态0和1就行了实际的RGB信号是模拟的应该是1.xx伏的这样的电平吧,当然工业领域的设计是兼容的5v也会被认为是最大模拟值理解为255即可了。这里产生一个高速的0/1信号有很多方式,可以模拟也可以借助定时器等,这里tinyVGA的方式比较巧妙,采用SPI的输出引脚作为VGA数据产生,也就是我上面分析的单根0/1数据线了。采用SPI的好处是数据可以借助SPI的REG直接填充,时钟也方便控制。很可惜的是瑞萨R7F0C809的SPI主机时钟最大只能20Mhz四分频,也就是5Mhz这个有点低了,要是高一些VGA的显示区域可以做的更大,这个就是前面提到的VGA速率问题,这个是受你显示的区域约束的,分辨率和区域,大家好好体会,不多说了。行同步和帧同步也不多说了,采用IO模拟是最方便的,这两个基本上速率不是太高一个是60Hz(16.666ms)另外一个受分辨率影响的更高一些的频率,我们这里是31.77us=16.666,ms / 525,这里的525=480+45。


所以行信号的频率是31.77us这个对瑞萨R7F0C809还是蛮有挑战的,前期调研的时候注意看MCU的定时器最大时钟是否符合,还有就是SPI的速率是否符合,满足这两点的MCU都可以驱动VGA显示器了。看了一下定时器最大时钟可以到20Mhz所以31,77us的时序还是很好控制的,剩下的就是代码了,关于代码我想直接贴上来大家看注释吧,后面的附件中也会有完整的工程给大家,有兴趣的可以玩起来了。当然移植到其他的MCU也还是蛮方便的一些外设初始化和相关的宏定义修改一下就可以了。关于程序中的symbal_tab.h头文件我也不是很理解,参考tinyVGA的,应该就是一些数据表而已,用户可以修改。一共三个文件,看起来比较清爽main.c / main.h / symbal_tab.h。


头文件和全局变量
  1. /*! ----------------------------------------------------------------------------
  2. *         @file               main.c
  3. *         @author             camel.shoko
  4. *         @version            v1.0
  5. *         @date               2015/09/02
  6. *         @brief              R7F0C809 VGA驱动信号
  7. *         @copyright          camel.shoko@gmail.com
  8. */

  9. /*! ------------------------------------------------------------------------- */
  10. #pragma interrupt INTTM00 TAU0_CH0_Handler


  11. /* Include ------------------------------------------------------------------ */
  12. #include "main.h"
  13. #include
  14. #include
  15. #include "symbol_tbl.h"


  16. /* Defines ------------------------------------------------------------------ */

  17. /**
  18. * VGA-LINE数量
  19. * 每行符号数量
  20. * 每场符号数量
  21. * RENDER符号高度
  22. */
  23. #define VGA_FIELD_LINE_COUNT                         525                
  24. #define VGA_SYMBOLS_PER_ROW                                12                  
  25. #define VGA_ROW_COUNT                                        20         
  26. #define SYMBOL_HEIGHT                                        24                 

  27. #define VGA_SIZE                                                (VGA_SYMBOLS_PER_ROW*VGA_ROW_COUNT+1)


  28. /* Macros ------------------------------------------------------------------- */
  29. #define VIDEO_OFF()                                          VGA_VIDEO_INPUT()
  30. #define VIDEO_ON()                                          VGA_VIDEO_OUTPUT()

  31. #define HSYNC_OFF()                                         VGA_HSYNC_OUT_HIGH()
  32. #define HSYNC_ON()                                          VGA_HSYNC_OUT_LOWL()

  33. #define VSYNC_OFF()                                          HSYNC_ON();VGA_VSYNC_OUT_HIGH()
  34. #define VSYNC_ON()                                           HSYNC_ON();VGA_VSYNC_OUT_LOWL()


  35. /* Local Variable ----------------------------------------------------------- */
  36. const                 char                                                 str1[] =   "  Text VGA";
  37. const                 char                                                 str2[] =   "User hanlder";
  38. const                 char                                                 str3[] =   "KEY.is= ";
  39. const                 char                                                 str4[] =   "Time is:";


  40. volatile         unsigned char                                 video_en_flg;
  41. volatile         unsigned char                                 raw_render;
  42. volatile         unsigned int                                 linecount;
  43. volatile         unsigned char                                 y_line_render;
  44. volatile         unsigned int                                 frametime;
  45. volatile         unsigned int                                 framecount;       
  46. volatile         unsigned char                                 str_array[VGA_SIZE];
复制代码


定时器的三个函数
  1. /* Local Function ----------------------------------------------------------- */

  2. /**
  3. * @brief  VGA_Timer_Init
  4. * @note   VGA时钟初始化
  5. * @param  none
  6. * @retval none
  7. */
  8. void
  9. VGA_Timer_Init(void)
  10. {
  11.         /**
  12.          * 提供输入时钟
  13.          * 能读写定时阵列单元SFR
  14.          */
  15.     TAU0EN         = 1U;  
  16.        
  17.         /**
  18.          * 定时器时钟选择
  19.          * 选择fCLK = 20MHz
  20.          */       
  21.     TPS0           = TPS0 & 0x00U;       
  22.        
  23.         /**
  24.          * 标记TAU0通道中断
  25.          */       
  26.     TT0            = TT0 | 0x0FU;
  27.        
  28.         /**
  29.          * 禁止INTTM00中断         
  30.          */       
  31.     TMMK00         = 1U;   
  32.        
  33.         /**
  34.          * 清除INTTM00中断标志
  35.          */       
  36.     TMIF00         = 0U;               
  37.    
  38.     /**
  39.          * 设置INTTM00高优先级
  40.          * 00优先级最高,11优先级最低
  41.          */
  42.     TMPR100 = 0U;
  43.     TMPR000 = 0U;
  44.    
  45.     /**
  46.          * CH0作为间隔定时器
  47.          * 递减计数模式
  48.          */
  49.     TMR00H         = 0x00U;
  50.     TMR00L         = 0x00U;
  51.    
  52.         /**
  53.          * REG = ((fCLK * Tus) / 1000000us) - 1
  54.          * 1微秒示例: ((20000000Hz * 1us) / 1000000us) - 1 = 19
  55.          */
  56.     TDR00H         = TAU0_CH0_TDR00H;
  57.     TDR00L         = TAU0_CH0_TDR00L;
  58.     TO0         = TO0  & 0x0EU;
  59.     TOE0         = TOE0 | 0x01U;
  60. }


  61. /**
  62. * @brief  TAU0_CH0_Start
  63. * @note   TAU0启动
  64. * @param  none
  65. * @retval none
  66. */
  67. void
  68. TAU0_CH0_Start(void)
  69. {
  70.         /**
  71.          * 清除INTTM00中断标志
  72.          * 使能INTTM00中断
  73.          */       
  74.     TMIF00         = 0U;
  75.     TMMK00         = 0U;
  76.     TS0         = TS0 | 0x01U;
  77. }


  78. /**
  79. * @brief  TAU0_CH0_Stopd
  80. * @note   TAU0停止
  81. * @param  none
  82. * @retval none
  83. */
  84. void
  85. TAU0_CH0_Stopd(void)
  86. {
  87.     TT0         = TT0 | 0x01U;
  88.        
  89.         /**
  90.          * 禁止INTTM00中断
  91.          * 清除INTTM00中断标志  
  92.          */       
  93.     TMMK00         = 1U;
  94.     TMIF00         = 0U;
  95. }
复制代码
VGA信号的函数,SPI相关
  1. /**
  2. * @brief  VGA_SINGAL_Init
  3. * @note   VGA信号初始化
  4. * @param  none
  5. * @retval none
  6. */
  7. void
  8. VGA_SINGAL_Init(void)
  9. {
  10.         /**
  11.          * 允许提供运行时钟
  12.          * 能读写CSI00串行阵列的SFR
  13.          * 选择CSI00串行来源时钟20MHz,后面会继续分频
  14.          */
  15.         SAU0EN                 = 1U;
  16.     NOP(); NOP(); NOP(); NOP();
  17.     SPS0                 = 0x00U;
  18.        
  19.         /**
  20.          * 禁止CSI00
  21.          * 禁止INTCSI00中断
  22.          * 清除INTCSI00中断标志
  23.          */
  24.         ST0                 = ST0 | 0x01U;
  25.     CSIMK00         = 1U;
  26.     CSIIF00         = 0U;
  27.        
  28.     /**
  29.          * 设置INTTM00低优先级
  30.          * 00优先级最高,11优先级最低
  31.          */
  32.     CSIPR100         = 0U;
  33.     CSIPR000         = 0U;
  34.        
  35.         /**
  36.          * 清除错误标志
  37.          */
  38.     SIR00                = 0x03U;   
  39.        
  40.         /**
  41.          * 运行时钟CK00,来自fCLK分频
  42.          * CSI模式,传送结束中断
  43.          */
  44.     SMR00H                 = 0x00U;
  45.     SMR00L                 = 0x20U;
  46.        
  47.         /**
  48.          * 只发送,相位级性00
  49.          * MSB优先,8位数据长度
  50.          */
  51.     SCR00H                 = 0x80U;
  52.     SCR00L                 = 0x07U;
  53.        
  54.         /**
  55.          * 4分频=20MHz/4=5MHz
  56.          * SDR00L寄存器SIO00
  57.          */
  58.     SDR00H                 = 0x03U;
  59.     SDR00L                 = 0x00U;
  60.        
  61.         /**
  62.          * CSI00-CK初始电平
  63.          * CSI00-SO初始电平
  64.          * 使能CSI00输出
  65.          */
  66.     CKO0                 = CKO0 | 0x01U;
  67.     SO0                 = SO0  & 0xFEU;
  68.     SOE0                 = SOE0 | 0x01U;
  69.        
  70.         /**
  71.          * 设置SI00引脚
  72.          */
  73.     PMC0                 = PMC0 & 0x7FU;
  74.     PM0                 = PM0  | 0x80U;
  75.        
  76.         /**
  77.          * 设置SO00引脚
  78.          */
  79.     P0                         = P0   | 0x40U;
  80.     PM0                        = PM0  & 0xBFU;
  81.        
  82.     /**
  83.          * 设置SLK00引脚
  84.          */
  85.     PMC1                 = PMC1 & 0xFEU;
  86.     P1                         = P1   | 0x01U;
  87.     PM1                 = PM1  & 0xFEU;
  88. }


  89. /**
  90. * @brief  CSI00_Transmit
  91. * @note   CSI00发送
  92. * @param  none
  93. * @retval none
  94. */
  95. void
  96. CSI00_Transmit(uint8_t txData)
  97. {
  98.         while (SSR00&BIT5);
  99.         SIO00 = txData;
  100. }


  101. /**
  102. * @brief  CSI00_Start
  103. * @note   CSI00启动
  104. * @param  none
  105. * @retval none
  106. */
  107. void
  108. CSI00_Start(void)
  109. {
  110.         /**
  111.          * 清除INTCSI00中断标志
  112.          * 禁止INTCSI00中断
  113.          * CSI00时钟初始水平
  114.          * CSI00 SO初始水平
  115.          * 使能CSI00输出
  116.          * 使能CSI00
  117.          */
  118.     CSIIF00         = 0U;   
  119.     CSIMK00         = 1U;                   
  120.     CKO0                 = CKO0 | 0x01U;   
  121.     SO0                 = SO0  & 0xFEU;       
  122.     SOE0                 = SOE0 | 0x01U;
  123.     SS0                 = SS0  | 0x01U;
  124. }


  125. /**
  126. * @brief  CSI00_Stopd
  127. * @note   CSI00停止
  128. * @param  none
  129. * @retval none
  130. */
  131. void
  132. CSI00_Stopd(void)
  133. {
  134.         /**
  135.          * 禁止CSI00
  136.          * 禁止CSI00输出
  137.          * 禁止INTCSI00中断
  138.          * 清除INTCSI00中断标志
  139.          */
  140.     ST0                 = ST0  | 0x01U;
  141.     SOE0                 = SOE0 & 0xFEU;       
  142.     CSIMK00         = 1U;
  143.     CSIIF00         = 0U;
  144. }
复制代码


VGA行信号帧同步初始化
  1. /**
  2. * @brief  VGA_SYNC_Init
  3. * @note   VGA同步初始化
  4. * @param  none
  5. * @retval none
  6. */
  7. void
  8. VGA_SYNC_Init(void)
  9. {
  10.         PU0 = BIT4 | BIT2;
  11.        
  12.         /**
  13.          * 端口配置流程:
  14.          * 1)配置为模拟(模拟仅可输出)或数字
  15.          * 2)配置为普通输出或PN_MOS输出
  16.          * 3)配置为输入或输出模式(输出之前建议配置输出电平)
  17.          */
  18.         VGA_HSYNC_DIGITAL();
  19.         VGA_HSYNC_NORMAL_OUTPUT();
  20.         VGA_HSYNC_OUT_HIGH();
  21.         VGA_HSYNC_OUTPUT();
  22.        
  23.         VGA_VSYNC_DIGITAL();
  24.         VGA_VSYNC_NORMAL_OUTPUT();
  25.         VGA_VSYNC_OUT_HIGH();
  26.         VGA_VSYNC_OUTPUT();

  27. }


  28. /**
  29. * @brief  Display_Byte
  30. * @note   显示字节数据
  31. * @param  none
  32. * @retval none
  33. */
  34. void
  35. Display_Byte (unsigned int byte)
  36. {
  37.         signed   char i;
  38.         unsigned char t,n;
  39.        
  40.         n = VGA_SYMBOLS_PER_ROW*5 + 8;
  41.         str_array[n++] = '0';
  42.         str_array[n++] = 'x';
  43.        
  44.         for (i = 3; i >= 0; i--) {
  45.                 t = (byte >> (i * 4)) & 0x0F;

  46.                 if (t > 0x09) {
  47.                         t += 0x37;
  48.                 } else {
  49.                         t += 0x30;
  50.                 }
  51.                 str_array[n++] = t;
  52.         }
  53. }
复制代码
定时器中断,很重要的时序逻辑
  1. /**
  2. * @brief  TAU0_CH0_Handler
  3. * @note   INTTM00中断处理
  4. * @param  none
  5. * @retval none
  6. */
  7. __interrupt void
  8. TAU0_CH0_Handler(void)
  9. {
  10.         /**
  11.          * 清除标志,重装计数
  12.          */
  13.     TMIF00         = 0x00;
  14.         TDR00H         = TAU0_CH0_TDR00H;
  15.     TDR00L         = TAU0_CH0_TDR00L;       

  16.        
  17.         /*! -----------------Syncronization Handler ----------------------------- */
  18.        
  19.         /**
  20.          * 记录列数量
  21.          */
  22.         if (++linecount == VGA_FIELD_LINE_COUNT) {
  23.                 linecount                 = 0;
  24.                
  25.                 /**
  26.                  * 清除RENDER显存指针
  27.                  */
  28.                 raw_render                 = 0;
  29.                 y_line_render         = 0;
  30.         }

  31.         /**
  32.          * 确保VSYNC长度两倍VGA列  
  33.          */
  34.         if ((linecount == 10 ) || (linecount == 11 )) {
  35.                 VSYNC_ON();
  36.         } else {
  37.                 VSYNC_OFF();
  38.         }

  39.         video_en_flg = TRUE;

  40.         if (linecount < 45) {
  41.                 video_en_flg = FALSE;
  42.                
  43.                 /**
  44.                  * 添加此处延时
  45.                  * 避免显示顶部闪烁
  46.                  */
  47.                 NOP(); NOP(); NOP(); NOP();
  48.                 NOP(); NOP(); NOP(); NOP();
  49.                 NOP(); NOP(); NOP(); NOP();
  50.                 NOP(); NOP(); NOP(); NOP();       
  51.         } else {
  52.                 if (++y_line_render == SYMBOL_HEIGHT) {
  53.                         raw_render++;
  54.                         y_line_render = 0;
  55.                 }  else {
  56.                         NOP(); NOP(); NOP(); NOP();
  57.                         NOP(); NOP(); NOP(); NOP();
  58.                 }
  59.         }
  60.        
  61.         HSYNC_OFF();
  62.        
  63.         /*! -----------------Syncronization Handler ----------------------------- */

  64. }
复制代码


主逻辑函数
  1. /* Global Function ---------------------------------------------------------- */

  2. /**
  3. * @brief  main
  4. * @note   主程序
  5. * @param  none
  6. * @retval none
  7. */
  8. void
  9. main(void)
  10. {   
  11.         unsigned char         i;
  12.         char *                         _ptrA;
  13.         const char *         _ptrB;

  14.         /**
  15.          * 用启动字符串初始化显存
  16.          * 注意启动字符串在显存中对应的行位置
  17.          */
  18.         strcpy(&str_array[VGA_SYMBOLS_PER_ROW*18], &str1[0]);        
  19.         strcpy(&str_array[VGA_SYMBOLS_PER_ROW*19], &str2[0]);        
  20.         strcpy(&str_array[VGA_SYMBOLS_PER_ROW*0 ], &str3[0]);        
  21.         strcpy(&str_array[VGA_SYMBOLS_PER_ROW*5 ], &str4[0]);
  22.        
  23.        
  24.         DI();
  25.        
  26.         /**
  27.          * 使能内部低速RC
  28.          * 配置主时钟为20MHz
  29.          */       
  30.         OSMC                 = 0x10U;
  31.     HOCODIV         = 0x01U;
  32.        
  33.         VGA_SYNC_Init();
  34.         VGA_Timer_Init();
  35.         VGA_SINGAL_Init();
  36.        
  37.         CSI00_Start();
  38.         TAU0_CH0_Start();
  39.        
  40.         EI();
  41.        
  42.         for(;;) {

  43.                 if (video_en_flg) {
  44.                
  45.                         _ptrA = &str_array[raw_render * VGA_SYMBOLS_PER_ROW];
  46.                         _ptrB = &symbol[0][y_line_render >> 1];

  47.                         /**
  48.                          * RENDER行周期
  49.                          */
  50.                         i = VGA_SYMBOLS_PER_ROW;
  51.                         while (i--) {
  52.                                 CSI00_Transmit((uint8_t)(_ptrB + (*_ptrA++)*SYMBOL_HEIGHT/2));
  53.                                 VIDEO_ON();
  54.                                 NOP(); NOP();
  55.                         }
  56.                        
  57.                         /**
  58.                          * 延时画最后一个符号
  59.                          */
  60.                         NOP(); NOP(); NOP();
  61.                         NOP(); NOP(); NOP();
  62.                         VIDEO_OFF();
  63.                 } else {
  64.                
  65.                         /*! ---------------Users handlers example ----------------------- */
  66.                         framecount++;
  67.                         if (KEY_SINGAL_IN_READ()) {
  68.                                 str_array[7] = '1';
  69.                         } else {
  70.                                 str_array[7] = '0';
  71.                         }

  72.                         if (framecount == 0x80) {
  73.                                 framecount = 0;
  74.                                 Display_Byte(frametime++);
  75.                         }
  76.                         /*! ---------------Users handlers example ----------------------- */
  77.                 }
  78.         }
  79. }


  80. /*----------------- (C) COPYRIGHT 2015 CAMEL.SHOKO ---------- END OF FILE ----*/
复制代码


main.h头文件
  1. /*! ----------------------------------------------------------------------------
  2. *         @file               main.h
  3. *         @author             camel.shoko
  4. *         @version            v1.0
  5. *         @date               2015/09/02
  6. *         @brief             
  7. *         @copyright          camel.shoko@gmail.com
  8. */


  9. #ifndef __MAIN_H__
  10. #define __MAIN_H__


  11. /* Include ------------------------------------------------------------------ */
  12. #pragma "sfr"
  13. #pragma EI
  14. #pragma DI
  15. #pragma NOP


  16. /* Typedef ------------------------------------------------------------------ */
  17. typedef unsigned char                                         uint8_t;
  18. typedef signed char                                         int8_t;
  19. typedef unsigned int                                         uint16_t;
  20. typedef signed int                                                 int16_t;
  21. typedef unsigned long                                         uint32_t;
  22. typedef signed long                                         int32_t;

  23. /*! ------------------------------------------------------------------------- */
  24. enum {
  25.         BIT0                                                                = 0x01,
  26.         BIT1                                                                = 0x02,
  27.         BIT2                                                                = 0x04,
  28.         BIT3                                                                = 0x08,
  29.         BIT4                                                                = 0x10,
  30.         BIT5                                                                = 0x20,
  31.         BIT6                                                                = 0x40,
  32.         BIT7                                                                = 0x80
  33. };

  34. enum {
  35.         PIN_DIGITA                                                        = 0x00,
  36.         PIN_ANALOG                                                        = 0x01
  37. };

  38. enum {
  39.         NORMAL_OUTPUT                                                = 0x00,
  40.         P_NMOS_OUTPUT                                                = 0x01
  41. };


  42. /* Defines ------------------------------------------------------------------ */
  43. #define TAU0_CH0_TIMER_US                                (float)(31.77)

  44. /*! ------------------------------------------------------------------------- */
  45. #define VGA_HSYNC_PMC                                        PMC0
  46. #define VGA_HSYNC_PIO                                        P0
  47. #define VGA_HSYNC_POM                                        POM0
  48. #define VGA_HSYNC_PMO                                        PM0
  49. #define VGA_HSYNC_PIN                                        4

  50. #define VGA_VSYNC_PMC                                        PMC0
  51. #define VGA_VSYNC_PIO                                        P0
  52. #define VGA_VSYNC_POM                                        POM0
  53. #define VGA_VSYNC_PMO                                        PM0
  54. #define VGA_VSYNC_PIN                                        2

  55. #define VGA_SINGAL_PMO                                        PM0
  56. #define VGA_SINGAL_PIN                                        6

  57. #define KEY_SINGAL_PMO                                        PM1
  58. #define KEY_SINGAL_PIO                                        P1
  59. #define KEY_SINGAL_PIN                                        1

  60. /*! ------------------------------------------------------------------------- */
  61. #ifndef TRUE
  62. #  define TRUE                                                         1
  63. #endif

  64. #ifndef FALSE
  65. #  define FALSE                                                 0
  66. #endif


  67. /* Macros ------------------------------------------------------------------- */

  68. /**
  69. * NORMAL_BIT_DEF
  70. * ????????
  71. */
  72. #ifndef BV
  73. #  define BV(n)                                              (1 << (n))
  74. #endif

  75. #ifndef GET_BIT
  76. #  define GET_BIT(DISCS, IDX)                          (((DISCS) & BV(IDX)) ? 1 : 0)
  77. #endif

  78. #ifndef SET_BIT
  79. #  define SET_BIT(DISCS, IDX)                          ((DISCS) |= BV(IDX))
  80. #endif

  81. #ifndef CLR_BIT
  82. #  define CLR_BIT(DISCS, IDX)                          ((DISCS) &= (BV(IDX) ^ 0xFF))
  83. #endif


  84. #define HI_UINT16(a)                                         (((a) >> 8) & 0xFF)
  85. #define LO_UINT16(a)                                         ((a) & 0xFF)

  86. #define BUILD_UINT16(loByte, hiByte)         ((uint16_t)(((loByte) & 0x00FF) | (((hiByte) & 0x00FF) << 8)))


  87. /*! ------------------------------------------------------------------------- */

  88. /**
  89. * VGA_SINGAL_HSYNC
  90. */
  91. #define VGA_HSYNC_DIGITAL()                                CLR_BIT(VGA_HSYNC_PMC, VGA_HSYNC_PIN)
  92. #define VGA_HSYNC_ANALOG()                                SET_BIT(VGA_HSYNC_PMC, VGA_HSYNC_PIN)

  93. #define VGA_HSYNC_NORMAL_OUTPUT()                CLR_BIT(VGA_HSYNC_POM, VGA_HSYNC_PIN)
  94. #define VGA_HSYNC_P_NMOS_OUTPUT()                SET_BIT(VGA_HSYNC_POM, VGA_HSYNC_PIN)

  95. #define VGA_HSYNC_OUTPUT()                                CLR_BIT(VGA_HSYNC_PMO, VGA_HSYNC_PIN)
  96. #define VGA_HSYNC_INPUT()                                SET_BIT(VGA_HSYNC_PMO, VGA_HSYNC_PIN)

  97. #define VGA_HSYNC_OUT_LOWL()                        CLR_BIT(VGA_HSYNC_PIO, VGA_HSYNC_PIN)
  98. #define VGA_HSYNC_OUT_HIGH()                        SET_BIT(VGA_HSYNC_PIO, VGA_HSYNC_PIN)

  99. /**
  100. * VGA_SINGAL_VSYNC
  101. */
  102. #define VGA_VSYNC_DIGITAL()                                CLR_BIT(VGA_VSYNC_PMC, VGA_VSYNC_PIN)
  103. #define VGA_VSYNC_ANALOG()                                SET_BIT(VGA_VSYNC_PMC, VGA_VSYNC_PIN)

  104. #define VGA_VSYNC_NORMAL_OUTPUT()                CLR_BIT(VGA_VSYNC_POM, VGA_VSYNC_PIN)
  105. #define VGA_VSYNC_P_NMOS_OUTPUT()                SET_BIT(VGA_VSYNC_POM, VGA_VSYNC_PIN)

  106. #define VGA_VSYNC_OUTPUT()                                CLR_BIT(VGA_VSYNC_PMO, VGA_VSYNC_PIN)
  107. #define VGA_VSYNC_INPUT()                                SET_BIT(VGA_VSYNC_PMO, VGA_VSYNC_PIN)

  108. #define VGA_VSYNC_OUT_LOWL()                        CLR_BIT(VGA_VSYNC_PIO, VGA_VSYNC_PIN)
  109. #define VGA_VSYNC_OUT_HIGH()                        SET_BIT(VGA_VSYNC_PIO, VGA_VSYNC_PIN)

  110. /**
  111. * VGA_SINGAL_VIDEO
  112. */
  113. #define VGA_VIDEO_OUTPUT()                                CLR_BIT(VGA_SINGAL_PMO, VGA_SINGAL_PIN)
  114. #define VGA_VIDEO_INPUT()                                SET_BIT(VGA_SINGAL_PMO, VGA_SINGAL_PIN)

  115. /**
  116. * KEY_SINGAL_V
  117. */
  118. #define KEY_SINGAL_OUTPUT()                                CLR_BIT(KEY_SINGAL_PMO, KEY_SINGAL_PIN)
  119. #define KEY_SINGAL_INPUT()                                SET_BIT(KEY_SINGAL_PMO, KEY_SINGAL_PIN)

  120. #define KEY_SINGAL_DIGITAL()                        CLR_BIT(KEY_SINGAL_PMC, KEY_SINGAL_PIN)
  121. #define KEY_SINGAL_ANALOG()                                SET_BIT(KEY_SINGAL_PMC, KEY_SINGAL_PIN)

  122. #define KEY_SINGAL_IN_READ()                        GET_BIT(KEY_SINGAL_PIO, KEY_SINGAL_PIN)                               


  123. /*! ------------------------------------------------------------------------- */

  124. /**
  125. * TAU0_CH0_DEF
  126. */
  127. #define TAU0_CH0_REG(u)                                        ((20*u) - 1)
  128. #define TAU0_CH0_TDR00L                                        LO_UINT16((int)TAU0_CH0_REG(TAU0_CH0_TIMER_US))
  129. #define TAU0_CH0_TDR00H                                        HI_UINT16((int)TAU0_CH0_REG(TAU0_CH0_TIMER_US))

  130. #endif

  131. /*----------------- (C) COPYRIGHT 2015 CAMEL.SHOKO ---------- END OF FILE ----*/
复制代码





图2.信号控制宏


图3.引脚定义与宏的关系


好了,基本上到这里就结束了,把之前的帖子列举一下吧,这个东西告一段落了,有空再完善在折腾吧,在说一点废话,瑞萨的芯片性能不错,可玩性高,可以直接驱动数码管相当的有优势,如果能把TK功能集成进来并提供良好的库,我想在白色家电领域会大有作为。功耗方面没有深入测试,但从一些参数和开源软件中发现在低功耗场合还是有RL78的一席之地,我们这款非L系列的。






小结:在采用R7F0C809实现VGA信号的过程中对这颗IC的一些基本功能进行了一些摸索,发挥出了一些外设的极限能力,给后者一些选型的参考和设计有一些帮助,还是那句话,做论坛活动也得认真,获得财富的不仅仅是你还有那些后来着,我希望将来坛友们觉悟更高而不是简单的搞一些很炫的东西,华而不实。


最后奉上原理图和代码,代码中工程中的main是没有注释的,因为IDE不支持中文,应该是编码格式搞得有问题,注释版本参看main150917.c即可。










本文来自论坛,点击查看完整帖子内容。

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2018-10-24 02:15 , Processed in 0.018378 second(s), 9 queries , Gzip On, MemCache On.

Powered by EEWORLD电子工程世界

© 2018 http://bbs.eeworld.com.cn/

返回顶部