首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

ARM开发调试笔记心得(转)(4)

ARM开发调试笔记心得(转)(4)

RS232串口通信————串口USART0通讯实验
一.实验目的
        利用串口调试软件能够正确接收到AT91SAM7S64发出的数据,AT91SAM7S64也能正确接收到调试软件发出的数据。

二.实验程序和参数设置
        1>连接器选项设置和启动代码都与上个实验相同
        2>C语言的代码
        #include "AT91SAM7S64.h"
        #include "Board.h"
        unsigned char RBuff[256]; //定义接收缓冲区
        unsigned char index;
        int main(void)
        {
                unsigned int i, delay;
                *AT91C_CKGR_MOR = 0x701; //使能主振荡器和设置起振时间
                *AT91C_PMC_MCKR = 0x01; //选择Mster Clock is main clock, divided by 0
                *AT91C_PMC_SCER = AT91C_CKGR_MOSCEN;//使能系统时钟寄存器的处理器时钟
                *AT91C_PMC_PCER = AT91C_ID_US0; //使能USART0时钟
                *AT91C_PIOA_PDR = US_RXD_PIN | US_TXD_PIN;//禁止该两个管脚的I/O口功能
                *AT91C_PIOA_ASR= US_RXD_PIN | US_TXD_PIN;//将该两个I/O口分配给外围A
                *AT91C_US1_MR =0x8c0; //正常模式,时钟为MCK,8位长度,无校验,1位停止位,
                *AT91C_US0_IDR = 0xf3fff; //禁止所有UART相关的中断
                *AT91C_US0_BRGR = 30; //设置波特率为38400Hz,AT91C_US0_BRGR为CD值
                //Baudrate=SelectedClock/(8(2-Over)CD) = MCK/16CD = 18432000/(16*30) = 38400
                *AT91C_US0_CR = 0x15c; //复位接收器、发送器和状态位;使能接收与发送
                index = 0;
                while (1)
                {
                      for (i = 0; i < 256; i++)
                      { //发送程序
                            if ((*AT91C_US0_CSR) & AT91C_US_TXEMPTY) //判断发送器是否为空
                            {
                                 *AT91C_US0_THR = i; //空,则发送数据
                            }
                            for (delay = 0; delay < 0xfff; delay++);
                      }
                     if ((*AT91C_US0_CSR) & AT91C_US_RXRDY)
                     {//接收程序,在调试该部分时,要将发送部分程序注示掉
                           RBuff[index++] = *AT91C_US0_RHR;
                     }
                }
        }
三.出现的问题与解决方法
        1> 状态寄存器中的发送准备位(TXRDY)和发送空标志位(TXEMPTY)一直为0,表示发送器未准备好和缓冲区不空。原因是发送器复位后还未使能。不能同时进行发送器(或接收器)复位与使能操作(*AT91C_US0_CR= 0x15c),这样使能操作会无效,必须将它们分开,即先进行复位(*AT91C_US0_CR= 0x10c),再进行使能(*AT91C_US0_CR = 0x50)。
         2> 串口接收、发送的数据不对的原因是系统主时钟和分频后的时钟计算错误,引起波特率也计算错误。很有必要深入研究关于时钟的产生、分频及波特率计算等内容。
         3> 每次从串口调试软件收到的数据中,低四位正确,高四位错误。原因是将“*AT91C_US0_MR =0x8c0;”写成了“*AT91C_US1_MR =0x8c0;”,而引起通讯模式根本不对。可以说这是一个非常低级的错误,但它却花费了我很久的时间才找到症结所在。在找原因的过程中,使我对串口相关的(如各种时钟的产生、波特率的计算等)内容有了更深刻的理解。
四.总结
         在本实验中串口为异步模式,波特率的计算如下式所示:
                 Baudrate = SelectedClock/(8(2-Over)CD)
         其中在USART模式寄存器(AT91C_US0_MR)中设置SelectedClock为MCK;Over为1则上式变成如下所示:
                 Baudrate = SelectedClock/(8(2-Over)CD) = MCK/16CD
         在Master Clock Register(AT91C_PMC_MCKR)中将MCK设置为Main Clock且不分频,即为外部振荡时钟(接在XIN和XOUT管脚间的晶振)的频率,因为外部晶振是18.432MHz,所以MCK就为18432000,则上式变成如下所示:
                 Baudrate=SelectedClock/(8(2-Over)CD) = MCK/16CD = 18432000/(16*30) = 38400
串口DMA控制实验
一.背景
        DMA是Direct Memory Access的缩写,即“存储器直接访问”。它是指一种高速的数据传输操作,允许在外部设备和存储器之间直接读写数据,即不通过CPU,也不需要CPU干预。整个数据传输操作在一个称为“DMA控制器”的控制下进行的。CPU除了在数据传输开始和结束时作一点处理外,在传输过程中CPU可以进行其它的工作。这样,在大部分时间里,CPU和输入输出都处在并行操作。因此,使整个计算机系统的效率大大提高。
        AT91SAM7S64串口外围DAM控制器的工作过程:将要发送的数据缓冲区的起始地址赋给串口DMA控制器的发送指针寄存器,再将要发送的字节个数赋给PDC的发送计数寄存器,然后无须CPU的干预,DMA自动起动串口发送操作,发送完这些数据后又自动停止;同理,只要将接收数据缓冲区的起始地址赋给串口DMA控制器的接收指针寄存器,再将要接收的字节个数赋给PCD的接收计数值,DMA将自动启动串口接收数据,接收完这些数据后,再通知CPU。
继承事业,薪火相传
返回列表