|
前端日子比賽,買了一塊SYN6288的語(yǔ)音合成模塊和YS-LDV7語(yǔ)音識(shí)別,但是程序是51的,所以自己手動(dòng)改寫成了stm32版的,而且還附帶了語(yǔ)音控制開關(guān)燈的代碼,有需要的可以看一下
- #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);//延時(shí)子程序
- 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函數(shù)-----------------------------------------------------*/
- int main(void)
- {
- //USART_ITConfig(USART1, USART_IT_TXE, ENABLE); // 開啟發(fā)送
- RCC_Configuration();
- NVIC_Configuration();
- GPIO_Configuration();
- USART_Configuration();
- USART_ClearFlag(USART2,USART_FLAG_TC);//清發(fā)送結(jié)束位
- serial3_init();
- while(USART_GetFlagStatus(USART2, USART_FLAG_TC)==RESET);
- // printf("打開LED燈,請(qǐng)輸入LEDON!\n");
- // printf("關(guān)閉LED燈,請(qǐng)輸入LEDOFF!\n");
- // printf("輸入錯(cuò)誤的話,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); //關(guān)閉接收中斷
- 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,"燈已經(jīng)關(guān)閉了");
- }
- 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,"燈已經(jīng)打開了");
- }
- 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)時(shí)產(chǎn)生中斷
- }
- }
- }
-
- /*-------------------------------------------------時(shí)鐘---------------------------------------------------------*/
- void RCC_Configuration(void)
- {
- SystemInit();
- //RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//使能AFIO的時(shí)鐘,串口屬于復(fù)用功能
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能GPIOA的時(shí)鐘
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);//使能USART1的時(shí)鐘, USART1掛接到APB2上。其他USART2-5掛接到APB1上
- //RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
- }
-
- /*-------------------------------------------------------GPIO配置---------------------------------------------------*/
- void GPIO_Configuration(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;//聲明GPIO初始化結(jié)構(gòu)變量。
- 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口配置為復(fù)用輸出口
- 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相應(yīng)的優(yōu)先級(jí)位
- NVIC_InitTypeDef NVIC_InitStructure;
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //優(yōu)先級(jí)分組1(0:4,0位搶占優(yōu)先級(jí)、4位子優(yōu)先級(jí))
- NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; //設(shè)置串口1中斷
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //搶占優(yōu)先級(jí) 0
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
- }
-
-
- /*----------------------------------------------串口2配置------------------------------------------------------------*/
-
-
-
- void USART_Configuration(void)
- {
- USART_InitTypeDef USART_InitStructure;
- //子優(yōu)先級(jí)為0
- //串口中斷使能
- USART_InitStructure.USART_BaudRate = 9600;
- USART_InitStructure.USART_WordLength = USART_WordLength_8b; //USART_WordLength_8b; //8 位數(shù)據(jù)
- //USART_WordLength_9b; //9 位數(shù)據(jù)
- USART_InitStructure.USART_StopBits = USART_StopBits_1;
- //USART_StopBits_1 ;//在幀結(jié)尾傳輸 1 個(gè)停止位
- //USART_StopBits_0.5;//在幀結(jié)尾傳輸 0.5 個(gè)停止位
- //USART_StopBits_2 ;//在幀結(jié)尾傳輸 2 個(gè)停止位
- //USART_StopBits_1.5;//在幀結(jié)尾傳輸 1.5 個(gè)停止位
- 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; //發(fā)送請(qǐng)求 RTS使能
- //USART_HardwareFlowControl_CTS; //清除發(fā)送 CTS使能
- //USART_HardwareFlowControl_RTS_CTS;//RTS和 CTS使能
- USART_InitStructure.USART_Mode = USART_Mode_Tx|USART_Mode_Rx;
- //USART_Mode_Tx;//發(fā)送使能
- //USART_Mode_Rx;//接收使能
- USART_Init(USART2, &USART_InitStructure);//初始化串口
- USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); //開啟接收中斷,接收寄存器不空(RXNE=1)時(shí)產(chǎn)生中斷
- //USART_ITConfig(USART1, USART_IT_TXE, ENABLE); // 開啟發(fā)送中斷,發(fā)送寄存器空(TXE=1)時(shí)能產(chǎn)生中斷
- //串口的發(fā)送中斷有兩個(gè),分別是:
- // l發(fā)送數(shù)據(jù)寄存器空中斷(TXE)
- // l發(fā)送完成中斷(TC)
- USART_Cmd(USART2, ENABLE); //啟動(dòng)USART
- }
-
- /*----------------------------------------------發(fā)送函數(shù)------------------------------------------------------------*/
- 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;
- }
-
- /*------------------------------------------------------延遲函數(shù)----------------------------------------------------*/
- void delay_nms(u16 time)//延時(shí)子程序
- { u16 i=0;
- while(time--)
-
- { i=12000; //自己定義
- while(i--) ;
- }
- }
- /*--------------------------------------------------中斷服務(wù)函數(shù)--------------------------------------------------------*/
- //需要設(shè)置串口接收中斷和定時(shí)器3中斷,中斷時(shí)間為1ms
- //------------------------------------------------------------------
- //函數(shù)名:void USART1_IRQHandler(void)
- //輸入?yún)?shù):null
- //返回參數(shù):null
- //說(shuō)明:串口接收中斷服務(wù)
- void USART2_IRQHandler(void) //串口1 中斷服務(wù)程序
- {
- unsigned int i=0;
- if (USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //判斷接收寄存器是否非空
- {//如果接收寄存器非空,說(shuō)明檢測(cè)到中斷讀入
- RxBuffer[RxCounter++]=USART_ReceiveData(USART2); // Read one byte from the receive data register
- if (RxBuffer[RxCounter-1]=='\n') //如果檢測(cè)到換行,則設(shè)置接收標(biāo)志為1.
- // \n:換行,光標(biāo)到下行行首;
- // \r:回車,光標(biāo)到本行行首
- {
- Rx_Flag=1;
- for (i=0;i<RxCounter;i++)//把接收到的數(shù)據(jù)緩存到CmdBuffer中
- {
- CmdBuffer[i]=RxBuffer[i];
- }
- CmdBuffer[RxCounter]=0; //發(fā)送緩沖區(qū)結(jié)束符
- RxCounter=0;
- }
- if(RxCounter == RxBufferSize) //如果接收緩沖區(qū)滿了。
- {
- USART_ITConfig(USART2, USART_IT_RXNE, DISABLE); //關(guān)閉接收中斷
- Rx_Flag=1;
- CmdBuffer[RxCounter]=0; //接收命令緩沖區(qū)結(jié)束符
- RxCounter=0;
- }
- }
- }
復(fù)制代碼
|
評(píng)分
-
查看全部評(píng)分
|