找回密码
立即注册
搜索
热搜: 活动 交友 discuz
发新帖

116

积分

0

好友

12

主题
发表于 2023-9-10 11:19:15 | 查看: 458| 回复: 0 IP:广东省东莞市 电信

USART(Universal Synchronous/Asynchronous Receiver Transmitter)是一种通用的同步/异步接收器和发送器,常用于微控制器和其他嵌入式系统中。

USART提供了一种灵活、可靠的串行通信方式,可以在嵌入式系统中实现设备之间的数据传输和通信。它在许多应用领域,如无线通信、物联网、工业控制等方面发挥着重要作用。

CH32V307VCT6单片机包含3个通用同步异步收发器(USART1/2/3)和 5个通用异步收发器(UART4/5/6/7/8)。支持全双工或半双工的同步或异步通信;NRZ数据格式;分数波特率发生器,最高9Mbps;可编程数据长度;可配置的停止位;支持LIN,IrDA编码器,智能卡;支持 DMA;多种中断源。

image.png

当TE(发送使能位)置位时,发送移位寄存器里的数据在TX引脚上输出,时钟在CK 引脚上输出。在发送时,最先移出的是最低有效位,每个数据帧都由一个低电平的起始位开始,然后发送器根据M(字长)位上的设置发送八位或九位的数据字,最后是数目可配置的停止位。如果配有奇偶检验位,数据字的最后一位为校验位。在TE置位后会发送一个空闲帧,空闲帧是10位或11位高电平,包含停止位。断开帧是10位或11位低电平,后跟着停止位。上面的内容都是来自芯片手册的内容,更多的内容可以查看芯片手册哈。下面的代码是USART的主要代码,蓝牙模块控制LED灯的亮灭。

void USART2_Configuration(void)

{

GPIO_InitTypeDef GPIO_InitStructure;////定义GPIO的结构体变量

USART_InitTypeDef USART_InitStructure;///定义USART的结构体变量

NVIC_InitTypeDef NVIC_InitStructure = {0};///定义NVIC的结构体变量初始化为0

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);////打开GPIOA端口的时钟

RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);//打开USART2的时钟

// 配置USART1引脚

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;//TX//打开GPIO_Pin_2

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//配置为复用推挽输出模式

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//设置输出速度为50MHz

GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//RX//打开GPIO_Pin_3

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;////配置为浮空输入模式

GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA

USART_Init(USART2, &USART_InitStructure);//初始化USART2

USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//配置USART的中断使能

// 配置USART2

USART_InitStructure.USART_BaudRate = 115200;//设置波特率为115200

USART_InitStructure.USART_WordLength = USART_WordLength_8b;//数据位长度为8位

USART_InitStructure.USART_StopBits = USART_StopBits_1;//停止位为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(USART2, &USART_InitStructure);////初始化USART2

NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;//设置USART2_IRQn为USART2的中断通道

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//设置抢占优先级为1

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//设置子优先级为1

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能中断通道

NVIC_Init(&NVIC_InitStructure);////初始化NVIC

USART_Cmd(USART2, ENABLE);//使能USART2 }

void LED_On(void)

{

GPIO_WriteBit(GPIOA, GPIO_Pin_0,Bit_RESET); }

void LED_Off(void)

{

GPIO_WriteBit(GPIOA, GPIO_Pin_0,Bit_SET); }

int main(void)

{

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级为2

SystemCoreClockUpdate();//启动时钟

Delay_Init();////时间函数初始化

USART_Printf_Init(115200);////设置波特率为115200

GPIO_Configuration();//GPIO初始化

USART2_Configuration();//USART2初始化

LED_Off();//关闭LED

while (1)

{


}

}

void USART2_IRQHandler(void)//USART2中断处理函数

{

if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)//判断接收寄存器非空中断被触发

{

RxBuffer1 = USART\_ReceiveData(USART2);//取接收寄存器的内容并将其保存在RxBuffer1变量中

**if** (RxBuffer1 == '1')

                    LED\_Off();

                **else** **if** (RxBuffer1 == '0')

                    LED\_On();

} }

void USART2_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));//声明了USART2_IRQHandler函数作为具有特定中断类型的中断处理程序

image.png

这是我配置的蓝牙模块信息,波特率这里和USART2的配置要一样是115200

image.png

这是蓝牙串口发送的数据

image.png![image.png]()

image.png

这是单片机和蓝牙模块连接后,单片机接收的数据控制LED的亮灭。

以上就是蓝牙模块控制LED亮灭的权过程啦,大家可以根据自己的需要根据用户手册来改。

image.png

蓝牙模块需要用到的资料.rar

1.94 MB, 下载次数: 0

*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|国产电子社区 ( 沪ICP备2023018578号-1|

苏公网安备 32011102010465号


)|网站地图

GMT+8, 2024-5-22 20:16 , Processed in 0.063092 second(s), 24 queries , MemCached On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表