Cortex-M3学习日志(四)-- UART0实验

发布者:qpb1234最新更新时间:2016-04-06 来源: eefocus关键字:Cortex-M3  UART0实验 手机看文章 扫描二维码
随时随地手机看文章
LPC1768含有4 个符合16C550工业标准的异步串口UATR0-UART3,其中UART1具有标准的MODEM接口和RS232。至于RS232的标准是什么样的,这里不在总结了,如果哪位有兴趣可以上网查一下维基百科。RS-485是后期出现的一个传输标准,关于它们的特性,下面列表总结一下:

RS-232特性

RS-485特性

最高速率约为20kb/s

与TTL电平兼容

传输最大距离约为15m

传输距离实际达1200m

共模抑制比能力差

共模抑制比能力强

UATR0/2/3可以工作在UART模式下,也可以工作在IrDA模式下, IrDA是红外数据组织(Infrared Data Association)的简称,目前广泛采用的IrDA红外连接技术就是由该组织提出的。到目前为止,全球采用IrDA技术的设备超过了5000万部。IrDA已经制订出物理介质和 协议层规格,以及2个支持IrDA标准的设备可以相互监测对方并交换数据。 初始的IrDA1.0 标准制订了一个串行,半双工的同步系统,传输速率为2400bps到115200bps,传输范围1 m,传输半角度为15度到30度。最近IrDA扩展了其物理层规格使数据传输率提升到4Mbps。IrDA数据协议由物理层,链路接入层和链路管理层三个基本层协议组成,另外,为满足各层上的应用的需要,IrDA栈支持IrLAP, IrLMP, IrIAS, IrIAP, IrLPT, IrCOMM, IrOBEX和IrLAN等。IrDA的优点是成本低,体积小、功耗低,数据传输干扰小等。关于IrDA的协议与应用这里暂时先不总结,后续学习中会再慢慢涉及到,届时将做深入研究。UATR1具有MODEM接口,能过该接口可以接入电话网络,实现远距离通讯。至于怎么通讯,这里也暂时不总结,因为这一块懒猫也没有深入研究。

关于串口的配置主要涉及到引脚的配置,波特率的配置,帧格式的设置及FIFO设置等。涉及到的寄存器主要有接收缓冲寄存器,它包含即将读取的接收数据。发送保持寄存器,它主要是用来写入发送数据的,中断使能寄存器IER,若是用到中断接收或发送时需配置些寄存器,与之相关联的寄存器还有中断标志寄存器IIR。还有FIFO控制寄存器FCR,它是用来配置先进先出相关的东东的。线控制寄存器LCR,这个寄存器主要就是用来设置帧格式的,与这个寄存器相关联的寄存器是线状态寄存器LSR,用来读取帧格式状态的寄存器。当然还有缓存寄存器SCR,这个与串口操作关系不大。还有自动波特率控制器ACR,配置程序自适应波特率的。还有IrDA控制寄存器,它与红外发送与接收有关。小数分频寄存器FDR,它是波特率配置有关。传输使能寄存器TER,如果这个寄存器的TXEN配置为1,刚只要缓存中有有效数据,就可以通过发送引脚把数据发送出去。还有一个寄存器FIFO等级寄存器FIFOLVL,它是个只读寄存器,用来读取当前FIFO等级状态。此次实验我是用查询方式发送字符到串口,所以很大寄存器没有用到,关于寄存器的详细说明可以参考LPC1768的数据手册,这里就不再照搬手册了。下面简单说一下这次实验电路图,主要是一个 按键,8个LED灯,还有串口0,功能就是按一下按键亮一个灯,等全亮时,再按按键灯全来,然后再按按键时第按一下点亮一个,循环往复,同时哪个灯亮,就发送字符“Led   on”,下面是这次实验的电路图:

Cortex-M3学习日志(四)-- <wbr>UART0实验
Cortex-M3学习日志(四)-- <wbr>UART0实验
Cortex-M3学习日志(四)-- <wbr>UART0实验

                                      图 1-1 实验电路图

下面简单说一下这个软件,软件主要分为两大部分,一个是关于串口配置及常用的函数,另一个就是主LED点灯程序,分别在UART.C与MAIN.C两个源文件中,下面把部分代码帖出来,完整部分请参阅附件:

(1)、 uart.c源文件

#include "includes.h"

 

void UARTInit( uint32_t PortNum, uint32_t baudrate )

{

  uint32_t Fdiv;

 

  if ( PortNum == 0 )

  {

    PINCON->PINSEL0 |= (1 << 4);             

    PINCON->PINSEL0 |= (1 << 6);             

 

            UART0->LCR  = 0x83;                       

    Fdiv = (SystemFrequency/4/ 16) / baudrate;

    UART0->DLM  = Fdiv / 256;

    UART0->DLL  = Fdiv % 256+1;

    UART0->LCR  = 0x03;                       

    UART0->FCR  = 0x07;                       

 

  }

  else if ( PortNum == 1 )

  {

               PINCON->PINSEL4 |= (1<<1);                

          PINCON->PINSEL4 |= (1<<3);                

   

               UART1->LCR = 0x83;                                  

    Fdiv = (SystemFrequency/4/16)/ baudrate ;

    UART1->DLM = Fdiv/256;                                                                                             

    UART1->DLL = (Fdiv%6)+1;

               UART1->LCR = 0x03;                                   

    UART1->FCR = 0x07;                             

 

  }

}

 

 

void UARTSend( uint32_t portNum, uint8_t *BufferPtr, uint32_t Length )

{

  if ( portNum == 0 )

  {

    while ( Length != 0 )

    {

                 while ( !(UART0->LSR & 0x20) );   

                 UART0->THR = *BufferPtr;           

                 BufferPtr++;                       

                 Length--;                          

               }

  }

  else

  {

               while ( Length != 0 )

    {

                 while ( !(UART1->LSR & 0x20));    

                 UART1->THR = *BufferPtr;                                         

                 BufferPtr++;                                                                                  

                 Length--;                                                                                         

    }

  }

  return;

}

 

int UART0_SendByte (int ucData)

{

               while (!(UART0->LSR & 0x20));

    return (UART0->THR = ucData);

}

 

void UART0_SendString (unsigned char *s)

{

            while (*s != '\0')

               {

                        UART0_SendByte(*s++);

               }

}

(2)、 main.c源文件

#include"includes.h"

                                                                                                                                  

volatile unsigned long SysTickCnt;                   

unsigned char LedOnMeg[] = "Led 1 On!\r\n";

unsigned char LedOffMeg[] = "Led all Off!\r\n";

unsigned char KeyMeg[] = "key push down \r\n";

unsigned char OpenString[][50] = {

                                "**********************************************\r\n",

                                "****             --欢迎光临--             ****\r\n",

                                                                                                                 "**** 小野兽的小草窝^_^                    ****\r\n",

                                                                                                                 "**** http://blog.ednchina.com/ytfdhb/     ****\r\n",

                                                                                                                 "**** 我是懒猫爱飞,我的口号是:           ****\r\n",

                                                                                                                 "**** 每天进步一点点,开心多一点^_^        ****\r\n",

                                                                                                                 "**********************************************\r\n"

                                                                                                       };

 

unsigned int key_sta = 0;              

unsigned int key_pre = 1;                 

unsigned int key_old = 1;                                      

unsigned int led_flag = 0;

 

unsigned int  StepCnt = 0;        

 

 

void SysTick_Handler (void)

        

  SysTickCnt++;

}

 

 

void DelayMs (unsigned long tick)

    

  unsigned long systickcnt;

 

  systickcnt = SysTickCnt;

 

  while ((SysTickCnt - systickcnt) < tick);

}

 

void PortInit(void)

{

   GPIO1->FIODIR = 0xB0000000;           

   GPIO2->FIODIR = 0x0000007C;           

   LedAllOff();                                                                                                

}

 

 

void KeyScan()

{

               key_pre = KEY_EN ;

               if(!KEY_EN )                      

               {

                             if(key_old)

                             {

                                 if(key_pre == 0)         

                                 {

                                            key_sta = 1;            

                                  

                   }

               }

               key_old = key_pre;

}

 

 

void KeyHandle(void)

{

    if(key_sta == 1)

    {

                   StepCnt++;                        

                             if(StepCnt == 9)

                             {

                                           UART0_SendString (LedOffMeg);                   

                             }

                              if(StepCnt < 9)

                             {

                                           LedOnMeg[4] = StepCnt+0x30;       

                 UART0_SendString (LedOnMeg);                                       

                             }

                             key_sta = 0;                     

                          

}

void LedHandle()

{

               switch(StepCnt)

               {

                             case 1:Led1On();   

                                    break;

                             case 2:Led2On();   

                                    break;

                   case 3:Led3On();   

                                    break;

                   case 4:Led4On();   

                                    break;

                             case 5:Led5On();   

                                    break;

                             case 6:Led6On();   

                                    break;

                             case 7:Led7On();   

                                    break;

                             case 8:Led8On();   

                                    break;

                   case 9:LedAllOff();         

                                    StepCnt = 0;               

                                    break;

 

                             default:break;

               }

}

 

 

int main(void)

{

    unsigned int i = 0;

 

               SystemInit();       

               SysTick_Config(SystemFrequency/1000 - 1);

                                                      

    PortInit();                              

 

               UARTInit(0,19200);                         

               for(i=0;i<7;i++)

               {

                             UARTSend(0,OpenString[i],50);           

               }

 

//LedOnMeg[4] = 4+0x30;                    

//UART0_SendString (KeyMeg);

 

               while(1)

               {

                 KeyScan();   // 按键扫描

 

                 KeyHandle(); // 按键处理

 

                 LedHandle(); // Led处理程序

               }

}

程序不是太难,只是简单的实验,各个部分都有详细的注释,这里不在总结,下面是挨靠结果串口调试助手截图:

Cortex-M3学习日志(四)-- <wbr>UART0实验

图 1-2 串口助手截图

好了,先总结到这吧,最近手头上的事有点多,所以写日志的时间就有点紧张,不过,工作归工作,该学习的东东还是要坚持学习的,没有足够的时间,那就见缝插针的学吧。

关键字:Cortex-M3  UART0实验 引用地址:Cortex-M3学习日志(四)-- UART0实验

上一篇:Cortex-M3学习日志(五)-- -- DAC实验
下一篇:Cortex-M3学习日志(三)-- 外部中断0

推荐阅读最新更新时间:2024-03-16 14:49

基于Cortex-M3的嵌入式以太网门禁系统设计
内容摘要:阐述了采用Cortex—M3內核的STM32为主控芯片、射频芯片PN532、以太网控制器ENC28J60的硬件 电路 和软件设计框架,同时对以太网协议LwIP进行了详细的分析。本门禁系统传输距离远,超低功耗,性能优异且稳定,完全适用于校园以及公司的门禁系统。 引 言 当前,有很多的企业是采用佩戴工作证来完成门禁管理,而且还是采用传统的人工方式完成,不仅容易被人混入,且没有记录,存在各种人为的失误。同时,市场上门禁系统存在传输距离受限制、性能不佳等问题。 随着嵌入式技术日新月异的发展,以及以太网技术的普及,使得基于以太网的嵌入式产品越来越多,发展也越来越快。本文研究的就是采用以太网传输数据和射频芯片识别智能
[单片机]
基于<font color='red'>Cortex-M3</font>的嵌入式以太网门禁系统设计
μCOS-II在ARM Cortex-M3处理器上的移植
0 引言     嵌入式系统已经广泛渗透到了人们工作、生活中的各个领域,嵌入式处理器已占分散处理器市场份额的94%,其中ARM的应用最为广泛。基于ARM内核的处理器以其诸多优异性能而成为各类产品中选用较多的处理器之一。     当系统越来越大,应用越来越多时,就出现了如何管理众多的硬件资源,以及如何满足系统的实时控制要求和如何提高系统软件开发效率等不可回避的问题。这时,使用嵌入式操作系统很有必要。操作系统的主要作用有:统一管理系统资源;为用户提供访问硬件的接口;调度多个应用程序和管理文件系统等。 1 概述     μC/OS-II是著名的、源码公开的实时内核,是专为嵌入式应用设计的,可用于各类8位、16位和32位处
[嵌入式]
以ARM处理器为基础的吸尘机器人硬件设计方案详解
随着人们生活水平的日益提高,我国人口的老龄化也越来明显,吸尘机器人作为服务机器人的一种,能够代替人进行清扫房间、车间、墙壁等一些简单劳动。 使服务机器人有了广阔的场,已成为一些企业和科研院所研究的焦点。目前市场上的吸尘机器人虽然也具有智能性,但大多由于结构不尽合理、通用性差、集成度高而导致成本高,不利于普及。在研究总结市场上相对成熟产品的基础上,基于ARM Cortex-M3处理器设计一款具备自我导航功能的室内吸尘机器人。外形紧凑、结构简单、运行平稳、噪音小,并且成本低,操作方便,还具有可扩展接口,用户能够根据实际需要对其功能做进一步开发。 1吸尘机器人总体构成 利用ARM Cortex-M3处理器设计一款应用于室内的移动
[单片机]
以ARM处理器为基础的吸尘机器人硬件设计方案详解
Cortex-M3工作模式与异常
一、工作模式 线程模式和手柄模式。 当处理器处在线程状态下时,既可以使用特权级,也可以使用用户级;另一方面, handler模式总是特权级的。在复位后,处理器进入线程模式+特权级。 二、异常和中断 Cortex-M3 支持大量异常,包括 16-4-1=11个系统异常,和最多 240 个外部中断——简称 IRQ。具体使用了这 240 个中断源中的多少个,则由芯片制造商决定。由外设产生的中断信号,除了 SysTick的之外,全都连接到 NVIC 的中断输入信号线。典型情况下,处理器一般支持 16 到 32 个中断。 类型编号为 1-15 的系统异常,从 16 开始是外部中断类型。 三、向量表 因为地址 0
[单片机]
基于Cortex-M3的STM32微控制器处理先进电机控制方法
变频器的问世和先进的电机控制方法让三相无刷电机(交流感应电机或永磁同步电机)曾经在调速应用领域取得巨大成功。这些高性能的电机驱动器过去主要用于工厂自动化系统和机器人。十年来,电子元器件的大幅降价使得这些电机驱动器能够进入对成本敏感的市场,例如:家电、空调或个人医疗设备。本文将探讨基于ARM的标准微控制器如何在一个被DSP和FPGA长期垄断的市场上打破复杂的控制模式,我们将以意法半导体的基于Cortex-M3 内核的STM32系列微控制器为例论述这个过程。 图 3 : STM32: 强固的增长基础 首先,我们回顾一下电机控制的基本原理。在电机控制系统内,为什么处理器非常重要?我们为什么需要非常好的计算性能?毕竟,
[单片机]
基于<font color='red'>Cortex-M3</font>的STM32微控制器处理先进电机控制方法
Cortex-M3简介
Cortex-M3是一个32位的核,在传统的单片机领域中,有一些不同于通用32位CPU应用的要求。谭军举例说,在工控领域,用户要求具有更快的中断速度,Cortex-M3采用了Tail-Chaining中断技术,完全基于硬件进行中断处理,最多可减少12个时钟周期数,在实际应用中可减少70% 中断。 概述 单片机的另外一个特点是调试工具非常便宜,不象ARM的仿真器动辄几千上万。针对这个特点,Cortex-M3采用了新型的单线调试(Single Wire)技术,专门拿出一个引脚来做调试,从而节约了大笔的调试工具费用。同时,Cortex-M3中还集成了大部分存储器控制器,这样工程师可以直接在MCU外连接Flash,降低了设计难度和
[单片机]
采用Cortex-M3单片机设计的WiFi物联网小车
  WiFi物联网小车设计方案,采用电脑上位机软件通过无线WiFi 控制小车的运动,采集小车的信息。与传统的“智能小车”相比,主要特点在于使用32 位高性能单片机控制、互联网通信机制和电脑上位机软件控制。此方案融合了电脑软件、网络通信、图像处理、图形显示、运动控制、速度采集和温度采集等技术,具有“物联网”的相关特点。传统的小车控制大多使用红外通信,使用遥控器进行控制,不但受到距离的限制,而且远没有电脑软件直观美观。互联网通信使小车具备远程控制的能力,这是红外通信望尘莫及的。此外,本方案小车控制芯片采用Cortex-M3单片机,该单片机具有极丰富的外设,这给小车以后功能升级和扩展奠定了基础。   1 总体设计方案   WiFi
[单片机]
采用<font color='red'>Cortex-M3</font>单片机设计的WiFi物联网小车
ST最新开发工具为了解基于STM32 ARM Cortex-M3 MCU开方便之门
完整的低成本的评估开发工具通过图形界面探索微控制器的性能和功能 中国,2007年11月6日 — 意法半导体(纽约证券交易所:STM)今天公布了一个价格非常低廉的微控制器开发套件STM32 PerformanceStick,这套开发工具是近日推出的基于ARM Cortex-M3内核的STM32系列微控制器的配套产品。ST设计这套紧凑的开发工具是为了便于用户了解新微控制器的功能和性能,特别值得一提的是,用户可以通过一个图形界面查看微控制器在不同条件下的性能特性。为了鼓励和帮助设计工程师修改和重新编写应用程序源代码,工具包还含有示例应用软件和一套完整的Hitex软件工具。 STM32 PerformanceStick是一套功能完整
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多精选电路图
换一换 更多 相关热搜器件
更多每日新闻
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved