新闻中心

EEPW首页>嵌入式系统>设计应用> S3C2440学习三(基础模块的使用1)

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

作者: 时间:2016-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。

本文引用地址://m.amcfsurvey.com/article/201611/316992.htm

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这个寄存器,它是存放写或读取的IIC器件的首地址,但是必须在开启IIC传输前赋值;开始IIC通信使用到了IICSTAT寄存器,再通过IICCON使能IIC控制总线,使能IIC总线的ACK功能、同时使能Tx/Rx中断、设置IICCLK频率,rIICCON = 0xaf;。目前这个程序是通过一个寄存器来标记状态,当读取或写入后,程序就会陷入while等待,那么只能通过中断,查看具体的状态,并对那个寄存器的值更新,使得程序跳出while。

⑤ADS如何创建工程,如何新建程序,如何编译如何仿真?

ADS其实是ARM公司推出的软件,ADS由命令行开发工具,ARM时实库,GUI开发环境(Code Warrior和AXD),实用程序获得支持软件组成。命令行开发工具完成源代码编译,连接成可执行代码的功能。ARM运行时库主要是用来支持被编译的C和C++代码。CodeWarrior for ARM是一套完整的集成开发工具,充分发挥了ARM RISC的优势,该工具专为基于ARM RISC的处理器而设计的。AXD是ARM扩展调试器。

⑥ “C语言”可变数目变元??

宏va_arg()、va_start()和va_end()一起使用,便可以完成向函数传入数目可变的变元操作。取可变数目变元的典型例子是函数printf()。类型va_list是在 中定义的。创建一个能获取可变数目变元的函数的通用过程:在函数定义中,可变参数表之前必须有一个或多个已知参数,其中最右者为last_p arm。在调用va_start()时,last_parm名被用作第二个参数。任何可变长度的变元被访问之前,必须先用va_start()初始化变元指针argptr。初始化argptr后,经过对va_arg()的调用,以作为下一个参数类型的参数类型,返回参数。最后取完所有参数并从函数返回之前。必须调用va_end()。由此确保堆栈的正确恢复。如果未正确使用va_end(),程序可能瘫痪。



关键词:S3C2440基础模

评论


技术专区

关闭