这个比较简单,一次成功,没遇到任何问题.
GraphRotation.c
/*************************************************************************************************************
* 文件名: GraphRotation.c
* 功能: S3C6410 图形旋转底层驱动函数
* 作者: cp1300@139.com
* 创建时间: 2012年10月15日21:12
* 最后修改时间:2012年10月15日
* 详细: 图形旋转控制器底层驱动
*************************************************************************************************************/
#include "system.h"
#include "GraphRotation.h"
#include "delay.h"
//超时,单位US
#define GR_TIMEOUT 1000000
/*************************************************************************************************************************
*函数 : void Rotation_SetInputImage(u8 TypeImage)
*功能 : 设置输入旋转图像格式
*参数 : TypeImage:图像格式,见宏定义
#define GR_YUV420 0
#define GR_YUV422 3
#define GR_RGB565 4
#define GR_RGB888 5
*返回 : 无
*依赖 : 底层宏定义
*作者 : cp1300@139.com
*时间 : 20121016
*最后修改时间: 20121016
*说明 : 无
*************************************************************************************************************************/
void Rotation_SetInputImage(u8 TypeImage)
{
rGR_CTRLCFG &= ~(0x7 <
rGR_CTRLCFG |= (0x7 & TypeImage) <
}
/*************************************************************************************************************************
*函数 : void Rotation_SetRotationDeg(u8 Degree)
*功能 : 设置图像旋转角度
*参数 : Degree:旋转角度,见宏定义
#define GR_0Deg 0 //0
#define GR_90Deg 1 //90
#define GR_180Deg 2 //180
#define GR_270Deg 3 //270
*返回 : 无
*依赖 : 底层宏定义
*作者 : cp1300@139.com
*时间 : 20121016
*最后修改时间: 20121016
*说明 : 翻转和旋转不能同时生效
*************************************************************************************************************************/
void Rotation_SetRotationDeg(u8 Degree)
{
rGR_CTRLCFG &= ~(0x3 <
rGR_CTRLCFG |= (0x3 & Degree) <
}
/*************************************************************************************************************************
*函数 : void Rotation_SetFlipDir(u8 Direction)
*功能 : 设置图像翻转方向
*参数 : Direction:翻转方向,见宏定义
#define GR_NotFlip 0 //不翻转
#define GR_VerFlip 2 //垂直翻转
#define GR_HorFlip 3 //水平翻转
*返回 : 无
*依赖 : 底层宏定义
*作者 : cp1300@139.com
*时间 : 20121016
*最后修改时间: 20121016
*说明 : 翻转和旋转不能同时生效
*************************************************************************************************************************/
void Rotation_SetFlipDir(u8 Direction)
{
rGR_CTRLCFG &= ~(0x3 <
rGR_CTRLCFG |= (0x3 & Direction) <
}
/*************************************************************************************************************************
*函数 : void Rotation_SetSourImageAddr(u32 RGB_Y_Addr,u32 CB_Addr,u32 CR_Addr)
*功能 : 设置源图像地址
*参数 : RGB_Y_Addr : RGB或者Y组成部分
* CB_Addr:CB组成部分
* CR_Addr:CR组成部分
*返回 : 无
*依赖 : 底层宏定义
*作者 : cp1300@139.com
*时间 : 20121016
*最后修改时间: 20121016
*说明 : 无
*************************************************************************************************************************/
void Rotation_SetSourImageAddr(u32 RGB_Y_Addr,u32 CB_Addr,u32 CR_Addr)
{
rGR_SRCADDRREG0 = RGB_Y_Addr;
rGR_SRCADDRREG1 = CB_Addr;
rGR_SRCADDRREG2 = CR_Addr;
}
/*************************************************************************************************************************
*函数 : void Rotation_SetDesImageAddr(u32 RGB_Y_Addr,u32 CB_Addr,u32 CR_Addr)
*功能 : 设置目标图像地址
*参数 : RGB_Y_Addr : RGB或者Y组成部分
* CB_Addr:CB组成部分
* CR_Addr:CR组成部分
*返回 : 无
*依赖 : 底层宏定义
*作者 : cp1300@139.com
*时间 : 20121016
*最后修改时间: 20121016
*说明 : 无
*************************************************************************************************************************/
void Rotation_SetDesImageAddr(u32 RGB_Y_Addr,u32 CB_Addr,u32 CR_Addr)
{
rGR_DESTADDRREG0 = RGB_Y_Addr;
rGR_DESTADDRREG1 = CB_Addr;
rGR_DESTADDRREG2 = CR_Addr;
}
/*************************************************************************************************************************
*函数 : void Rotation_SetImageSize(u16 VerSize,u16 HorSize)
*功能 : 设置源图像尺寸
*参数 : VerSize:源图像垂直尺寸
* HorSize:源图像水平尺寸
*返回 : 无
*依赖 : 底层宏定义
*作者 : cp1300@139.com
*时间 : 20121016
*最后修改时间: 20121016
*说明 : 无
*************************************************************************************************************************/
void Rotation_SetImageSize(u16 VerSize,u16 HorSize)
{
rGR_SRCSIZEREG = ((u32)VerSize <
}
/*************************************************************************************************************************
*函数 : void GraphRotation_Init(void)
*功能 : 初始化图形旋转模块
*参数 : 无
*返回 : 无
*依赖 : 底层宏定义
*作者 : cp1300@139.com
*时间 : 20121015
*最后修改时间: 20121015
*说明 : 无
*************************************************************************************************************************/
void GraphRotation_Init(void)
{
Set_GateClk(HCLK_ROT,ENABLE); //使能图形旋转寄存器时钟
}
/*************************************************************************************************************************
*函数 : u8 Rotation_RGB565Image(u32 SourImageAddr,u32 DesImageAddr,u16 VerSize,u16 HorSize,u8 GR_Mode)
*功能 : 旋转一张RGB565图像
*参数 : SourImageAddr:源图像地址;DesImageAddr:目标地址;VerSize:垂直分辨率;HorSize:水平分辨率;GR_Mode:旋转或者翻转模式
*返回 : 0:成功;1:失败
*依赖 : 底层宏定义
*作者 : cp1300@139.com
*时间 : 20121016
*最后修改时间: 20121016
*说明 : 旋转和翻转无法同时使用
*************************************************************************************************************************/
u8 Rotation_RGB565Image(u32 SourImageAddr,u32 DesImageAddr,u16 VerSize,u16 HorSize,u8 GR_Mode)
{
u32 cnt;
cnt = rGR_STATCFG; //读取,消除状态标志
Rotation_SetInputImage(GR_RGB565); //设置源图像为RGB565格式
Rotation_SetSourImageAddr(SourImageAddr,0,0); //设置源图像地址
Rotation_SetDesImageAddr(DesImageAddr,0,0); //设置目标图像地址
Rotation_SetImageSize(VerSize,HorSize); //设置源图像尺寸
if(GR_Mode & 0x80) //翻转
{
Rotation_SetRotationDeg(GR_0Deg); //不旋转
Rotation_SetFlipDir(GR_Mode - 0x80); //设置翻转
}
else //旋转
{
Rotation_SetFlipDir(0); //不翻转
Rotation_SetRotationDeg(GR_Mode); //设置旋转
}
rGR_CTRLCFG |= BIT0; //开始旋转
//用于等待旋转成功
cnt = 0;
while(!(rGR_STATCFG & BIT8))
{
cnt ++;
Delay_US(1);
if(cnt > GR_TIMEOUT) //等待超时
return 1;
}
return 0;
}
GraphRotation.h
/*************************************************************************************************************
* 文件名: GraphRotation.h
* 功能: S3C6410 图形旋转底层驱动函数
* 作者: cp1300@139.com
* 创建时间: 2012年10月15日21:12
* 最后修改时间:2012年10月17日
* 详细: 图形旋转控制器底层驱动
*************************************************************************************************************/
#ifndef GRAPHROTATION_H_
#define GRAPHROTATION_H_
//旋转图像输入格式
#define GR_YUV420 0
#define GR_YUV422 3
#define GR_RGB565 4
#define GR_RGB888 5
//旋转程度
#define GR_0Deg 0 //0
#define GR_90Deg 1 //90
#define GR_180Deg 2 //180
#define GR_270Deg 3 //270
//翻转定义
//0x80用于区分翻转和旋转
#define GR_NotFlip 0x80 //不翻转
#define GR_VerFlip 0x82 //垂直翻转
#define GR_HorFlip 0x83 //水平翻转
//相关函数
void GraphRotation_Init(void); //初始化
u8 Rotation_RGB565Image(u32 SourImageAddr,u32 DesImageAddr,u16 VerSize,u16 HorSize,u8 GR_Mode); //旋转一张RGB565图像
#endif /*GRAPHROTATION_H_*/
//相关寄存器定义
[cpp] view plain copy
//图形旋转 内存映射
//寄存器 地址 读/写 描述 复位值
#define rGR_CTRLCFG S3C6410_SFR32(0x77200000) //读/写 旋转器控制寄存器 0x0000_0000
#define rGR_SRCADDRREG0 S3C6410_SFR32(0x77200004) //读/写 旋转器源图像(RGB 或Y 组成部分)地址寄存器 0x0000_0000
#define rGR_SRCADDRREG1 S3C6410_SFR32(0x77200008) //读/写 旋转器源图像(CB 组成部分)地址寄存器 0x0000_0000
#define rGR_SRCADDRREG2 S3C6410_SFR32(0x7720000C) //读/写 旋转器源图像(CR 组成部分)地址寄存器 0x0000_0000
#define rGR_SRCSIZEREG S3C6410_SFR32(0x77200010) //读/写 旋转器源图像尺寸寄存器 0x0000_0000
#define rGR_DESTADDRREG0 S3C6410_SFR32(0x77200018) //读/写 旋转器目标图像(RGB 或Y 成分)地址寄存器 0x0000_0000
#define rGR_DESTADDRREG1 S3C6410_SFR32(0x7720001C) //读/写 旋转器目标图像(CB 组成部分)地址寄存器 0x0000_0000
#define rGR_DESTADDRREG2 S3C6410_SFR32(0x77200020) //读/写 旋转器目标图像(CR 组成部分)地址寄存器 0x0000_0000
#define rGR_STATCFG S3C6410_SFR32(0x7720002C) //读 旋转器状态寄存器 0x0000_0000
//测试
#include "system.h"
#include "uart.h"
#include "tft_lcd.h"
#include "other.h"
#include "delay.h"
#include "timer.h"
#include "ac97.h"
#include "GraphRotation.h"
#include "bmp.h"
//LED1闪烁程序,在定时器0中断服务程序中闪烁,周期400MS
void LED1_flash(void)
{
LED1_FLASH();
}
//将缓存图像送到显存
void RAMBuff_To_GBuff(const u16 *RAMAddr,vu16 (*GBuff)[LCD_XSIZE],u16 x0,u16 y0,u16 Hsize,u16 Vsize)
{
u16 x,y;
for(y = y0;y
{
for(x = x0;x
{
GBuff[y][x] = *RAMAddr++;
}
}
}
//主函数
int main(void)
{
u16 ImgeBuff[240 * 320]; //目标图像缓冲区,图像分辨率240*320
LCD_Init(); //初始化LCD
UART0_Init(DISABLE,115200); //初始化串口,失能中断接收,波特率115200
LED_Init(); //初始化LED
Timer1_Init(400000-1,ENABLE,LED1_flash); //初始化定时器0,周期400ms
lcd_printf("Get_FCLK : %d Hz\n",Get_FCLK());
lcd_printf("Get_PCLK : %d Hz\n",Get_PCLK());
//图像旋转测试
RAMBuff_To_GBuff((const u16 *)gImage_bmp,LCD_BUFFER0,0,0,240,320); //显示原图形
GraphRotation_Init(); //初始化图形旋转模块
Rotation_RGB565Image((u32)gImage_bmp,(u32)ImgeBuff,320,240,GR_90Deg); //图像旋转90°
RAMBuff_To_GBuff((const u16 *)ImgeBuff,LCD_BUFFER0,240,0,320,240); //显示旋转90°图形,长宽对调
Rotation_RGB565Image((u32)gImage_bmp,(u32)ImgeBuff,320,240,GR_HorFlip); //图像水平翻转
RAMBuff_To_GBuff((const u16 *)ImgeBuff,LCD_BUFFER0,240+320,0,240,320); //显示水平翻转的图像,长宽保持不变
while(1)
{
LED2_FLASH(); //LED2闪烁
Delay_US(600000);
}
}
//原图片
//开发板上测试效果图
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』