STM32的USART窗口通讯程序

一、基于寄存器的stm32 LED流水灯程序

基于寄存器&基于固件库的stm32 LED流水灯例子的编程方式有什么差异
固件库:资料多,简单,易于理解。如果没有CortexM系列内核的开发基础,建议从固件库开始玩起。等有一定基础,再用寄存器。
寄存器:有更好的可移植性,学习寄存器编程会比较有帮助,程序运行占用资源少。
原理图如下
在这里插入图片描述

1. 创建一个keil工程(寄存器版)

  1. 打开keil,点击Project,选择New uVision Project
  2. 选择 CPU 型号,根据开发板进行选择
    在这里插入图片描述
  3. 在线添加库文件
    用寄存器控制 STM32 时,不需要在线添加库文件,可以直接关掉。
  4. 添加文件
    ①添加已经存在文件
    在新建的工程中添加启动文件(startup_stm32f10x_hd.s),该文件可以先到固件库中复制到此处startup_stm32f10x_hd.s。
    ②创建新文件
    stm32f10x.h
    手动新建,用于存放寄存器映射的代码,暂时为空。
    main.c
    手动新建,用于存放 main 函数,暂时为空。
  5. 配置魔术棒选项卡
    ①Target设置
    在这里插入图片描述

②Output设置
在这里插入图片描述

③Debug设置
在这里插入图片描述

2. 基于寄存器stm32 LED流水灯

  1. 寄存器的定义
    寄存器的功能是存储二进制代码,它是由具有存储功能的触发器组合起来构成的。一个触发器可以存储1位二进制代码,故存放n位二进制代码的寄存器,需用n个触发器来构成。

  2. GPIO (通用输入输出端口)
    STM32 可控制的引脚。
    实现代码

int main(void)
{
	// 配置RCC寄存器,开启 GPIOC 端口时钟配置RCC寄存器
	*(unsigned int *)0x40021018 |=(1<<4);
	// 配置CRL寄存器,配置 PC2 为通用推挽输出,速度为 10M
	//*(unsigned int *)GPIOC_CRL |=(1<<(4*2));
	*(unsigned int *)0x40011000 |=(1<<(4*2));
	//配置ODR寄存器,清空控制 PC2 的端口位
	//*(unsigned int *)GPIOC_ODR &=~(1<<2);
	*(unsigned int *)0x4001100C &=~(1<<2);
	while (1)
	{
	}
}

二、 基于固件库的stm32 LED流水灯程序

1. 创建一个keil工程(固件库版)

方法类似于寄存器的创建。
不同点

需要添加组文件夹。
在新建的工程中添加 5 个组文件夹,用来存放各种不同的文件,文件从本地建好的工程文件夹下获取,双击组文件夹就会出现添加文件的路径,然后选择文件即可。
C/C++选项卡设置
添加处理宏及编译器编译的时候查找的头文件路径。如果头文件路径添加有误,则编译的时候会报错找不到头文件。

2. 四、基于固件库stm32 LED流水灯

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);
}

main.c

#include "stm32f10x.h"
#include "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;		   // 灭
	}
}
void Delay(__IO uint32_t nCount)	 //简单的延时函数
{
	for(; nCount != 0; nCount--);
}

三、总结

经过这次体验,让我对stm32的串口通信有了更深入的理解,通过代码可以发送自己想要的字符,软件与硬件的结合非常神奇,但我对硬件的掌握还有待提高

STM32程序调试时,串口窗口通常用于查看微控制器通过Serial Peripheral Interface (SPI)、通用异步接收发送器(GAUSS)或USART(Universal Synchronous Asynchronous Receiver/Transmitter)模块发送和接收的数据。以下是进行串口调试的基本步骤: 1. **配置硬件**:确保STM32板上连接了正确的串口,如USART1、USART2等,并设置好相应的TX和RX引脚。 2. **编写代码**:在STM32的C/C++源码中,你需要初始化串口,设置波特率、数据位、停止位和校验位等参数。例如,`USART_Init()`函数可用于初始化USART。 ```c USART_InitTypeDef USART_InitStructure; USART_InitStructure.USART_BaudRate = YOUR_BAUD_RATE; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; HAL_UART_Init(&huart1, &USART_InitStructure); ``` 3. **启用中断**:为了实时监听串口数据,需要开启USART接收中断,如`USART_IT_RXNE`。 4. **处理中断**:在`HAL_UART_RxCpltCallback`或其他适当的中断服务函数中,读取接收到的数据并将其打印到串口窗口。 ```c void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle) { if(HAL_UART_GetDataCount(UartHandle) > 0) { uint8_t data = HAL_UART_Receive(UartHandle, &received_data, 1, 100); // 打印到串口窗口 printf("Received: %d\n", received_data); } } ``` 5. **启动串口**:调用`HAL_UART_Start_IT(&huart1)`来开始串口通信。 6. **调试观察**:将STM32板连接到电脑,使用如Keil MDK、STM32CubeIDE等集成开发环境的串口监视器,你应该能看到从STM32发出的文本或数字。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值