通讯接口
设备间 通讯实现
• 串行通讯
单线
双线 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) }
}