|
前端日子比赛,买了一块SYN6288的语音合成模块和YS-LDV7语音识别,但是程序是51的,所以自己手动改写成了stm32版的,而且还附带了语音控制开关灯的代码,有需要的可以看一下
- #include "stm32f10x.h"
- #include <stdio.h>
- #include <string.h>
- #include "SYN6288.h"
- #define RxBufferSize 10
- void RCC_Configuration(void);
- void GPIO_Configuration(void);
- void NVIC_Configuration(void);
- void USART_Configuration(void);
- int fputc(int ch, FILE *f);
- void delay_nms(u16 time);//延时子程序
- extern void SYN_FrameInfo(uint8_t Music,uint8_t *HZdata);
- unsigned char RxBuffer[RxBufferSize];
- unsigned char CmdBuffer[RxBufferSize];
- extern unsigned char Rx_Flag=0;
- unsigned char RxCounter=0;
- u16 i;
- /*-----------------------------------------------------main函数-----------------------------------------------------*/
- int main(void)
- {
- //USART_ITConfig(USART1, USART_IT_TXE, ENABLE); // 开启发送
- RCC_Configuration();
- NVIC_Configuration();
- GPIO_Configuration();
- USART_Configuration();
- USART_ClearFlag(USART2,USART_FLAG_TC);//清发送结束位
- serial3_init();
- while(USART_GetFlagStatus(USART2, USART_FLAG_TC)==RESET);
- // printf("打开LED灯,请输入LEDON!\n");
- // printf("关闭LED灯,请输入LEDOFF!\n");
- // printf("输入错误的话,LED灯闪烁3次!\n");
- GPIO_SetBits(GPIOA,GPIO_Pin_8);//PA8置位,LED1灯灭
- memset(CmdBuffer,10,0);
- while(1)
- {
- if (Rx_Flag==1)
- {
- USART_ITConfig(USART2, USART_IT_RXNE, DISABLE); //关闭接收中断
- Rx_Flag=0;
- RxCounter=0;
- if (strstr(CmdBuffer,"LEDOFF\r\n"))
- {
- GPIO_SetBits(GPIOA,GPIO_Pin_8);//PA8置位,LED1灯灭
- memset(CmdBuffer,10,0);
- delay_nms(1000);
- SYN_FrameInfo(0,"灯已经关闭了");
- }
- else if(strstr(CmdBuffer,"LEDON\r\n"))
- {
- GPIO_ResetBits(GPIOA,GPIO_Pin_8);//PA8清零,LED1灯亮
- memset(CmdBuffer,10,0);
- delay_nms(1000);
- SYN_FrameInfo(0,"灯已经打开了");
- }
- else
- {
- for (i=0;i<3;i++)
- {
- memset(CmdBuffer,10,0);
- GPIO_ResetBits(GPIOA,GPIO_Pin_8);//PA8清零,LED1灯亮
- delay_nms(1000); GPIO_SetBits(GPIOA,GPIO_Pin_8);//PA8置位,LED1灯灭
- delay_nms(200);
- }
- }
- USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); //开启接收中断,接收寄存器不空(RXNE=1)时产生中断
- }
- }
- }
-
- /*-------------------------------------------------时钟---------------------------------------------------------*/
- void RCC_Configuration(void)
- {
- SystemInit();
- //RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//使能AFIO的时钟,串口属于复用功能
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能GPIOA的时钟
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);//使能USART1的时钟, USART1挂接到APB2上。其他USART2-5挂接到APB1上
- //RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
- }
-
- /*-------------------------------------------------------GPIO配置---------------------------------------------------*/
- void GPIO_Configuration(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;//声明GPIO初始化结构变量。
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //配置管脚PA10/USART1_RX
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮置输入
- GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化PA10
- GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2; //配置管脚PA9/USART1_TX
- GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; //IO口配置为复用输出口
- GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
- GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA9
- GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8; //配置管脚8
- GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //IO口配置为推挽输出口
- GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //工作频率50MHz
- GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA8口
- }
-
- /*-------------------------------------------------NVIC配置---------------------------------------------------------*/
-
-
- void NVIC_Configuration(void) //NVIC配置
- { //配置NVIC相应的优先级位
- NVIC_InitTypeDef NVIC_InitStructure;
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //优先级分组1(0:4,0位抢占优先级、4位子优先级)
- NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; //设置串口1中断
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级 0
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
- }
-
-
- /*----------------------------------------------串口2配置------------------------------------------------------------*/
-
-
-
- void USART_Configuration(void)
- {
- USART_InitTypeDef USART_InitStructure;
- //子优先级为0
- //串口中断使能
- USART_InitStructure.USART_BaudRate = 9600;
- USART_InitStructure.USART_WordLength = USART_WordLength_8b; //USART_WordLength_8b; //8 位数据
- //USART_WordLength_9b; //9 位数据
- USART_InitStructure.USART_StopBits = USART_StopBits_1;
- //USART_StopBits_1 ;//在帧结尾传输 1 个停止位
- //USART_StopBits_0.5;//在帧结尾传输 0.5 个停止位
- //USART_StopBits_2 ;//在帧结尾传输 2 个停止位
- //USART_StopBits_1.5;//在帧结尾传输 1.5 个停止位
- USART_InitStructure.USART_Parity = USART_Parity_No;
- //USART_Parity_No ;//奇偶失能
- //USART_Parity_Even;//偶模式
- //USART_Parity_Odd ;//奇模式
- USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
- //USART_HardwareFlowControl_None; //硬件流控制失能
- //USART_HardwareFlowControl_RTS; //发送请求 RTS使能
- //USART_HardwareFlowControl_CTS; //清除发送 CTS使能
- //USART_HardwareFlowControl_RTS_CTS;//RTS和 CTS使能
- USART_InitStructure.USART_Mode = USART_Mode_Tx|USART_Mode_Rx;
- //USART_Mode_Tx;//发送使能
- //USART_Mode_Rx;//接收使能
- USART_Init(USART2, &USART_InitStructure);//初始化串口
- USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); //开启接收中断,接收寄存器不空(RXNE=1)时产生中断
- //USART_ITConfig(USART1, USART_IT_TXE, ENABLE); // 开启发送中断,发送寄存器空(TXE=1)时能产生中断
- //串口的发送中断有两个,分别是:
- // l发送数据寄存器空中断(TXE)
- // l发送完成中断(TC)
- USART_Cmd(USART2, ENABLE); //启动USART
- }
-
- /*----------------------------------------------发送函数------------------------------------------------------------*/
- int fputc(int ch,FILE *f)
- {
- if(ch=='\n')
- {
- while(USART_GetFlagStatus(USART2, USART_FLAG_TC)==RESET);
- USART_SendData(USART2,'\r');
- }
- while(USART_GetFlagStatus(USART2, USART_FLAG_TC)==RESET);
- USART_SendData(USART2,ch);
- return ch;
- }
-
- /*------------------------------------------------------延迟函数----------------------------------------------------*/
- void delay_nms(u16 time)//延时子程序
- { u16 i=0;
- while(time--)
-
- { i=12000; //自己定义
- while(i--) ;
- }
- }
- /*--------------------------------------------------中断服务函数--------------------------------------------------------*/
- //需要设置串口接收中断和定时器3中断,中断时间为1ms
- //------------------------------------------------------------------
- //函数名:void USART1_IRQHandler(void)
- //输入参数:null
- //返回参数:null
- //说明:串口接收中断服务
- void USART2_IRQHandler(void) //串口1 中断服务程序
- {
- unsigned int i=0;
- if (USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //判断接收寄存器是否非空
- {//如果接收寄存器非空,说明检测到中断读入
- RxBuffer[RxCounter++]=USART_ReceiveData(USART2); // Read one byte from the receive data register
- if (RxBuffer[RxCounter-1]=='\n') //如果检测到换行,则设置接收标志为1.
- // \n:换行,光标到下行行首;
- // \r:回车,光标到本行行首
- {
- Rx_Flag=1;
- for (i=0;i<RxCounter;i++)//把接收到的数据缓存到CmdBuffer中
- {
- CmdBuffer[i]=RxBuffer[i];
- }
- CmdBuffer[RxCounter]=0; //发送缓冲区结束符
- RxCounter=0;
- }
- if(RxCounter == RxBufferSize) //如果接收缓冲区满了。
- {
- USART_ITConfig(USART2, USART_IT_RXNE, DISABLE); //关闭接收中断
- Rx_Flag=1;
- CmdBuffer[RxCounter]=0; //接收命令缓冲区结束符
- RxCounter=0;
- }
- }
- }
复制代码
|
评分
-
查看全部评分
|