织梦CMS - 轻松建站从此开始!

罗索

S3C2440的基础功能模块实现过程

jackyhwei 发布于 2011-04-26 10:15 点击:次 
串口模块 Uart.c 包含方法: void Uart_Select(int ch); void Uart_TxEmpty(int ch); void Uart_Init(int pclk,int baud); char Uart_Getch(void); char Uart_GetKey(void); void Uart_GetString(char *string); int Uart_GetIntNum(void); int Uart_GetIntNum_GJ(void
TAG:

串口模块

Uart.c

包含方法:

void Uart_Select(int ch);

void Uart_TxEmpty(int ch);

void Uart_Init(int pclk,int baud);

char Uart_Getch(void);

char Uart_GetKey(void);

void Uart_GetString(char *string);

int Uart_GetIntNum(void);

int Uart_GetIntNum_GJ(void) ;

void Uart_SendByte(int data);

void Uart_SendStrWithLen(char *s, unsigned int len);

void Uart_Printf(char *fmt,...);

void Uart_SendString(char *pt);

重点函数说明:

l 串口初始化程序说明(Uart_Init)

l 串口字符接收(Uart_Getch)

l 串口字符发送(Uart_SendByte)

l 串口字符串发送(Uart_SendStrWithLen)

4.2 时钟模块

Clk.c

包含外部方法:

void Clk_Init(int freq);

void Clk_Display(void);

void Clk0_Enable(int clock_sel);

void Clk0_Disable(void);

void Clk1_Enable(int clock_sel);

void Clk1_Disable(void);

包含内部方法:

void ChangeMPllValue(int mdiv,int pdiv,int sdiv);

void ChangeClockDivider(int hdivn_val,int pdivn_val);

void ChangeUPllValue(int mdiv,int pdiv,int sdiv);

重点函数说明:

l 时钟初始化函数(Clk_Init)

S3C2440有两条锁相环,一条用于核心时钟的倍频,一条用于USB接口的时钟倍频。时钟初试化函数包含对这2条时钟线和分频器的设置。

具体步骤如:

1.设置MPLLCON寄存器改变倍频系数初始化时钟,使时钟工作在400MHz。

2.设定CLKDIV寄存器的分频系数使FCLK(核心时钟):HCLK(总线时钟):PCLK(外围时钟)的比例为1:2:4。

3.设定UPLLCON寄存器和CLKDIV寄存器的系数设置UCLK(USB时钟)为

4.开启对所有模块的时钟信号供应。

l 时钟开启关闭函数(Clk_Enable和Clk_Disable)

具体步骤如:

1.通过设置MISCCR寄存器打开和关闭MPLL或UPLL。

2.设置GPHCON对GPIOH18进行控制,可以打开或关闭时钟对外部的输出。

l 时钟信息显示函数(Clk_Display)

1.可以显示当前FCLK、HCLK、PCLK、UCLK的时钟频率。

2.可以看到PCLK对各个外围模块的时钟提供是否打开。

系统初始化之后,利用Clk_Display显示的时钟信息如图4-1:

clip_image002

图4-1 调用时钟信息显示函数的结果

从图中,我们可以看到目前系统的核心频率工作在400MHz,FCLK:HCLK:PCLK为1:4:8。PCLK对各个子模块的时钟供应都已打开。

4.3 实时时间模块

RTC.c

包含方法:

void RTC_TimeSet(struct Time *time);

void RTC_Display(void);

void RTC_Refresh(struct Time *time);

重点函数说明:

l RTC时间设定(RTC_TimeSet)

在S3C 2440中,有7个时间单位寄存器包含Year、Month、Hour等和1个RTC控制寄存器RTCCON一起管理RTC实时时间。

在设定时间时:

1. 打开RTCCON控制寄存器的锁定,使得时间可以修改。

2. 对7个时间单位寄存器进行赋值。

3. 关闭RTCCON控制寄存器的锁定,使得时间不可修改。

l RTC当前时间刷新(RTC_Refresh)

把当前RTC的时间读入到Time系统时间结构体,但读RTC时间的时候,一定注意不要在秒针即将跳变的时候读,否则读出的时间会不对。

具体步骤:

1. 打开RTCCON控制寄存器的锁定,使得时间可以修改。

2. 判断Second寄存器的值是否是0,以判断是否在发生时间跳变。

3. 读取时间。

4. 关闭RTCCON控制寄存器的锁定,使得时间不可修改。

l RTC时间显示(RTC_Display)

把当前时间发送到串口上。

结果如图4-2:

clip_image002[7]

图4-2 RTC时间显示

4.4 定时器模块

Timer.c

包含方法:

void Timer_Cfg(U32 timern, U32 reload, U32 prescaler, U32 mux, U32 cnt);

void Timer_Start(U32 timern);

void Timer_Stop(U32 timern);

void Timer_Display(U32 timern);

void Delay(int time);

重点函数说明:

l 定时器设定(Timer_Cfg)

这个函数包含在使用定时器之前对其的所有初始化设定,传参是定时器的标号,以及初试计数信息,分频系数等参数,然后根据这些参数对定时器进行设定。

具体步骤:

1. 关闭该定时器,准备设置。

2. 设定预分频器系数Prescaler,它的数值的作用是经过几个Timer Clock定时器才记一次数,Prescaler只能设定在0-255之间。

3. 设定MUX分频器系数,该系数的作用是PCLK分频多少倍来得到Timer Clock,只有1:2、1:4、1:8、1:16可以设定。

4. 设定定时器计数到顶后,是否自动装载初始值。

5. 设定定时器的PWM占空比需求和初始化计数值cnt。

6. 打开GPIOB的对应PWM输出管脚。

l 定时器开始计数(Timer_Start)

使能TCON寄存器的对应位,打开计数器开始计数。

l 定时器关闭(Timer_Stop)

关闭TCON寄存器的对应位,展厅计数器的计数。

l 定时器信息显示(Timer_Display)

通过读取TCON控制寄存器、TCNTB计数寄存器和TCNTP计数比较寄存器的当前状态得到该定时器的当前信息。

调用该函数得到的结果如图4-3:

clip_image002[9]

图4-3 调用定时器信息显示

从图中可以看出,调用了Timer0的显示方法,Timer0的目前状态是运行,而且Auto Reload已经打开,从载入的计数和比较计数来看是组50%的占空比PWM输出。

l 定时器延时功能(Delay)

这个函数利用Timer3做了一个硬件延时功能,传参时间单位为ms。

4.5 蜂鸣器模块

包含方法:

void Beep(U32 freq, U32 ms);

重点函数说明:

l 蜂鸣器开始声响(Beep)

该蜂鸣器使用Timer0的GPIO PWM引脚接了蜂鸣器。通过使用Timer0,可以控制该蜂鸣器,传参为声响的频率和持续时间。具体Timer0的操作过程参考4.4的定时器模块。

4.6 IO指示灯模块

Led.c

包含方法:

void Led_On(U32 nLed);

void Led_Off(U32 nLed);

void Led_OnAll(void);

void Led_OffAll(void);

重要方法说明:

l LED灯打开(Led_On)

S3C2440开发板上的4个LED指示灯接在GPIO B上了,通过对对应GPIO的操作以控制指示灯。

具体步骤:

1. 对对应GPIO设置为输出。

2. 关闭对应GPIO的上拉。

3. 设定GPBDAT寄存器的值打开LED灯。

l LED灯关闭(Led_Off)

对GPBDAT寄存器的值进行修改实现关闭。

4.7 中断模块

Isr.c

包含方法:

void Isr_Init(void);

void HaltUndef(void);

void HaltSwi(void);

void HaltPabort(void);

void HaltDabort(void);

重要函数说明:

l 中断模块初始化(Isr_Init)

具体步骤:

1. 屏蔽所有中断源。

2. 将未定义异常模式HaltUndef和中断表中的未定义模式端挂接。

3. 将软中断模式HaltSwi和中断表中的对应模式端挂接。

4. 将取址异常模式HaltPa和中断表中的对应模式挂接。

5. 将取值异常模式HaltDa和中断表中的对应模式挂接。

6. 将需要使用的中断函数和中断表中的对应位挂接。

7. 设置中断模式为IRQ模式[1]

8. 对其他使用中断的子模块进行初始化。

4.8按键外部中断模块

Key.c

包含方法:

void Ext_Init(void);

static void __irq Key_Isr(void);

重要函数说明:

l 外部中断初始化(Ext_Init)

中断初始化过程参考4.9,外部中断初始化在中断初始化之后进行。

具体步骤:

1. 初始化外部中断对应的GPIO管脚。

2. 设置外部中断的触发模式(设置为下降沿触发)。

3. 使能中断并清除中断屏蔽。

l 外部中断函数(Key_Isr)

这是触发外部中断后调用的中断函数。本文所设计的外部中断函数功能是通过按键控制对应的LED指示灯(LED指示灯程序参考4.6)。

具体步骤:

1. 进入中断子函数后,首先关闭中断触发,防止中断嵌套(因为要操作信号量)。

2. 通过读取INTPND寄存器查找中断触发源,识别是哪个按键触发出来的。

3. 清除对应中断源的标志并打开对应的LED指示灯。

4. 打开中断允许触发,中断子函数结束。

程序执行后,我们可以在串口接收到如下信息:

clip_image002[11]

图4-4 打开外部中断后捕捉到的按键信息

(cuishinankobe)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201104/11304.html]
本文出处:CSDN博客 作者:cuishinankobe
顶一下
(1)
50%
踩一下
(1)
50%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容