微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > S3C2440学习三(基础模块的使用1)

S3C2440学习三(基础模块的使用1)

时间:11-11 来源:互联网 点击:
如果一个人学习一样东西或做一件事,达到忘我的境界,那么他将变得成功。

①如何实现UART输出的?UART使用到的寄存器如下,(1)UART线性控制寄存器ULCONn,(2)UART控制寄存器UCONn,(3)UART FIFO控制寄存器UFCONn,(4)UART MODEM控制寄存器UMCONn,(5)UART 接收发送状态寄存器UTRSTATn,(6)UART 错误状态寄存器UERSTATn,(7)UART FIFO状态寄存器UFSTATn,(8)UART MODEM状态寄存器UMSTATn,(9)UART发送缓存寄存器UTXHn,(10)UART接收缓冲寄存器URXHn,(11)UART波特率除数寄存器UBRdivn。

1. 先必须配置好时钟频率,波特率不对就没法通信。后面给一个时钟配置模板。首先UART通信口有6根线,两根电源线,nCTS/nRTS/TXD/RXD这四根线对应PH0-PH3,先通过GPHCON它们设置成第二功能模式。用”mpll_val = (92<12)|(1<4)|(1);“通过对MPLLCON设置系统频率=400MHz,另外通过CLKdivN时钟分频器控制寄存器,UCLK选择寄存器=0表示UPLL时钟设为48MHz等于UCLK对USB提供的48MHz,HdivN=10,同时CAMdivN[9]=0,表示HCLK=FCL/4,PdivN=1,表示PCLK=HCLK/2。好了现在的系统提供的频率:FCLK=400MHz,HCLK=100MHz,PCLK=50MHz,UCLK=48MHz。

其中CAMdivN是摄像头时钟分频器寄存器,divN_UPLL[12]=0,这里FCLK=MPLLclock,HdivN=FCLK/4=100MHz。

2.接下来要初始化UART,设置UART FIFO控制寄存器,权限最低并且关闭FIFO,关掉UMCON模式0和模式1,通过设置ULCON线性控制寄存器,选择每帧的数据位数为8位。通过UCON控制寄存器rUCON0 = 0x245; 选择读写UART数据缓冲寄存器中断请求或查询模式,使能UART对异常产生中断。当非FIFO模式下发送缓存变空或在FIFO模式下发送缓存达到发送FIFO触发水平,则中断请求。

3.设置波特率,通过UBRdiv0/1/2来分别设置波特率。

4.选择读取的串口号,实际上程序里是选择读取的。

5.写数据采用WrUTXH0(\r); WrUTXH0(data);的调用方式进行些数据。

6.程序接收,采用接中断标记等待接收数据。UTRSTAT0/1/2,移位寄存器移空中断,再读取缓冲区的数据,通过获取的数据发送到超级终端,于是就能在终端上看到写上的数据了。

②如何实现PWM调制输出?

蜂鸣器是由GPB0控制,改脚复用功能TOUT0即PWM输出。

1.同上配置好时钟分频,频率太快没法从蜂鸣器听到声音!

2.设置TOUT0输出,即GPBCON的GPB0为设置为10;然后用TCFG0/TCFG1/TCNTB0/TCMPB0配置PWM输出频率,

rTCFG0 &= ~0xff; //这两条语句设置设置定时器0、1的标定值,周期计数初值

rTCFG0 |= 15; //prescaler = 15+1

rTCFG1 &= ~0xf; //这个是选择MUX输入到PWM定时器计数时8分频

rTCFG1 |= 2; //mux = 1/8

rTCNTB0 = (PCLK>>7)/freq;//定时器0计数缓存寄存器,用来装载到减计数的初值中,反正定时器是减计数的

rTCMPB0 = rTCNTB0>>1; // 50%用来和计数器中的值做比较,也就用于脉宽调制

rTCON &= ~0x1f; //定时器控制寄存器,关闭死区,自动重装,关掉逆变器,更新TCNTB0/TCMPB0初值,开启TIMER0

rTCON |= 0xb; //disable deadzone, auto-reload, inv-off, update TCNTB0&TCMPB0, start timer 0

rTCON &= ~2; //clear manual update bit不再对TCNTB0/TCMPB0更新.

其实实际工作最勤快的TCNT0计数器,记录从PCLK的8分频脉冲,当TCNT0≤TCMPn时输出高电平,当TCNT0>TCMPn时输出低电平。

那么现在的周期到底是多少呢?定时器输出时钟频率=PCLK/{prescaler value+1}/{divider value},PCLK=50MHz,那么divider value就是那个8分频,进过预分频器,prescaler=15,所以频率=50MHz/16/8=390.625KHz。还有那个计数值是多大,(PCLK>>7)/freq=390625/freq,这里让freq=10,即T=(1/390625)*39062.5=0.1S,不知道为什么TCNTB这个值设置得达到一定程度就没有用了,这里忘了这个寄存器16位有效65536,再大也没有用,改前面的定时器输出频率更有效。

③如何实现AD采样?

先通过ADCCON寄存器来选择AD通道,AD转换预分频器使能,写入AD转换预标定值(相当于这两项设定AD转换的频率),通过AN0-AN7/YM/YP/XM/XP,怪异的AD转换,在AD转换开始后,AD开始位会由1->0,AD转换结束后,AD结束标记位由0->1,AD转换结果存放在ADCDATA0寄存器中,S3C2440的AD是10的,可直接从ADCDAT0中取出,那么程序就涉及ADCCON、ADCDATA0,这两个主要的寄存器,程序的话直接输入一个通道,返回一个AD值,另外就是AD的时钟,在配置系统时钟时选择分配一个频率基准。IICCON是I2C总线控制寄存器。

④如何实现IIC读写?

I2C无论是硬件还是软件处理,都是构建一个I2C时序,满足硬件通信,最终实现通信。虽然简单还是从寄存器和时序分析一下,使用到了IICDS这个寄存器,它是存放写或

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top