STM32串口通讯学习


一、寄存器与基于固件库的stm32 LED流水灯例子的编程方式有什么差异

两个使用的角度不同

使用固件库,目前比较多的例程是使用固件库编写的。官方的例子也都采用固件库方式。特点就是简单,易于理解,资料多。如果你没有CortexM系列内核的开发基础,建议从固件库开始玩起。等有一定基础,或是特别需要时再用寄存器。

使用寄存器,想要深入理解CortexM3内核或是需要为了获得更好的可移植性,学习寄存器编程会比较有帮助。但是从专业的角度上看,寄存器更贴近底层,对外设的工作原理和运行机理会有更深的理解。

二、STM32的USART窗口通讯程序

学习和阅读“零死角玩转STM32F103–指南者”文档中的第20、21章内容,完成STM32的USART窗口通讯程序,要求:

1)设置波特率为115200,1位停止位,无校验位。

2)STM32系统给上位机(win10)连续发送“hello windows!”,上位机接收程序可以使用“串口调试助手“,也可自己编程。

3)当上位机给stm32发送“Stop,stm32”后,stm32停止发送。

需要下载如图示三个软件,USB转串口驱动,调试助手,串口下载软件
在这里插入图片描述
将开发板与电脑连接,打开串口驱动,安装;稍后会弹窗提示驱动安装成功
在这里插入图片描述
此处我使用的代码是野火官方的代码,但是需要修改串口中断服务函数 stm32f10x_it.c 和主函数 main.c

// 串口中断服务函数
int i=0;
uint8_t ucTemp[50];
void DEBUG_USART_IRQHandler(void)
{
	if(USART_GetITStatus(DEBUG_USARTx,USART_IT_RXNE)!=RESET)
	{		
		ucTemp[i] = USART_ReceiveData(USART1);    
	}	
  if(ucTemp[i] == '!')
	{
		if(ucTemp[i-1] == '2'&&ucTemp[i-2] == '3'&&ucTemp[i-3] == 'm'&&ucTemp[i-4] == 't'&&ucTemp[i-5] == 's'&&ucTemp[i-6] == ' ')
			if(ucTemp[i-7] == 'p'&&ucTemp[i-8] == 'o'&&ucTemp[i-9] == 't'&&ucTemp[i-10] == 'S')
			{
				printf("停止");
        while(1);
			}
	}
	i++;	
}

main.c

void delay(uint32_t count)
{
	while(count--);
}
int main(void)
{	
  USART_Config();
  while(1)
	{	
		printf("hello windows!\n");
		delay(5000000);
	}	
}

操作流程如下:搜索串口,更改bps至:115200,勾选校验和编程后执行,下方的弹窗选择DTR低电平复位,RTS高电平BootLoader,选择所需的.hex文件,最后点击开始编程
在这里插入图片描述
下载成功后会提示命令执行完毕,一切正常

在这里插入图片描述
打开调试助手,打开串口,就可以发现开发板在向主机发送hello world!向开发板发送Stop stm32!即可停止程序
在这里插入图片描述

三、Ubuntu编程

重温C语言程序里全局变量、局部变量、堆、栈等概念,并在ubuntu系统中编程,输出信息进行验证;

1.全局变量

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char g_buf[16];
char g_buf2[16];
char g_buf3[16];
char g_buf4[16];
int main()
{
        printf("g_buf: 0x%x\n", g_buf);
        printf("g_buf2: 0x%x\n", g_buf2);
        printf("g_buf3: 0x%x\n", g_buf3);
        printf("g_buf4: 0x%x\n", g_buf4);
        return 0;
}


在这里插入图片描述
地址向上增长,存放在全局存储区

2.局部变量

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main()
{

        char l_buf[16];
        char l_buf2[16];
        char l_buf3[16];
        printf("l_buf: 0x%x\n", l_buf);
        printf("l_buf2: 0x%x\n", l_buf2);
        printf("l_buf3: 0x%x\n", l_buf3);
}

在这里插入图片描述
地址同样是向上增加,存放在静态存储区

四、在Keil中针对stm32系统进行编程,调试变量

重温C语言程序里全局变量、局部变量、堆、栈等概念,在Keil中针对stm32系统进行编程,调试变量,进行验证; 通过串口输出信息到上位机,进行验证。
并归纳出stm32的堆、栈、全局变量的分配地址,与ARM教材中的地址分配进行对比。

此处使用的还是野火的代码,但是将主函数修改如下,操作流程与第二部分一致

#include "stm32f10x.h"
#include "bsp_usart.h"
char g_buf[16];
char g_buf2[16];
char g_buf3[16];
	
int main(void)
{	
	char l_buf[16];
  char l_buf2[16];
  char l_buf3[16];

  USART_Config();

  printf("g_buf: 0x%p\n", g_buf);
  printf("g_buf2: 0x%p\n", g_buf2);
  printf("g_buf3: 0x%p\n", g_buf3);
	 
  printf("l_buf: 0x%p\n", l_buf);
  printf("l_buf2: 0x%p\n", l_buf2);
  printf("l_buf3: 0x%p\n", l_buf3);
  while(1)
	{	
		
	}	
}

在这里插入图片描述

#include "stm32f10x.h"
#include "bsp_usart.h"
#include <stdlib.h>
int main(void)
{	
  static char st1[16];
  static char st2[16];
  static char st3[16];
  char *p1;
  char *p2;
  char *p3;
  USART_Config();

  printf("st1: 0x%p\n", st1);
  printf("st2: 0x%p\n", st2);
  printf("st3: 0x%p\n", st3);
	 
  p1 = (char *)malloc(sizeof(char) * 16);
  p2 = (char *)malloc(sizeof(char) * 16);
  p3 = (char *)malloc(sizeof(char) * 16);
	
  printf("p1: 0x%p\n", p1);
  printf("p2: 0x%p\n", p2);
  printf("p3: 0x%p\n", p3);
  while(1)
	{	
	}	
}

在这里插入图片描述

五、总结

本次作业硬件使用的是stm32指南者系列,与以往不同需要对硬件进行调试,从软件的编写到硬件的应用是一个很大的跨度,希望在下次学习进步

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值