6. STM32——用串口发送数据点亮LED(串口的中断接收)

1. 配置 GPIO 时钟、串口时钟、复用时钟

2. 配置 GPIO 结构体

3. 配置串口

1. 2. 3. 步骤基本框架在 5. STM32——串口发送字符、字符串 + printf 的重定向

4. 配置中断 NVIC 抢占优先级

在 misc.h 头文件中查找相关函数函数

USART1_IRQn 在 stm32f10x.h 头文件中查找相关函数函数

在这里插入图片描述

//4. 配置中断抢占优先级
NVIC_InitTypeDef nvicInitStructure

//4.1 配置优先级组
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2)

//4.2 配置结构体
nvicInitStructure.NVIC_IRQChannel					=	USART1_IRQn; 
nvicInitStructure.NVIC_IRQChannelPreemptionPriority	=	1;
nvicInitStructure.NVIC_IRQChannelSubPriority		=	1;
nvicInitStructure.NVIC_IRQChannelCmd				=	ENABLE;

//4.3 初始化结构体
NVIC_Init(&nvicInitStructure);

5. 搭建串口中断服务函数

USART1_IRQHandler 在 startup_stm32f10x_hd.s 文件中查找

在这里插入图片描述

//5. 搭建串口中断服务函数
void USART1_IRQHandler(void)
{
		char temp;
	
		if( USART_GetITStatus(USART1, USART_IT_RXNE) != RESET ) //发生中断
		{
				temp=USART_ReceiveData(USART1);
				if(temp=='O')
				{
						GPIO_ResetBits(GPIOC, GPIO_Pin_13);
						USARTSendStr(USART1, "LED is open");
				}
				else if(temp=='C')
				{
						GPIO_SetBits(GPIOC, GPIO_Pin_13);
						USARTSendStr(USART1, "LED is close");
				}
		}
		
}

用串口发送数据点亮LED

usart.c

#include "usart.h"
#include "stm32f10x.h"

void usart_init()
{
		GPIO_InitTypeDef 	gpioInitStructure;
		USART_InitTypeDef	usartInitStructure;
		NVIC_InitTypeDef 	nvicInitStructure;
		
		//1.配置时钟
		
		//1.1配置GPIOA、串口时钟、复用时钟
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
		
		//2.配置GPIOA结构体
		
		//2.1 A9 TX
		gpioInitStructure.GPIO_Mode		= GPIO_Mode_AF_PP;
		gpioInitStructure.GPIO_Pin		= GPIO_Pin_9;
		gpioInitStructure.GPIO_Speed	= GPIO_Speed_50MHz;
		
		GPIO_Init(GPIOA, &gpioInitStructure);
		
		//2.2 A10 RX
		gpioInitStructure.GPIO_Mode		= GPIO_Mode_IN_FLOATING;
		gpioInitStructure.GPIO_Pin		= GPIO_Pin_10;
		
		GPIO_Init(GPIOA, &gpioInitStructure);

		//3.配置串口结构体
		usartInitStructure.USART_BaudRate				= 115200;
		usartInitStructure.USART_HardwareFlowControl	= USART_HardwareFlowControl_None;
		usartInitStructure.USART_Mode					= USART_Mode_Tx | USART_Mode_Rx;
		usartInitStructure.USART_Parity					= USART_Parity_No;
		usartInitStructure.USART_StopBits				= USART_StopBits_1;
		usartInitStructure.USART_WordLength				= USART_WordLength_8b;
		
		//3.1 初始化串口
		USART_Init(USART1, &usartInitStructure);
		
		//3.2 配置串口中断
		USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
		
		//3.3 使能串口
		USART_Cmd(USART1, ENABLE);
		
		//4.配置NVIC中断优先级
		
		//4.1 配置优先级组
		NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
		
		//4.2 配置NVIC优先级结构体
		nvicInitStructure.NVIC_IRQChannel					=	USART1_IRQn;
		nvicInitStructure.NVIC_IRQChannelPreemptionPriority	=	1;
		nvicInitStructure.NVIC_IRQChannelSubPriority		=	1;
		nvicInitStructure.NVIC_IRQChannelCmd				=	ENABLE;
		
		//4.3 初始化NVIC优先级
		NVIC_Init(&nvicInitStructure);
		
}

void USARTSendByte(USART_TypeDef* USARTx, uint16_t Data)
{
		USART_SendData( USARTx, Data);
		while( USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET );
}

void USARTSendStr(USART_TypeDef* USARTx, char* str)
{
		uint16_t i=0;
		
		while( *(str+i) != '\0' )
		{
				/*
				USART_SendData( USARTx, *(str+i));
				while( USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET );
				*/
				
				USARTSendByte( USART1, *(str+i) );
				i++;
		}
		
		while( USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET );
}

usart.h

#include "stm32f10x.h"
#include <stdio.h>

void usart_init(void);
void USARTSendByte(USART_TypeDef* USARTx, uint16_t Data);
void USARTSendStr(USART_TypeDef* USARTx, char* str);

main.c

#include "stm32f10x.h"
#include "main.h"
#include "led.h"
#include "shake.h"
#include "relay.h"
#include "exti.h"
#include "usart.h"
#include "tim.h"

void delay(uint16_t time)
{
	uint16_t i=0;
	
	while(time--)
	{
		i=10000;
		while(i--);
	}
}

int  main()
{
//		usart_init();
		LED_Init();
		tim_Init();
		
		GPIO_SetBits(GPIOC, GPIO_Pin_13);

		
//		USARTSendByte(USART1, 'O');
//		USARTSendByte(USART1, 'K');
//		printf("Yinyuer is a pretty girl!");
		
		while(1)
		{
				
		}
}


//5. 搭建串口中断服务函数
void USART1_IRQHandler(void)
{
		char temp;
	
		if( USART_GetITStatus(USART1, USART_IT_RXNE) != RESET )
		{
				temp=USART_ReceiveData(USART1);
				if(temp=='O')
				{
						GPIO_ResetBits(GPIOC, GPIO_Pin_13);
						USARTSendStr(USART1, "LED is open");
				}
				else if(temp=='C')
				{
						GPIO_SetBits(GPIOC, GPIO_Pin_13);
						USARTSendStr(USART1, "LED is close");
				}
		}
		
}

点灯成功

在这里插入图片描述

在这里插入图片描述

首先,我们需要连接STM32F103C8T6的串口LED灯。将串口的TX端口连接到LED的正极,RX端口连接到LED的负极。接着,我们需要编写程序来控制串口发送数据点亮LED灯。 在程序中,我们需要先初始化串口LED灯。选择一个合适的波特率并打开串口,接着我们通过GPIO口控制LED灯的引脚输出高电平或低电平来点亮或熄灭LED灯。然后我们可以通过串口发送数据,当数据被发送时,LED灯的状态将随之改变。 下面是一个简单的代码示例,可以点亮一个连接到PA8引脚的LED灯: \#include "stm32f10x.h" \#include "stm32f10x_gpio.h" \#include "stm32f10x_rcc.h" \#include "stm32f10x_usart.h" void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; //使能GPIOA时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //LED引脚配置 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); } void UART_Configuration(void) { USART_InitTypeDef USART_InitStructure; //使能USART1时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //USART1配置 USART_InitStructure.USART_BaudRate = 9600; 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_Tx; USART_Init(USART1, &USART_InitStructure); USART_Cmd(USART1, ENABLE); } int main() { GPIO_Configuration(); UART_Configuration(); while(1) { //发送字符'A' USART_SendData(USART1, 'A'); //等待发送完成 while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); //控制LED灯亮或灭 GPIO_WriteBit(GPIOA, GPIO_Pin_8, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_8))); //延时 Delay(10000); } } 需要注意的是,在使用串口控制LED灯时,我们还需要注意GPIO的初始化和串口的配置。同时,由于串口发送指令需要一定的延时,因此需要在程序中加入延时函数来控制发送间隔。 最后,将编写好的代码烧录到MCU中,连接电源即可点亮LED灯。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值