USART(Universal Synchronous/Asynchronous Receiver Transmitter)是一种通用的同步/异步接收器和发送器,常用于微控制器和其他嵌入式系统中。
USART提供了一种灵活、可靠的串行通信方式,可以在嵌入式系统中实现设备之间的数据传输和通信。它在许多应用领域,如无线通信、物联网、工业控制等方面发挥着重要作用。
CH32V307VCT6单片机包含3个通用同步异步收发器(USART1/2/3)和 5个通用异步收发器(UART4/5/6/7/8)。支持全双工或半双工的同步或异步通信;NRZ数据格式;分数波特率发生器,最高9Mbps;可编程数据长度;可配置的停止位;支持LIN,IrDA编码器,智能卡;支持 DMA;多种中断源。
当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函数作为具有特定中断类型的中断处理程序
这是我配置的蓝牙模块信息,波特率这里和USART2的配置要一样是115200。
这是蓝牙串口发送的数据
![image.png]()
这是单片机和蓝牙模块连接后,单片机接收的数据控制LED的亮灭。
以上就是蓝牙模块控制LED亮灭的权过程啦,大家可以根据自己的需要根据用户手册来改。