物联网之ARM体系结构及接口技术五(通讯接口)

通讯接口

设备间 通讯实现

串行通讯

单线             

双线  uart    (全双工 异步)

双线  i2c     (半双工  同步)

三线  spi     (全双工  同步)

并行通讯

        多根数据线 地址线,如内存

串口 UART 协议 

UART 内部机制

UART 编程

• 初始化

    管脚设置为UART模式

    串口协议设置(奇偶校验为,数据位等)

    串口波特率设置

• 发送字符

    发送状态判断

    发送

• 接收字符后环回

    接收状态判断

    接收

UART 程序

typedef struct {
   unsigned int GPA1CON;   //配置管脚模式  -- uart
   unsigned int GPA1DAT;   
}gpa1;
#define GPA1 (*(volatile  gpa1*)0x11400020)

typedef struct {
	unsigned int ULCON2;  //设置uart 帧格式 
	unsigned int UCON2;   //设置uart工作模式 -- poll 
	unsigned int UFCON2;
	unsigned int UMCON2;
    unsigned int UTRSTAT2; //查询发送和接收状态	
    unsigned int UERSTAT2;
	unsigned int UFSTAT2;
	unsigned int UMSTAT2;
	unsigned int UTXH2;  //发送(写)
	unsigned int URXH2;  //接收(读)
    unsigned int UBRDIV2;  //设置波特率整数部分
    unsigned int UFRACVAL2;  //设置波特率小数部分
	unsigned int UINTP2;
	unsigned int UINTSP2;
	unsigned int UINTM2;
}uart2;
#define UART2 ( * (volatile uart2 *)0x13820000 )
void uart_init()
{
  //-----管脚配置为uart 模式	 
  GPA1.GPA1CON = (GPA1.GPA1CON & ~0xFF ) | (0x22);       //GPA1_0:RX;GPA1_1:TX
  //-----Uart 模块的设置
 //设置uart 帧格式 为8 data bit 1 stop ,none pairty  
  UART2.ULCON2 =0x03;
 //设置uart 发送和接收为普通的polling 模式
   UART2.UCON2 = 0x5;		 
   /*设置uart 波特率为115200
* Baud-rate 115200: src_clock:100Mhz
* DIV_VAL = (100*10^6 / (115200*16) -1) = (54.3 - 1) = 53.3
	  * UBRDIV2 = (Integer part of 53.3) = 53 = 0x35
	  * UFRACVAL2 = 0.3*16 = 0x5
	  * */
	 UART2.UBRDIV2 = 0x35;
	 UART2.UFRACVAL2 = 0x5;
}
void putc(const char c)
{
        //检测发送缓存为空,则写入数据。否则死循环	
     while(!(UART2.UTRSTAT2 & 0X2)) ;
         UART2.UTXH2 = c;
}

汇编和C混合编程

1.  汇编过渡到C语言
    设置栈
    b       main
2.  C语言调用汇编函数
    //----------start.s
      .global  delay1s 
delay1s:
    cmp    r0,#1
    beq     delay1s_end
    sub     r0,r0,#1
     ldr      r4,=0x3ffffff   
delay1s_loop:
     sub    r4,r4,#1
     cmp   r4,#0         
     bne    delay1s_loop
     b       delay1s
delay1s_end:
 mov   pc,lr
//-----------main.c	
    int  main()
   {
      delay1s(3);  //R0 ~R3 对应4个输入参数
    }
3.  C语言中嵌入汇编
int  add(unsigned int a, unsigned int b )
{  
    int sum;
    asm volatile     //asm 声明为内联汇编 ,加volatile避免被编译器优化
   ( 
       "add  %0,%1,%2\n\t"   //汇编指令
         :"=r"(sum)           //输出操作符列表
         :"r"(a),"r"(b)        //输入操作符列表
         :"memory"
   );
    return sum;
}

链接脚本 map.lds

OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")

OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
    . = 0;
    . = ALIGN(4);
    .text :
    {
        start.o(.text)
        *(.text)
    }
    . = ALIGN(4);
    .data : 
    { *(.data) }
    . = ALIGN(4);
    .bss :
    { *(.bss) }
}

猜你喜欢

转载自blog.csdn.net/weixin_39148042/article/details/82470466
今日推荐