68.ARM裸机开发--USART操作(补充)

一.设备间通讯

  1. 单线
  2. 双线  uart    (全双工 异步)
  3. 双线  i2c     (半双工  同步)
  4. 三线  spi     (全双工  同步)
  5. 并行通讯  多根数据线 地址线,如内存

 

二.串口通讯协议

 

 

 

三. 串口内部机制

 

四.串口编程

1.初始化

    管脚设置为UART模式

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

    串口波特率设置

2.发送字符

    发送状态判断

    发送

3.接收字符后环回

    接收状态判断

    接收

 

五.汇编 c语言混合编程

Makefile进行编译,连接脚本进行链接。

all:
	arm-none-linux-gnueabi-gcc -fno-builtin -nostdinc -c -o start.o start.S
	arm-none-linux-gnueabi-gcc -fno-builtin -nostdinc -c -o main.o main.c
	arm-none-linux-gnueabi-ld start.o main.o -Tmap.lds -o uart.elf
	arm-none-linux-gnueabi-objcopy -O binary  uart.elf uart.bin
	arm-none-linux-gnueabi-objdump -D uart.elf > uart.dis
clean:
	rm -rf *.bak start.o main.o uart.elf uart.bin uart.dis

脚本map.lds

OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") //指定文件格式
OUTPUT_ARCH(arm)
ENTRY(_start) //连接之后的第一个地址是_start
SECTIONS
{
	. = 0x40008000;  /*指定链接的起始地址   */
	. = ALIGN(4);
	.text      :      //代码段开始
	{
		start.o(.text) //入口start.s
		*(.text)   //系统自动指定其他函数
	}
	. = ALIGN(4);
    .data : 		//	数据段开始
	{ *(.data) }
    . = ALIGN(4);
    .bss :
     { *(.bss) }
}

start.s(汇编部分)

    .global  delay1s 
    .text     
    .global _start
_start:
		b		reset                        @0x00
		ldr		pc,_undefined_instruction  @0x04
		ldr		pc,_software_interrupt     
		ldr		pc,_prefetch_abort
		ldr		pc,_data_abort
		ldr		pc,_not_used
		ldr		pc,_irq
		ldr		pc,_fiq

_undefined_instruction: .word  _undefined_instruction
_software_interrupt:	.word  _software_interrupt
_prefetch_abort:		.word  _prefetch_abort
_data_abort:			.word  _data_abort
_not_used:				.word  _not_used
_irq:					.word  _irq 
_fiq:					.word  _fiq


reset: 
	ldr	r0,=0x40008000      @设置异常向量表的启始地址为 0x40008000
	mcr	p15,0,r0,c12,c0,0		@ Vector Base Address Register

init_stack:
	ldr		r0,stacktop         /*get stack top pointer*/

	/********svc mode stack,为c函数的调用提供栈空间********/
		mov		sp,r0
		sub		r0,#128*4          /*512 byte  for irq mode of stack*/
	/****irq mode stack**/
		msr		cpsr,#0xd2
		mov		sp,r0
		sub		r0,#128*4          /*512 byte  for irq mode of stack*/
	/***fiq mode stack***/
		msr 	cpsr,#0xd1
		mov		sp,r0
		sub		r0,#0
	/***abort mode stack***/
		msr		cpsr,#0xd7
		mov		sp,r0
		sub		r0,#0
	/***undefine mode stack***/
		msr		cpsr,#0xdb
		mov		sp,r0
		sub		r0,#0
   /*** sys mode and usr mode stack ***/
		msr		cpsr,#0x10
		mov		sp,r0             /*1024 byte  for user mode of stack*/

		b		main     //设置完栈后,跳转到C的main函数

delay1s:
     ldr      r4,=0x1ffffff   
delay1s_loop:
     sub    r4,r4,#1
     cmp   r4,#0         
     bne    delay1s_loop
     mov   pc,lr	

	.align	4

	/****  swi_interrupt handler  ****/

stacktop:    .word 		stack+4*512

.data

stack:	
  .space  4*512
.end

main.c

/*
  功能:   实现通过串口com3 输出字符显示

  1. 看电路图找到CPU对应的控制管脚   GPA1_5 GPA1_4
  2. 看芯片手册,找到对应寄存器
     a. 配置管脚为串口模式
     b. 功能块设置
  3. 编程   
*/

#define  GPA1CON    (*(volatile unsigned int *)0x11400020)
#define  ULCON3     (*(volatile unsigned int *)0x13830000) 
#define  UCON3      (*(volatile unsigned int *)0x13830004) 
#define  UBRDIV3    (*(volatile unsigned int *)0x13830028) 
#define  UFRACVAL3  (*(volatile unsigned int *)0x1383002C) 
#define  UTXH3     (*(volatile unsigned int *)0x13830020) 
#define  UTRSTAT3   (*(volatile unsigned int *)0x13830010) 


void uart_init(void)
{
  //-----外: 配置管脚的工作模式
  GPA1CON |= 0x220000;  //配置GPA1_5 GPA1_4 为uart串口模式
  
  //-----内: 功能块设置
  //1.  uart 通讯协议格式的设置
  ULCON3 = 0x03;  //设置协议格式(  无校验位  1个停止位 8个数据位)
  UCON3 = 0x05;   //设置串口发送接收模式为polling模式
  
  /*2.  设置uart 的速度为115200
  DIV_VAL = (100000000/(115200 *16)) - 1 = 53.253
  UBRDIVn =  53
  UFRACVALn/16 = 0.253
  Therefore, UFRACVALn = 4
  */
  UBRDIV3 = 53;
  UFRACVAL3 = 4;
    
}

void putc(char c)
{
   while(1)
   {
      if(UTRSTAT3&0x02)  //检测发送是否为空
      {
         break;
      }
   }
   
   UTXH3 = c;  //发送字符
}

int main(void) 
{
  uart_init();
	while(1)
	{
      putc('f');
	  delay1s(); //调用汇编中的1s延时
	}
	return 0;
}

 

STM32-F407霸天虎是一款嵌入式微控制器,功能强大,性能稳定,广泛应用于物联网、医疗器械、工业自动化等领域。它具备多种高级外设包括USB、CAN、SDIO和Ethernet,支持多种编程语言,适合各种应用场景。 要实现零死角玩转STM32-F407霸天虎,需要掌握一些关键技能。首先,需要熟悉STM32芯片的基本原理和硬件接口,包括GPIO、USART、SPI、ADC等。其次,需要掌握ARM Cortex-M4内核的精华特性,如DSP和浮点运算单元。然后,需要了解常用的编程语言和开发环境,如Keil、IAR和CubeMX。最后,需要根据具体应用场景选择合适的外设驱动程序,并进行调试和优化。 在进行STM32-F407霸天虎开发时,建议按照以下步骤进行: 1. 深入了解STM32-F407霸天虎的硬件特性和技术规格,并准备好开发工具和开发环境。 2. 安装相应的开发软件和调试工具,并熟悉其基本操作。可以使用Keil编译器、ST-Link调试器等。 3. 根据实际需求设计硬件电路,并连接相应的外设。根据需要编写相应的设备驱动程序。 4. 编写基于实时操作系统或裸机代码的应用程序。要注意遵循严格的软件工程规范和代码风格。 5. 调试和优化代码,进行性能评估和测试,并进行最终集成和部署。 通过上述步骤,可以实现完整的STM32-F407霸天虎开发过程。需要注意的是,对于不同的应用场景和需求,开发过程可能会有所不同。建议在实践中不断积累经验并探索新的技术,以达到更好的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值