STM32的USART窗口通讯

一、寄存器与基于固件库的stm32 LED流水灯的差异

(一)基于寄存器的LED流水灯程序

1、stm32f10x.h

/*片上外设基地址 */
#define PERIPH_BASE ((unsigned int)0x40000000)

/*总线基地址,GPIO 都挂载到 APB2 上 */
#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)
#define AHBPERIPH_BASE  (PERIPH_BASE +0x20000)
/*GPIOC 外设基地址*/
#define GPIOC_BASE            (APB2PERIPH_BASE + 0x1000)
//GPIOC_BASE=0x40000000+0x10000+0x1000=0x40011000,该地址为GPIOC的基地址
/* GPIOB 寄存器地址,强制转换成指针 */
#define GPIOC_CRL *(unsigned int*)(GPIOC_BASE+0x00)
#define GPIOC_CRH *(unsigned int*)(GPIOC_BASE+0x04)
#define GPIOC_IDR *(unsigned int*)(GPIOC_BASE+0x08)
#define GPIOC_ODR *(unsigned int*)(GPIOC_BASE+0x0C)
#define GPIOC_BSRR *(unsigned int*)(GPIOC_BASE+0x10)
#define GPIOC_BRR *(unsigned int*)(GPIOC_BASE+0x14)
#define GPIOC_LCKR *(unsigned int*)(GPIOC_BASE+0x18)
 
/*RCC 外设基地址*/
#define RCC_BASE (AHBPERIPH_BASE + 0x1000)
/*RCC 的 AHB1 时钟使能寄存器地址,强制转换成指针*/
#define RCC_APB2ENR *(unsigned int*)(RCC_BASE+0x18)

2、main.c

int main(void)
{
// 函数为空,目的是为了骗过编译器不报错
void SystemInit(void)
{
}
// 开启 GPIOB 端口时钟
RCC_APB2ENR |= (1<<3);
//清空控制 PB0 的端口位
GPIOB_CRL &= ~( 0x0F<< (4*0));
// 配置 PB0 为通用推挽输出,速度为 10M
GPIOB_CRL |= (1<<4*0);
// PB0 输出 低电平
GPIOB_ODR |= (0<<0);
while (1);
}

(二)基于固件库的LED流水灯程序

1、bsp_led.c

//初始化GPIO函数
void LED_GPIO_Config(void)
{		
		/*定义一个GPIO_InitTypeDef类型的结构体*/
		GPIO_InitTypeDef GPIO_InitStructure;

		/*开启LED相关的GPIO外设时钟*/
		RCC_APB2PeriphClockCmd( LED1_GPIO_CLK | LED2_GPIO_CLK , ENABLE);
		/*选择要控制的GPIO引脚*/
		GPIO_InitStructure.GPIO_Pin = LED1_GPIO_PIN;	

		/*设置引脚模式为通用推挽输出*/
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   

		/*设置引脚速率为50MHz */   
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 

		/*调用库函数,初始化GPIO*/
		GPIO_Init(LED1_GPIO_PORT, &GPIO_InitStructure);	
		
		/*选择要控制的GPIO引脚*/
		GPIO_InitStructure.GPIO_Pin = LED2_GPIO_PIN;

		/*调用库函数,初始化GPIO*/
		GPIO_Init(LED2_GPIO_PORT, &GPIO_InitStructure);		

		/* 关闭所有led灯	*/
		GPIO_SetBits(LED1_GPIO_PORT, LED1_GPIO_PIN);
		
		/* 关闭所有led灯	*/
		GPIO_SetBits(LED2_GPIO_PORT, LED2_GPIO_PIN);
}

2、main.c

#include "stm32f10x.h"
#include "./led/bsp_led.h"
#define SOFT_DELAY Delay(0x0FFFFF);
void Delay(__IO u32 nCount);
int main(void)
{
/* LED 端口初始化 */
LED_GPIO_Config();
while (1)
{
LED1_ON; // 亮
SOFT_DELAY;
LED1_OFF; // 灭
LED2_ON; // 亮
SOFT_DELAY;
LED2_OFF; // 灭
LED3_ON; // 亮
SOFT_DELAY;
LED3_OFF; // 灭
/*轮流显示 红绿蓝黄紫青白 颜色*/
LED_RED;
SOFT_DELAY;
LED_GREEN;
SOFT_DELAY;
LED_BLUE;
SOFT_DELAY;
LED_YELLOW;
SOFT_DELAY;
LED_PURPLE;
SOFT_DELAY;
LED_CYAN;
SOFT_DELAY;
LED_WHITE;
SOFT_DELAY;
LED_RGBOFF;
SOFT_DELAY;
}
}
void Delay(__IO uint32_t nCount) //简单的延时函数
{
for (; nCount != 0; nCount--);
}

(三)固件库开发与及寄存器开发对比

在这里插入图片描述
2、对比基于固件库的库开发方式来说,直接配置寄存器方式的缺点有:
(1) 开发速度慢
(2) 程序可读性差
(3) 维护复杂

这些缺陷直接影响了开发效率,程序维护成本,交流成本。库开发方式则正好弥补了这些缺陷。

而坚持采用直接配置寄存器的方式开发的程序员会认为它有以下的优点:
(1) 具体参数更直观
(2) 程序运行占用资源少

相对于库开发的方式,直接配置寄存器方式生成的代码量的确会少一点,但因为STM32 有充足的资源,权衡库的优势与不足,绝大部分时候,我们愿意牺牲一点 CPU 资源,选择库开发。一般只有在对代码运行时间要求极苛刻的地方,才用直接配置寄存器的方式代替,如频繁调用的中断服务函数。

二、STM32的USART窗口通讯

(一)所需仪器/软件

开发板:野火指南者(STM32F103VET6高速版)带3.2寸屏
代码编译:Keil5
USBQ驱动:CH340
串口调试助手Fire Tools(v1.0.1.5)

(二)实验前准备

1、把开发板按照说明书连接好,连接到电脑上,拨动左下角开关,红灯亮说明开关打开,新的开发板屏幕显示如手机界面相似的界面。
在这里插入图片描述

但是我之前已经烧录了别的程序进去,所以现在屏幕是灭的,等你们烧录程序进去后也会灭,不要慌张,这是正常的。

2、安装USB转串口驱动CH340
1)首先保证指南者开发板连接在电脑上
2)打开你购买指南者开发板时获得的资料,点击5-开发软件
在这里插入图片描述
3)进去后是几个压缩包,解压,打开USB转串口驱动_CH340
在这里插入图片描述
4)然后双击CH341SER进行安装,小窗口出现后点击安装,此时要保证开发板连接在电脑上且处于通电状态,否则会显示安装失败。如图显示则安装成功。
在这里插入图片描述
3、安装串口多功能调试助手Fire Tools
1)进入多功能调试助手文件夹
在这里插入图片描述
2)打开新版的Fire Tools,进入Fire Tools文件
在这里插入图片描述
3)双击打开名称为Fire Tools的应用程序,备用
在这里插入图片描述
4)此时显示设置串行口调试设置波特率为115200,1位停止位,无校验位
在这里插入图片描述

(三)开始实验

默认你们的Keil5已经安装好,还没安装的同学去安装好了再回来继续看。
1、Keil5源程序准备
1)打开资料中的程序源码_教程文档->《STM32库开发实战指南》->21-USART—串口通信
在这里插入图片描述
2)找到USART1接发->Project->RVMDK(uv5)->BH-F103工程文件
在这里插入图片描述
3)打开工程如图
在这里插入图片描述
2、程序修改
1)找到USER文件下的stm32f10x_it.c文件和main.c文件
2)修改stm32f10x_it.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++;
}

2)修改主函数main.c:

#include "stm32f10x.h"
#include "bsp_usart.h"


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

3)保存并编译,查看是否有程序错误
在这里插入图片描述
3、程序调试
1)点击魔术棒,在打开的窗口中选中Output,勾选生成KEX文件
在这里插入图片描述
2)选中Debug,在Use窗口选中CMSIS-DAP Debugger
在这里插入图片描述
3)下一个Utilities,勾选Use Debug Driver
在这里插入图片描述
4)回到Debug选项,进入Settings
在这里插入图片描述
5)在Settings中的Debug选项,按照如图设置
在这里插入图片描述

如果CMSIS-DAP和SWDIO处没有显示出开发板,首先检查开发板和电脑的连接是否正确,开发板是否通电,若还是显示不出,往下滑到第五、更新驱动 部分参考解决。

6)点击Flash Download,按箭头1处设置,此时箭头2所指方框处应显示读取的开发板相关信息,若信息不对,可通过Add添加,按OK确认设置。
在这里插入图片描述
4、烧录程序
1)上述配置好后,重新编译检查错误,若正确,点击load把程序烧录到开发板中。
在这里插入图片描述
2)烧录过程中左下角有进度条,烧录成功后有如图显示。
在这里插入图片描述

(四)实验结果

此时打开刚刚的多功能调试助手,点击左边的打开串口,会看到数据接收区显示程序运行结果,在指令区向程序发送“stop stm32!"的指令,程序停止,且显示”收到!”。

在这里插入图片描述

(五)更新驱动

1、打开电脑的设备管理器,找到BETTER_USB,右键点击更新驱动程序
在这里插入图片描述
2、选择浏览我的计算机以查找驱动程序软件
在这里插入图片描述
3、让我从计算机上的可用驱动程序列表中选取
在这里插入图片描述
4、选择USB输入设备,然后下一步
在这里插入图片描述
5、更新成功,关闭。回到Keil5程序重新调试和配置,此时应该检测出了相应的开发板。
在这里插入图片描述
总结
以上就是STM32 的USART窗口通讯的相关内容。
上一篇博客写着写着就写成今天的上机内容了,但是并不是题目要求,人傻了。
参考资料:
《零死角玩转STM32——F103指南者》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值