4. WIFI语音气象站-------串口调试与语音播报

1、通信

1.1 通信分类及作用

通信的作用:数据交互,向外传输-传递给别的设备;向内传输-处理应用;

有线:USB线、网线、CAN、LIN、 USART、SPI、IIC

无线:蓝牙、WIFI、GSM、4G、5G、Lora、NBIOT、Zigbee等

MCU有什么通信接口:

串行传输:数字信号是8位二进制数。按照次序一个位一个位的传送,每传送完8位为一个字节,只用1个引脚传输一字节,高位先出(MSB)/低位先出(LSB),速度较慢,一般用于通信不要求速度的地方,模块直接沟通

并行传输:多个IO同时传输数据,速度较快,占用引脚较多;一般用于屏驱动,外扩内存

异步:发送端只管发送,接收端扫描接收,发送端和接收端没有相同的时钟线,但会要求通信双方通信速率保持一致;      (波特率    比特/秒 :每秒传输数据的位数)

同步:发送端发送,同时接收端读取数据,发送端和接收端有相同的时钟线,通信双方受到同一根时钟线的控制;        (时钟线常见的标志:CLK  SCK  SCLK  SCL)

单工:只能往一个方向传输数据;(一个设备只能发送或是只能接收)

双工:设备可以双向通信;

全双工:可以同一时刻进行双向;同一时间内,能发送也能接收

半双工:不可以同一时刻双向;同一时间内,只能发送或是接收(不能同时实现接收和发送)

1.2 串口通信的相关参数

USART:串行同步/异步全双工 (通常使用串行异步全双工)

UART:串行异步全双工

速度上:波特率:1S发送的数据位数;

传输协议:数据传输的格式

                起始位      数据位     奇偶校验位         停止位

                 1位            8/9位             1/0位           0.5/1/1.5/2

常用:        1               8                  0                     1

波特率为115200,则1字节传输需要的时间?10/115200

奇偶校验位:高电平的位是否为奇数还是偶数

串口发送:发送器

1. 通过在USART_CR1寄存器上置位UE位来激活USART ---------------------使能串口

2. 编程USART_CR1M位来定义字长-------------------------------8、9位字长

3. USART_CR2中编程停止位的位数--------------------------------停止位

4. 如果采用多缓冲器通信,配置USART_CR3中的DMA使能位(DMAT)。按多缓冲器通信中

的描述配置DMA寄存器。

5. 利用USART_BRR寄存器选择要求的波特率---------------------------波特率

6. 设置USART_CR1中的TE位,发送一个空闲帧作为第一次数据发送------使能发生器

7. 把要发送的数据写进USART_DR寄存器(此动作清除TXE)。在只有一个缓冲器的情况

下,对每个待发送的数据重复步骤7。 -----------------------------------循环发送

8. USART_DR寄存器中写入最后一个数据字后,要等待TC=1,它表示最后一个数据帧的

传输结束。当需要关闭USART或需要进入停机模式之前,需要确认传输结束,避免破坏

最后一次传输。                                                 等待完成,关闭串口     

串口接收:

1.将USART_CR1寄存器的UE1来激活USART

2.编程USART_CR1M位定义字长

3.在USART_CR2中编写停止位的个数

4.如果需多缓冲器通信,选择USART_CR3中的DMA使能位(DMAR)。按多缓冲器通信所 要求的配置DMA寄存器。

5.利用波特率寄存器USART_BRR选择希望的波特率。

6.设置USART_CR1RE。激活接收器,使它开始寻找起始位。

当一字符被接收到时,

RXNE位被置位。它表明移位寄存器的内容被转移到RDR。换句话说,数据已经被接收并且

可以被读出(包括与之有关的错误标志)

波特率计算:

这里的fCK是给外设的时钟(PCLK1用于USART234536MHZPCLK2用于USART172MHZ)

USARTDIV是一个无符号的定点数。这12位的值设置在USART_BRR寄存器。

USARTDIV=fck/(16*baud);

例:USART1,设波特率为115200,则USARTDIV=39.0625

整数部分:DIV_Mantissa[11:0]=39

小数部分:DIV_Fraction[3:0]=0.0625*16=1                      16进制数转10进制数

例2: 要求 USARTDIV = 25.62
就有: DIV_Fraction = 16*0.62 = 9.92                     最接近的整数是:10 = 0x0A
DIV_Mantissa = mantissa (25.620) = 25 = 0x19      于是,USART_BRR = 0x19A

CR1:发送器使能、接收器使能、UE激活串口---置1

CR2:停止位-00

BRR:USARTDIV填写

SR:TXE、TC、RXNE

DR:TDR、RDR

串口:

物理引脚:TX:发送引脚      RX:接收引脚

使用过程:

  1. 开时钟:端口和外设时钟
  2. 设置使用引脚的IO模式;
  3. 外设功能;
  4. 使用外设;
#include "usart1.h"
#include "Delay.h"
#include "stdio.h"
void USART1_Config(uint32_t baud)
{
	//开时钟,找到stm32f10x_rcc.h文件开启端口时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE);//开启GPIOA,USART1端口时钟    ①
	
	//PA9:---USART1_TX:复用推挽,先找到stm32f10x_gpio.h文件,先GPIO_Init(),
	GPIO_InitTypeDef GPIO_InitStruct;//定义一个结构体变量   	③
	
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9;
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
	
	GPIO_Init(GPIOA, &GPIO_InitStruct); //         ②
	
	//PA10:--USART_RX:浮空输入
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10;
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;

	GPIO_Init(GPIOA, &GPIO_InitStruct);        
	
	//配置串口:
	/*CR1:发送器使能、接收器使能、UE激活串口---置1
		CR2:停止位-00
		BRR:USARTDIV填写*/
		USART_InitTypeDef USART_InitStruct;
		
		USART_InitStruct.USART_BaudRate=baud;  //波特率
		USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None;     //硬件流控制
		USART_InitStruct.USART_Mode=USART_Mode_Tx | USART_Mode_Rx;
		USART_InitStruct.USART_Parity=USART_Parity_No;
		USART_InitStruct.USART_StopBits=USART_StopBits_1;
		USART_InitStruct.USART_WordLength=USART_WordLength_8b;
		
		USART_Init(USART1, &USART_InitStruct);//IO一般Init之后就可以使用,但是外设需要进行使能或者激活
		
		//特别注意:外设初始化后需 使能 或者 激活 后才可以使用
		USART_Cmd(USART1,ENABLE);
}

void USART1_SendStr( uint8_t *str )
{
	while((USART1->SR &(0x01<<7))==0);
	while(*str !='\0')
	{
		USART1_SendData(*str);
		str++;
	}
}

int fputc(int ch,FILE *P) //实现printf打印
{
	USART1_SendData(ch);
	return ch;
}

uint8_t USART1_ReceiveStr(void)
{
	uint8_t str=0;
	if(USART1->SR &(0x01<<5))
	{
		 str=USART1->DR;
	}
	return str;
}

void USART1_SendData(uint8_t dat)
{
	while((USART1->SR &(0x01<<7))==0);
	USART1->DR = dat;
}

uint8_t USART1_ReceiveData(void)
{
	uint8_t dat=0;
	if(USART1->SR &(0x01<<5))
	{
		dat = USART1->DR;
	}
	return dat;
}

 XCOM串口调试助手:

4、使用串口协议控制语音播报模块

文字转语音|语音合成 - 在线文字转换语音软件 - 迅捷PDF转换器在线免费版 在线语音合成

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值