中科深谷stm32f4蓝牙模块

本文介绍了在STM32F4xx微控制器上使用GPIO、NVIC和USART进行串口通信的初始化过程,包括USART1和USART3的配置,以及USART3中断服务接收函数的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

蓝牙模块

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

GPIO_InitTypeDef GPIO_InitStruct;
NVIC_InitTypeDef NVIC_InitStructure;


void delay_us(uint32_t nus)
{
	SysTick->CTRL = 0; // 关闭滴答定时器
	SysTick->LOAD = (SystemCoreClock/8/1000000)*nus; // 计数值
	SysTick->VAL = 0; // 清空当前值和状态标志位
	SysTick->CTRL = 1; // 启动定时器工作
	// 检测CTRL的第16位是否为0,如果为0表示定时时间到达
	while ((SysTick->CTRL & 0x00010000)==0);
	
	SysTick->CTRL = 0; //失能(关闭)滴答定时器
}

void delay_ms(uint32_t nms)
{	
	while(nms--)
	{
		SysTick->CTRL = 0; // 关闭滴答定时器
		SysTick->LOAD = (SystemCoreClock/8/1000); // 计数值
		SysTick->VAL = 0; // 清空当前值和状态标志位
		// 选择时钟源(如果是5表示选择168M工作,如果是1选择21M工作)并启动定时器工作
		SysTick->CTRL = 1; 
		// 检测CTRL的第16位是否为0,如果为0表示定时时间到达
		while ((SysTick->CTRL & 0x00010000)==0);
		
		SysTick->CTRL = 0; //失能(关闭)滴答定时器
	}
	
}

//初始化串口1
void init_usart1(uint32_t baud)
{
	USART_InitTypeDef USART_InitStructure;	
	
	// 使能PA时钟
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
	
	// 使能串口1时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
	
	// 将PA9 PA10连接到串口1
	GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);
	GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);
	
	// 配置GPIO A9 A10为第二功能模式
	GPIO_InitStruct.GPIO_Mode =GPIO_Mode_AF; // 复用模式
	GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; // 推挽输出
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
	GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; // 上拉
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
	// 初始化GPIOA
	GPIO_Init(GPIOA, &GPIO_InitStruct);
	
	// 配置串口属性
	USART_InitStructure.USART_BaudRate = baud; // 波特率
	USART_InitStructure.USART_WordLength = USART_WordLength_8b; // 8位数据为
	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; // 同时接收,发送模式
	
	USART_Init(USART1, &USART_InitStructure);
	
	// 配置串口1优先级
	NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; // 触发串口1中断
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);
	
	// 使能串口1工作
	USART_Cmd(USART1,ENABLE);
	
	// 使能串口1接收中断,如果有数据达到,触发中断服务函数
	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

}

//初始化串口3
void init_usart3(uint32_t baud)
{
	USART_InitTypeDef USART_InitStructure;	
	
	// 使能PB时钟
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
	
	// 使能串口3时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
	
	// 将PB9 PB10连接到串口1
	GPIO_PinAFConfig(GPIOB,GPIO_PinSource10,GPIO_AF_USART3);
	GPIO_PinAFConfig(GPIOB,GPIO_PinSource11,GPIO_AF_USART3);
	
	// 配置GPIO B10 B11为第二功能模式
	GPIO_InitStruct.GPIO_Mode =GPIO_Mode_AF; // 复用模式
	GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; // 推挽输出
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
	GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; // 上拉
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
	// 初始化GPIOA
	GPIO_Init(GPIOB, &GPIO_InitStruct);
	
	// 配置串口属性
	USART_InitStructure.USART_BaudRate = baud; // 波特率
	USART_InitStructure.USART_WordLength = USART_WordLength_8b; // 8位数据为
	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; // 同时接收,发送模式
	
	USART_Init(USART3, &USART_InitStructure);
	
	// 配置串口3优先级
	NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn; // 触发串口1中断
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);
	
	// 使能串口3工作
	USART_Cmd(USART3,ENABLE);
	
	// 使能串口3接收中断,如果有数据达到,触发中断服务函数
	USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);

}

int main(void)
{
	// 配置优先级分组
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	
	// 串口初始化
	init_usart1(115200);
	init_usart3(9600);
	
	// 当调用printf的时候会直接调用fputc函数
	//printf("holle sun\r\n");
	
	while(1){}
}

// 串口中断服务接收函数
void USART3_IRQHandler(void)
{
	uint16_t data;
	//监测是否有数据到达,状态发生改变
	if(USART_GetITStatus(USART3,USART_IT_RXNE) == SET)
	{
		// 接收数据
	    data = USART_ReceiveData(USART3);
		
		// 将usart3接收的数据传给usart1
		USART_SendData(USART1,data);
		
		// 等待发送完成(USART_GetFlagStatus有延时作用)
		while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) != SET);
		
		// 接收完毕,清空中断标志位
		USART_ClearITPendingBit(USART3,USART_IT_RXNE);
		
	}
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值