×
单片机 > 单片机程序设计 > 详情

S3C6410图形旋转裸机驱动

发布时间:2020-06-06 发布时间:
|

这个比较简单,一次成功,没遇到任何问题.


GraphRotation.c


  1. /************************************************************************************************************* 

  2.  * 文件名: GraphRotation.c 

  3.  * 功能:      S3C6410 图形旋转底层驱动函数 

  4.  * 作者:      cp1300@139.com 

  5.  * 创建时间:    2012年10月15日21:12 

  6.  * 最后修改时间:2012年10月15日 

  7.  * 详细:      图形旋转控制器底层驱动 

  8. *************************************************************************************************************/  

  9. #include "system.h"  

  10. #include "GraphRotation.h"  

  11. #include "delay.h"  

  12.   

  13.   

  14. //超时,单位US  

  15. #define GR_TIMEOUT  1000000  

  16.   

  17.   

  18.   

  19.   

  20. /************************************************************************************************************************* 

  21. *函数     :   void Rotation_SetInputImage(u8 TypeImage) 

  22. *功能     :   设置输入旋转图像格式 

  23. *参数     :   TypeImage:图像格式,见宏定义 

  24.                 #define GR_YUV420   0 

  25.                 #define GR_YUV422   3 

  26.                 #define GR_RGB565   4 

  27.                 #define GR_RGB888   5 

  28. *返回     :   无 

  29. *依赖 :   底层宏定义 

  30. *作者         :   cp1300@139.com 

  31. *时间    :    20121016 

  32. *最后修改时间:    20121016 

  33. *说明    :    无 

  34. *************************************************************************************************************************/  

  35. void Rotation_SetInputImage(u8 TypeImage)  

  36. {  

  37.     rGR_CTRLCFG &=  ~(0x7 <

  38.     rGR_CTRLCFG |= (0x7 & TypeImage) <

  39. }  

  40.   

  41.   

  42.   

  43. /************************************************************************************************************************* 

  44. *函数     :   void Rotation_SetRotationDeg(u8 Degree) 

  45. *功能     :   设置图像旋转角度 

  46. *参数     :   Degree:旋转角度,见宏定义 

  47.                 #define GR_0Deg     0       //0 

  48.                 #define GR_90Deg    1       //90 

  49.                 #define GR_180Deg   2       //180 

  50.                 #define GR_270Deg   3       //270 

  51. *返回     :   无 

  52. *依赖 :   底层宏定义 

  53. *作者         :   cp1300@139.com 

  54. *时间    :    20121016 

  55. *最后修改时间:    20121016 

  56. *说明    :    翻转和旋转不能同时生效 

  57. *************************************************************************************************************************/  

  58. void Rotation_SetRotationDeg(u8 Degree)  

  59. {  

  60.     rGR_CTRLCFG &=  ~(0x3 <

  61.     rGR_CTRLCFG |= (0x3 & Degree) <

  62. }  

  63.   

  64.   

  65. /************************************************************************************************************************* 

  66. *函数     :   void Rotation_SetFlipDir(u8 Direction) 

  67. *功能     :   设置图像翻转方向 

  68. *参数     :   Direction:翻转方向,见宏定义 

  69.                 #define GR_NotFlip  0       //不翻转 

  70.                 #define GR_VerFlip  2       //垂直翻转 

  71.                 #define GR_HorFlip  3       //水平翻转 

  72. *返回     :   无 

  73. *依赖 :   底层宏定义 

  74. *作者         :   cp1300@139.com 

  75. *时间    :    20121016 

  76. *最后修改时间:    20121016 

  77. *说明    :    翻转和旋转不能同时生效 

  78. *************************************************************************************************************************/  

  79. void Rotation_SetFlipDir(u8 Direction)  

  80. {  

  81.     rGR_CTRLCFG &=  ~(0x3 <

  82.     rGR_CTRLCFG |= (0x3 & Direction) <

  83. }  

  84.   

  85.   

  86.   

  87. /************************************************************************************************************************* 

  88. *函数     :   void Rotation_SetSourImageAddr(u32 RGB_Y_Addr,u32 CB_Addr,u32 CR_Addr) 

  89. *功能     :   设置源图像地址 

  90. *参数     :   RGB_Y_Addr : RGB或者Y组成部分 

  91. *           CB_Addr:CB组成部分 

  92. *           CR_Addr:CR组成部分 

  93. *返回     :   无 

  94. *依赖 :   底层宏定义 

  95. *作者         :   cp1300@139.com 

  96. *时间    :    20121016 

  97. *最后修改时间:    20121016 

  98. *说明    :    无 

  99. *************************************************************************************************************************/  

  100. void Rotation_SetSourImageAddr(u32 RGB_Y_Addr,u32 CB_Addr,u32 CR_Addr)  

  101. {  

  102.     rGR_SRCADDRREG0 = RGB_Y_Addr;  

  103.     rGR_SRCADDRREG1 = CB_Addr;  

  104.     rGR_SRCADDRREG2 = CR_Addr;  

  105. }  

  106.   

  107.   

  108. /************************************************************************************************************************* 

  109. *函数     :   void Rotation_SetDesImageAddr(u32 RGB_Y_Addr,u32 CB_Addr,u32 CR_Addr) 

  110. *功能     :   设置目标图像地址 

  111. *参数     :   RGB_Y_Addr : RGB或者Y组成部分 

  112. *           CB_Addr:CB组成部分 

  113. *           CR_Addr:CR组成部分 

  114. *返回     :   无 

  115. *依赖 :   底层宏定义 

  116. *作者         :   cp1300@139.com 

  117. *时间    :    20121016 

  118. *最后修改时间:    20121016 

  119. *说明    :    无 

  120. *************************************************************************************************************************/  

  121. void Rotation_SetDesImageAddr(u32 RGB_Y_Addr,u32 CB_Addr,u32 CR_Addr)  

  122. {  

  123.     rGR_DESTADDRREG0 = RGB_Y_Addr;  

  124.     rGR_DESTADDRREG1 = CB_Addr;  

  125.     rGR_DESTADDRREG2 = CR_Addr;  

  126. }  

  127.   

  128.   

  129. /************************************************************************************************************************* 

  130. *函数     :   void Rotation_SetImageSize(u16 VerSize,u16 HorSize) 

  131. *功能     :   设置源图像尺寸 

  132. *参数     :   VerSize:源图像垂直尺寸 

  133. *           HorSize:源图像水平尺寸 

  134. *返回     :   无 

  135. *依赖 :   底层宏定义 

  136. *作者         :   cp1300@139.com 

  137. *时间    :    20121016 

  138. *最后修改时间:    20121016 

  139. *说明    :    无 

  140. *************************************************************************************************************************/  

  141. void Rotation_SetImageSize(u16 VerSize,u16 HorSize)  

  142. {  

  143.     rGR_SRCSIZEREG = ((u32)VerSize <

  144. }  

  145.   

  146.   

  147. /************************************************************************************************************************* 

  148. *函数     :   void GraphRotation_Init(void) 

  149. *功能     :   初始化图形旋转模块 

  150. *参数     :   无 

  151. *返回     :   无 

  152. *依赖 :   底层宏定义 

  153. *作者         :   cp1300@139.com 

  154. *时间    :    20121015 

  155. *最后修改时间:    20121015 

  156. *说明    :    无 

  157. *************************************************************************************************************************/  

  158. void GraphRotation_Init(void)  

  159. {  

  160.     Set_GateClk(HCLK_ROT,ENABLE);   //使能图形旋转寄存器时钟  

  161. }  

  162.   

  163.   

  164. /************************************************************************************************************************* 

  165. *函数     :   u8 Rotation_RGB565Image(u32 SourImageAddr,u32 DesImageAddr,u16 VerSize,u16 HorSize,u8 GR_Mode)  

  166. *功能     :   旋转一张RGB565图像 

  167. *参数     :   SourImageAddr:源图像地址;DesImageAddr:目标地址;VerSize:垂直分辨率;HorSize:水平分辨率;GR_Mode:旋转或者翻转模式 

  168. *返回     :   0:成功;1:失败 

  169. *依赖 :   底层宏定义 

  170. *作者         :   cp1300@139.com 

  171. *时间    :    20121016 

  172. *最后修改时间:    20121016 

  173. *说明    :    旋转和翻转无法同时使用 

  174. *************************************************************************************************************************/  

  175. u8 Rotation_RGB565Image(u32 SourImageAddr,u32 DesImageAddr,u16 VerSize,u16 HorSize,u8 GR_Mode)   

  176. {  

  177.     u32 cnt;  

  178.       

  179.     cnt = rGR_STATCFG;                              //读取,消除状态标志  

  180.     Rotation_SetInputImage(GR_RGB565);              //设置源图像为RGB565格式  

  181.     Rotation_SetSourImageAddr(SourImageAddr,0,0);   //设置源图像地址  

  182.     Rotation_SetDesImageAddr(DesImageAddr,0,0);     //设置目标图像地址  

  183.     Rotation_SetImageSize(VerSize,HorSize);         //设置源图像尺寸  

  184.     if(GR_Mode & 0x80)                              //翻转  

  185.     {  

  186.         Rotation_SetRotationDeg(GR_0Deg);           //不旋转  

  187.         Rotation_SetFlipDir(GR_Mode - 0x80);        //设置翻转  

  188.     }  

  189.     else                                            //旋转  

  190.     {  

  191.         Rotation_SetFlipDir(0);                     //不翻转  

  192.         Rotation_SetRotationDeg(GR_Mode);           //设置旋转  

  193.     }  

  194.     rGR_CTRLCFG |= BIT0;                            //开始旋转  

  195.     //用于等待旋转成功  

  196.     cnt = 0;  

  197.     while(!(rGR_STATCFG & BIT8))  

  198.     {  

  199.         cnt ++;  

  200.         Delay_US(1);  

  201.         if(cnt > GR_TIMEOUT)                     //等待超时  

  202.             return 1;  

  203.     }  

  204.     return 0;  

  205. }  


GraphRotation.h


  1. /************************************************************************************************************* 

  2.  * 文件名: GraphRotation.h 

  3.  * 功能:      S3C6410 图形旋转底层驱动函数 

  4.  * 作者:      cp1300@139.com 

  5.  * 创建时间:    2012年10月15日21:12 

  6.  * 最后修改时间:2012年10月17日 

  7.  * 详细:      图形旋转控制器底层驱动 

  8. *************************************************************************************************************/  

  9. #ifndef GRAPHROTATION_H_  

  10. #define GRAPHROTATION_H_  

  11.   

  12.   

  13.   

  14. //旋转图像输入格式  

  15. #define GR_YUV420   0  

  16. #define GR_YUV422   3  

  17. #define GR_RGB565   4  

  18. #define GR_RGB888   5  

  19.   

  20. //旋转程度  

  21. #define GR_0Deg     0       //0  

  22. #define GR_90Deg    1       //90  

  23. #define GR_180Deg   2       //180  

  24. #define GR_270Deg   3       //270  

  25.   

  26. //翻转定义  

  27. //0x80用于区分翻转和旋转  

  28. #define GR_NotFlip  0x80        //不翻转  

  29. #define GR_VerFlip  0x82        //垂直翻转  

  30. #define GR_HorFlip  0x83        //水平翻转  

  31.   

  32.   

  33.   

  34. //相关函数  

  35. void GraphRotation_Init(void);  //初始化  

  36. u8 Rotation_RGB565Image(u32 SourImageAddr,u32 DesImageAddr,u16 VerSize,u16 HorSize,u8 GR_Mode); //旋转一张RGB565图像  

  37.   

  38.   

  39.   

  40. #endif /*GRAPHROTATION_H_*/  





//相关寄存器定义


[cpp] view plain copy

  1. //图形旋转 内存映射  

  2. //寄存器 地址 读/写 描述 复位值  

  3. #define rGR_CTRLCFG         S3C6410_SFR32(0x77200000)       //读/写   旋转器控制寄存器                        0x0000_0000  

  4. #define rGR_SRCADDRREG0     S3C6410_SFR32(0x77200004)       //读/写   旋转器源图像(RGB 或Y 组成部分)地址寄存器    0x0000_0000  

  5. #define rGR_SRCADDRREG1     S3C6410_SFR32(0x77200008)       //读/写   旋转器源图像(CB 组成部分)地址寄存器        0x0000_0000  

  6. #define rGR_SRCADDRREG2     S3C6410_SFR32(0x7720000C)       //读/写   旋转器源图像(CR 组成部分)地址寄存器        0x0000_0000  

  7. #define rGR_SRCSIZEREG      S3C6410_SFR32(0x77200010)       //读/写   旋转器源图像尺寸寄存器                     0x0000_0000  

  8. #define rGR_DESTADDRREG0    S3C6410_SFR32(0x77200018)       //读/写   旋转器目标图像(RGB 或Y 成分)地址寄存器 0x0000_0000  

  9. #define rGR_DESTADDRREG1    S3C6410_SFR32(0x7720001C)       //读/写   旋转器目标图像(CB 组成部分)地址寄存器       0x0000_0000  

  10. #define rGR_DESTADDRREG2    S3C6410_SFR32(0x77200020)       //读/写   旋转器目标图像(CR 组成部分)地址寄存器       0x0000_0000  

  11. #define rGR_STATCFG         S3C6410_SFR32(0x7720002C)       //读     旋转器状态寄存器                        0x0000_0000  



//测试


  1. #include "system.h"  

  2. #include "uart.h"  

  3. #include "tft_lcd.h"  

  4. #include "other.h"  

  5. #include "delay.h"  

  6. #include "timer.h"  

  7. #include "ac97.h"  

  8. #include "GraphRotation.h"  

  9. #include "bmp.h"  

  10.   

  11.   

  12. //LED1闪烁程序,在定时器0中断服务程序中闪烁,周期400MS  

  13. void LED1_flash(void)  

  14. {  

  15.     LED1_FLASH();  

  16. }  

  17.   

  18.   

  19. //将缓存图像送到显存  

  20. void RAMBuff_To_GBuff(const u16 *RAMAddr,vu16 (*GBuff)[LCD_XSIZE],u16 x0,u16 y0,u16 Hsize,u16 Vsize)  

  21. {  

  22.     u16 x,y;  

  23.       

  24.     for(y = y0;y 

  25.     {  

  26.         for(x = x0;x 

  27.         {  

  28.             GBuff[y][x] = *RAMAddr++;  

  29.         }  

  30.     }  

  31. }  

  32.   

  33. //主函数  

  34. int main(void)  

  35. {     

  36.     u16 ImgeBuff[240 * 320];    //目标图像缓冲区,图像分辨率240*320  

  37.       

  38.     LCD_Init();                 //初始化LCD  

  39.     UART0_Init(DISABLE,115200); //初始化串口,失能中断接收,波特率115200  

  40.     LED_Init();                 //初始化LED  

  41.   

  42.     Timer1_Init(400000-1,ENABLE,LED1_flash);    //初始化定时器0,周期400ms  

  43.       

  44.     lcd_printf("Get_FCLK : %d Hz\n",Get_FCLK());      

  45.     lcd_printf("Get_PCLK : %d Hz\n",Get_PCLK());  

  46.       

  47.     //图像旋转测试  

  48.     RAMBuff_To_GBuff((const u16 *)gImage_bmp,LCD_BUFFER0,0,0,240,320);      //显示原图形  

  49.     GraphRotation_Init();       //初始化图形旋转模块  

  50.     Rotation_RGB565Image((u32)gImage_bmp,(u32)ImgeBuff,320,240,GR_90Deg);   //图像旋转90°  

  51.     RAMBuff_To_GBuff((const u16 *)ImgeBuff,LCD_BUFFER0,240,0,320,240);      //显示旋转90°图形,长宽对调  

  52.     Rotation_RGB565Image((u32)gImage_bmp,(u32)ImgeBuff,320,240,GR_HorFlip); //图像水平翻转  

  53.     RAMBuff_To_GBuff((const u16 *)ImgeBuff,LCD_BUFFER0,240+320,0,240,320);      //显示水平翻转的图像,长宽保持不变  

  54.     while(1)  

  55.     {  

  56.         LED2_FLASH();       //LED2闪烁  

  57.         Delay_US(600000);  

  58.     }  

  59. }  



//原图片



//开发板上测试效果图




『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
单片机的抗干扰措施有哪些