串口模块
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:
图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:
图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:
图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. 打开中断允许触发,中断子函数结束。
程序执行后,我们可以在串口接收到如下信息:
图4-4 打开外部中断后捕捉到的按键信息
(cuishinankobe) |