电子说
7.1.串口基础知识
7.1.1.串口介绍
串行接口简称串口,也称串行通信接口或串行通信接口(通常指COM接口),是采用串行通信方式的扩展接口。串行接口 (Serial Interface)是指数据一位一位地顺序传送。其特点是通信线路简单,只要一对传输线就可以实现双向通信(可以直接利用电话线作为传输线),从而大大降低了成本,特别适用于远距离通信,但传送速度较慢。
7.1.2.串口通信参数介绍
波特率:衡量通信速度的参数,它表示每秒钟传送的bit的个数。
数据位:衡量通信中实际数据位的参数,表示一个信息包里包含的数据位的个数。
停止位:用于表示单个信息包的最后位,典型值为1、1.5和2位。由于数据是在传输线上传输的,每个设备都有自己的时钟,很有可能在通信过程中出现不同步,停止位不仅仅表示传输的结束,还能提供校正时钟同步的机会。停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率也越慢。
奇偶检验位:表示一种简单的检查错误的方式。
关于更为详细的介绍请搜索百度。
7.1.3.串口工作模式
串口可以工作在单工、半双工和全双工模式下。
单工:在通信的任意时刻,信息只能由A传到B。
半双工:在通信的任意时刻,信息即可由A传到B,又能由B传到A,但同时只能有一个方向上的传输存在。
全双工:在通信的任意时刻,通信线路上存在A到B和B到A的双向信号传输。
7.1.4.串口通信协议
串口在进行通信的时候会按照数据包的形式进行发送,帧格式如图1-4-1所示。
图9-1 串口通信协议
串口通信是一位一位地传输,每传输一个字节总是以起始位开始,以停止位结束,字符之间没有固定的时间间隔要求。每一个字符的前面都有一位起始位(低电平),后面由8位数据位组成,如果开启了校验位,则最后一位数据位是校验位,最后是停止位。停止位后面是不定长的空闲位,停止位和空闲位都规定为高电平。
7.2.串口蓝牙接线原理图
在数字电压电流表上默认使用的串口是串口2,接口为CW_UART2_TX和CW_UART2_RX。关于串口和蓝牙连接原理图如图9-2所示。
图 9-2 串口蓝牙接线
使用蓝牙模块KT6368将信息发送出去,只需要调用CW32的UART_2将信息传输至蓝牙模块即可。
7.3.串口驱动流程
串口驱动有以下几个流程:配置CW32时钟树,配置UART_2串口,调用串口打印信息。通过查看上文的CW32时钟树可知,串口2挂载在高级外设时钟 PCLK上,而此前的时钟配置已将PCLK配置成了6MHz。具体的配置函数如下:
void Uart2_Init(void) { //外设时钟使能 RCC_AHBPeriphClk_Enable(RCC_AHB_PERIPH_GPIOA, ENABLE); //使能串口要用到的GPIO时钟 RCC_APBPeriphClk_Enable1(RCC_APB1_PERIPH_UART2, ENABLE); //使能串口时钟 GPIO_InitTypeDef GPIO_InitStructure; //GPIO初始化 GPIO_InitStructure.IT = GPIO_IT_NONE; GPIO_InitStructure.Pins = GPIO_PIN_7; GPIO_InitStructure.Mode = GPIO_MODE_INPUT_PULLUP; GPIO_InitStructure.Speed = GPIO_SPEED_HIGH; GPIO_Init(CW_GPIOA, &GPIO_InitStructure); PA07_AFx_UART2RXD(); GPIO_InitStructure.IT = GPIO_IT_NONE; GPIO_InitStructure.Pins = GPIO_PIN_6; GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStructure.Speed = GPIO_SPEED_HIGH; GPIO_Init(CW_GPIOA, &GPIO_InitStructure); PA06_AFx_UART2TXD(); USART_InitTypeDef USART_InitStructure; //串口初始化 USART_InitStructure.USART_BaudRate = 115200; //设置波特率 USART_InitStructure.USART_Over = USART_Over_16; //串口采样方式 USART_InitStructure.USART_Source = USART_Source_PCLK; //串口传输时钟源采用PCLK USART_InitStructure.USART_UclkFreq = RCC_Sysctrl_GetPClkFreq(); //频率为PCLK的频率 USART_InitStructure.USART_StartBit = USART_StartBit_FE; //数据开始位 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(CW_UART2, &USART_InitStructure); }
在完成串口的配置后,还需要写一个串口发送函数
void USART_SendString(UART_TypeDef *USARTx, char *String) { while (*String != '�') //�表示没有数据 { USART_SendData_8bit(USARTx, *String); //发送一位8bit数据 while (USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET); //发送缓冲器未空则等待 String++; //发送一次完成后,准备发送下一位数据 } while (USART_GetFlagStatus(USARTx, USART_FLAG_TXBUSY) == SET); //发送串口状态忙则等待 }
由于定时器中断为1ms,而串口发送占用的时间较长,所以我们1000ms使用蓝牙发送一次信息,这里的写法并未使用定时器。
char data_reg[24]; //定义数组,用于数据打印 uint32_t Ble_Time=0; //1000ms计时变量 while(1) //main函数里的while循环 { if(GetTick() >= (Ble_Time + 1000)) //如果此时的时间大于上一次的1000ms { Ble_Time = GetTick(); //记录此刻时间 Volt_Cal(); //电压计算 sprintf(data_reg,"volt=%u ",Cal_Buffer); //打印数据 USART_SendString(CW_UART2,data_reg); //调用串口上传数据给蓝牙 } }
注意 GetTick() 函数定义在头文件 cw32f003_systick.h 中,而此函数要使用到系统时钟中断,所以还需要配置系统时钟中断:
InitTick(48000000); // SYSTICK 的工作频率为48MHz,每ms中断一次
最终可以收到蓝牙传递的数据:
图9-3 蓝牙发送数据
审核编辑:刘清
全部0条评论
快来发表一下你的评论吧 !