stm32-c8t6实现语音识别(LD3320)

目录

LD3320介绍:

功能引脚

主要特色功能

通信协议

端口信息

开发流程

stm32c8t6代码

LD3320驱动代码:


LD3320介绍:

  • 内置单声道mono 16-bit A/D 模数转换
  • 内置双声道stereo 16-bit D/A 数模转换
  • 内置 20mW 双声道耳机放大器输出
  • 内置 550mW 单声道扬声器放大器输出
  • 支持并行接口或者 SPI 接口
  • 内置锁相电路 PLL,输入主控时钟频率为 2MHz - 34MHz
  • 工作电压:(VDD: for internal core) 3.3V
  • 48pin 的 QFN 7*7 标准封装
  • 省电模式耗电:1uA

功能引脚

功能引脚描述
3.3V3.3V电源正
GND电源地
MISOSPI数据输出
MOSISPI数据输入
SCKSPI时钟输入
NSS片选,低电平有效
NC悬空
RST复位
WR写允许,低电平有效
IRQ中断输出,输出下降沿

主要特色功能

LD3320 是一颗基于非特定人语音识别(SI-ASR:Speaker-Independent Automatic Speech Recognition)技术的语音识别/声控芯片。提供了真正的单芯片语音识别解决方案。LD3320 芯片上集成了高精度的 A/D 和 D/A 接口,不再需要外接辅助的 Flash 和 RAM,即可以实现语音识别/声控/人机对话功能。并且,识别的关键词语列表是可以动态编辑的。基于 LD3320,可以在任何的电子产品中,甚至包括最简单的 51 作为主控芯片的系统中,轻松实现语音识别/声控/人机对话功能。为所有的电子产品增加 VUI(Voice User Interface)语音用户操作界面。

  • 高准确度和实用的语音识别效果。
  • 非特定人语音识别技术:不需要用户进行录音训练。
  • 真正单芯片解决方案:不需要任何外接的辅助 Flash 和 RAM,真正降低系统成本。
  • 内置高精度 A/D和D/A通道:不需要外接 AD 芯片,只需要把麦克风接在芯片的AD 引脚上;可以播放声音文件,并提供 550mW 的内置放大器。
  • 支持用户自由编辑 50 条关键词语条:在同一时刻,最多在 50 条关键词语中进行识别,终端用户可以根据场景需要,随时编辑和更新这 50 条关键词语的内容。
  • 可动态编辑的识别关键词语列表:只需要把识别的关键词语以字符串的形式传送进芯片,即可以在下次识别中立即生效。比如,用户在 51 等 MCU 的编程中,简单地通过设置芯片的寄存器,把诸如“你好”这样的识别关键词的内容动态地传入芯片中,芯片就可以识别这样设定的关键词语了。

通信协议

读数据:
 

Read LD3320 SPI.png


写数据:
 

Write LD3320 SPI.png


SCS为从机片选, 仅当SCS为低电平时,芯片才会被使能。
SDI主设备数据输出,从设备数据输入(本模块为从设备)。
SDO为主设备数据输入,从设备数据输出(本模块为从设备)。
SDCK为SPI通信时钟。
对于SPI通信而言,数据是有传输时序的,即数据的捕获需要时钟信号的某个边沿触发,而这个边沿就是由时钟极性(CPOL)与时钟相位(CPHA)的组合决定的:
CPOL的高低决定串行同步时钟的空闲状态电平,CPOL = 0,为低电平;CPOL = 1,为高电平。
CPHA的高低决定串行同步时钟是在第一时钟跳变沿还是第二个时钟跳变沿数据被采集,当CPHA = 0,在第一个跳变沿进行数据采集;CPHA = 1,在第二个跳变沿进行数据采集。
从图中可以看出本模块的SPI传输规则:SDCK空闲时是高电平在第一个边沿时开始传输数据,即传输模式为模式二(0x10);8bit数据;按位传输,高位在前(MSB);另外,本模块的SPI速度建议小于1.5MHz

  1. 非特定人识别
    • 无需用户预先录音训练,可直接识别语音指令。
  2. 动态关键词列表
    • 支持动态编辑最多50条关键词(如“开灯”“关灯”),关键词以字符串形式传入芯片即可生效。
    • 关键词长度限制:不超过10个汉字或79字节拼音串。
  3. 硬件集成度高
    • 内置高精度A/D和D/A转换器,无需外接Flash、RAM或AD芯片,麦克风直连即可使用。
    • 提供550mW内置音频放大器,支持声音播放功能。
  4. 多种工作模式
    • 口令模式‌:需唤醒词(如“小呆”)触发后续指令,抗环境干扰能力强。
    • 普通模式/按键模式:直接识别或通过按键触发识别。
    • 硬件连接
      • 典型接口:WR(写使能)、IRQ(中断输出)等控制引脚3。
      • 示例:Arduino通过D8引脚控制LED,识别“开灯/关灯”指令10。
  • 软件配置
    • 关键词添加‌:通过寄存器动态写入关键词拼音(如"kai deng")310。
    • 代码库支持‌:提供STM32/Arduino驱动库及示例代码(如Voice.addCommand()函数)

端口信息

/*************端口信息********************
 * 接线说明
 LD3320接口       STM32接口
 * RST              PB6
 * CS               PB8
 * WR/SPIS          PB9
 * P2/SDCK          PB13
 * P1/SDO           PB14
 * P0/SDI           PB15
 * IRQ              PA3               
 * A0              PB7
 * RD               PA0

*****************************************/

LED PB12

 
#define LED_KT PBout(12) //客厅灯引脚口
#define LED_WS PBout(0) //卧室灯引脚口
#define JDY_FS PBout(1) //控制继电器风扇引脚口

开发流程

// Arduino示例(控制LED)  
#include <ld3320.h>  
VoiceRecognition Voice;  
#define Led 8  void setup() {  pinMode(Led, OUTPUT);  Voice.init();  Voice.addCommand("kai deng", 0); // 添加指令"开灯",标签0  Voice.addCommand("guan deng", 1); // 添加指令"关灯",标签1  Voice.start();  
}  void loop() {  switch(Voice.read()) {  case 0: digitalWrite(Led, HIGH); break; // 开灯  case 1: digitalWrite(Led, LOW); break;  // 关灯  }  
}  

stm32c8t6代码

/*************¶Ë¿ÚÐÅÏ¢********************* ½ÓÏß˵Ã÷LD3320½Ó¿Ú 	  STM32½Ó¿Ú* RST              PB6* CS   	        PB8* WR/SPIS          PB9* P2/SDCK          PB13* P1/SDO           PB14* P0/SDI           PB15* IRQ              PA3               * A0		        PB7* RD               PA0#define LED_KT PBout(12) //¿ÍÌüµÆÒý½Å¿Ú   
#define LED_WS PBout(0) //ÎÔÊÒµÆÒý½Å¿Ú
#define JDY_FS PBout(1) //¿ØÖƼ̵çÆ÷·çÉÈÒý½Å¿Ú*****************************************/#include "system.h"
#include "SysTick.h"
#include "variable.h"
#include "usart.h"
#include "spi.h"
#include "led.h"
#include "timer.h"
#include "LDchip.h"
#include <stdio.h>volatile float mm=0; extern void  LD3320_main(void);
int main()
{  	Systick_Init(72);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);USART1_Init(115200);//TIM3_Int_Init(5000-1,72-1);TIM4_Int_Init(999,72-1);LED_Init();//TIM_Cmd(TIM3,ENABLE);TIM_Cmd(TIM4,ENABLE);printf("³õʼ»¯Íê³É\r\n");LD3320_main();		//LD3320 Ö÷º¯Êýº¯Êýwhile(1){TimerTreat();ledshow();}
}

LD3320驱动代码:


#include "LDchip.h"
#include "Reg_RW.h"
#include "system.h"
#include "SysTick.h"
#include "usart.h"
#include <stdio.h>
#include "led.h"
/*************¶Ë¿ÚÐÅÏ¢********************* ½ÓÏß˵Ã÷LD3320½Ó¿Ú 	  STM32½Ó¿Ú* RST              PB6* CS   	        PB8* WR/SPIS          PB9* P2/SDCK          PB13* P1/SDO           PB14* P0/SDI           PB15* IRQ              PA3* A0		        PB7* RD               PA0*****************************************//************************************************************************************
//	nAsrStatus ÓÃÀ´ÔÚmainÖ÷³ÌÐòÖбíʾ³ÌÐòÔËÐеÄ״̬£¬²»ÊÇLD3320оƬÄÚ²¿µÄ״̬¼Ä´æÆ÷
//	LD_ASR_NONE:		±íʾûÓÐÔÚ×÷ASRʶ±ð
//	LD_ASR_RUNING£º		±íʾLD3320ÕýÔÚ×÷ASRʶ±ðÖÐ
//	LD_ASR_FOUNDOK:		±íʾһ´Îʶ±ðÁ÷³Ì½áÊøºó£¬ÓÐÒ»¸öʶ±ð½á¹û
//	LD_ASR_FOUNDZERO:	±íʾһ´Îʶ±ðÁ÷³Ì½áÊøºó£¬Ã»ÓÐʶ±ð½á¹û
//	LD_ASR_ERROR:		±íʾһ´Îʶ±ðÁ÷³ÌÖÐLD3320оƬÄÚ²¿³öÏÖ²»ÕýÈ·µÄ״̬
*********************************************************************************/uint8 nAsrStatus=0;	
void LD3320_Init(void);
uint8 RunASR(void);
void ProcessInt0(void);
void LD3320_EXTI_Cfg(void);
void LD3320_Spi_cfg(void);
void LD3320_GPIO_Cfg(void);
void LED_gpio_cfg(void);
static void Board_text(uint8 Code_Val);
extern void PrintComBit(USART_TypeDef* USARTx, uint8_t Data);
/***********************************************************
* Ãû    ³Æ£º LD3320_main(void)
* ¹¦    ÄÜ£º Ö÷º¯ÊýLD3320³ÌÐòÈë¿Ú
* Èë¿Ú²ÎÊý£º  
* ³ö¿Ú²ÎÊý£º
* ˵    Ã÷£º
* µ÷Ó÷½·¨£º 
**********************************************************/ 
void  LD3320_main(void)
{uint8 nAsrRes=0;LD3320_Init();	  while(1){switch(nAsrStatus){case LD_ASR_RUNING:case LD_ASR_ERROR:		break;case LD_ASR_NONE:nAsrStatus=LD_ASR_RUNING;if (RunASR()==0)	//	Æô¶¯Ò»´ÎASRʶ±ðÁ÷³Ì£ºASR³õʼ»¯£¬ASRÌí¼Ó¹Ø¼ü´ÊÓÆô¶¯ASRÔËËã{		nAsrStatus = LD_ASR_ERROR;}break;case LD_ASR_FOUNDOK:nAsrRes = LD_GetResult( );	//ʶ±ð³É¹¦×Ô¶¯ »ñȡʶ±ðÂë,ʶ±ðÂëÔÚLDChip.hÎļþÖУ¬×ÔÐж¨ÒåµÄÊý¾Ý										 									PrintComBit(USART1,nAsrRes ); //´®¿ÚÊä³öʶ±ðÂë								//Board_text(nAsrRes );//¿ª·¢°å²âÊÔÑÝʾ²¿·Ö---¶Ôʶ±ðÂëµÄ½øÐÐÅжÏ×ö³ö¶¯×÷ (Óû§Òà¿ÉÒÔÌí¼Ó×Ô¼ºµÄ¹¦ÄÜ£¬ÀýÈç¿ØÖÆIO¿ÚÊä³ö£¬´®¿ÚÊý¾ÝÊä³öµÈ)		nAsrStatus = LD_ASR_NONE;break;case LD_ASR_FOUNDZERO:default: nAsrStatus = LD_ASR_NONE;break;}//switch	//¿ª·¢°å²âÊÔBoard_text(nAsrRes );}// while
}static void Board_text(uint8 Code_Val)
{																					 switch(Code_Val)  //¶Ô½á¹ûÖ´ÐÐÏà¹Ø²Ù×÷{case CODE_DD:	//ÃüÁî¡°´ò¿ª¿ÍÌüµÆ¡±LED_KT=1;printf("´ò¿ª¿ÍÌüµÆ\r\n");break;case CODE_GD:		//ÃüÁî¡°¹Ø±Õ¿ÍÌüµÆ¡±LED_KT=0;printf("¹Ø±Õ¿ÍÌüµÆ\r\n");break;case CODE_QDD:		//ÃüÁî¡°´ò¿ªÎÔÊҵơ±//´ò¿ªÎÔÊÒµÆLED_WS = 1;printf("´ò¿ªÎÔÊÒµÆ\r\n");break;case CODE_DG:		//ÃüÁî¡°¹Ø±ÕÎÔÊҵơ±//¹Ø±ÕÎÔÊÒµÆLED_WS = 0;printf("¹Ø±ÕÎÔÊÒµÆ\r\n");break;case CODE_LSD:		//ÃüÁî¡°È«²¿´ò¿ª¡±//È«²¿´ò¿ªLED_KT=1;LED_WS = 1;printf("È«²¿´ò¿ª\r\n");break;case CODE_SSD:		//ÃüÁî¡°È«²¿¹Ø±Õ¡±//È«²¿¹Ø±ÕLED_KT=0;  LED_WS = 0;printf("È«²¿¹Ø±Õ\r\n");break;case CODE_DDR:		//ÃüÁî¡°´ò¿ª·çÉÈ¡±//´ò¿ª·çÉÈprintf("´ò¿ª·çÉÈ\r\n");JDY_FS = 0;break;case CODE_RDD:		//ÃüÁî¡°¹Ø±Õ·çÉÈ¡±//¹Ø±Õ·çÉÈJDY_FS = 1;printf("¹Ø±Õ·çÉÈ\r\n");break;default:break;}	
}
/***********************************************************
* Ãû    ³Æ£ºLD3320_Init(void)
* ¹¦    ÄÜ£ºÄ£¿éÇý¶¯¶Ë¿Ú³õʼÅäÖÃ
* Èë¿Ú²ÎÊý£º  
* ³ö¿Ú²ÎÊý£º
* ˵    Ã÷£º
* µ÷Ó÷½·¨£º 
**********************************************************/ 
void LD3320_Init(void)
{LD3320_GPIO_Cfg();	LD3320_EXTI_Cfg();LD3320_Spi_cfg();	 LD_reset();}
/***********************************************************
* Ãû    ³Æ£º	RunASR(void)
* ¹¦    ÄÜ£º	ÔËÐÐASR
* Èë¿Ú²ÎÊý£º  
* ³ö¿Ú²ÎÊý£º
* ˵    Ã÷£º
* µ÷Ó÷½·¨£º 
**********************************************************/ 
uint8 RunASR(void)
{uint8 i=0;uint8 asrflag=0;for (i=0; i<5; i++)			//	·ÀÖ¹ÓÉÓÚÓ²¼þÔ­Òòµ¼ÖÂLD3320оƬ¹¤×÷²»Õý³££¬ËùÒÔÒ»¹²³¢ÊÔ5´ÎÆô¶¯ASRʶ±ðÁ÷³Ì{LD_AsrStart();			//³õʼ»¯ASRLD3320_delay(100);if (LD_AsrAddFixed()==0)	//Ìí¼Ó¹Ø¼ü´ÊÓïµ½LD3320оƬÖÐ{LD_reset();			//	LD3320оƬÄÚ²¿³öÏÖ²»Õý³££¬Á¢¼´ÖØÆôLD3320оƬLD3320_delay(50);			//	²¢´Ó³õʼ»¯¿ªÊ¼ÖØÐÂASRʶ±ðÁ÷³Ìcontinue;}LD3320_delay(10);if (LD_AsrRun() == 0){LD_reset();			//	LD3320оƬÄÚ²¿³öÏÖ²»Õý³££¬Á¢¼´ÖØÆôLD3320оƬLD3320_delay(50);			//	²¢´Ó³õʼ»¯¿ªÊ¼ÖØÐÂASRʶ±ðÁ÷³Ìcontinue;}asrflag=1;break;					//	ASRÁ÷³ÌÆô¶¯³É¹¦£¬Í˳öµ±Ç°forÑ­»·¡£¿ªÊ¼µÈ´ýLD3320ËͳöµÄÖжÏÐźÅ}return asrflag;
}/***********************************************************
* Ãû    ³Æ£º void Delay_( int i)
* ¹¦    ÄÜ£º ¶ÌÑÓʱ
* Èë¿Ú²ÎÊý£º  
* ³ö¿Ú²ÎÊý£º
* ˵    Ã÷£º
* µ÷Ó÷½·¨£º 
**********************************************************/ 
void Delay_( int i){     while( i--){	}}	
/***********************************************************
* Ãû    ³Æ£º	LD3320_delay(unsigned long uldata)
* ¹¦    ÄÜ£º	³¤ÑÓʱº¯Êý
* Èë¿Ú²ÎÊý£º  
* ³ö¿Ú²ÎÊý£º
* ˵    Ã÷£º
* µ÷Ó÷½·¨£º 
**********************************************************/ void  LD3320_delay(unsigned long uldata)
{unsigned int j  =  0;unsigned int g  =  0;for (j=0;j<5;j++){for (g=0;g<uldata;g++){Delay_(120);}}
}/***********************************************************
* Ãû    ³Æ£ºLD3320_GPIO_Cfg(void)
* ¹¦    ÄÜ£º³õʼ»¯ÐèÒªÓõ½µÄIO¿Ú
* Èë¿Ú²ÎÊý£º  
* ³ö¿Ú²ÎÊý£º
* ˵    Ã÷£º
* µ÷Ó÷½·¨£º 
**********************************************************/ 
void LD3320_GPIO_Cfg(void)
{	GPIO_InitTypeDef GPIO_InitStructure;// ÅäÖÃPA8 Êä³ö	 8M ²¨ÐÎ	//¶¨ÒåRST/A0/CS/WR¶Ë¿Ú{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB ,ENABLE);//LD_CS	/RSETGPIO_InitStructure.GPIO_Pin =GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOB,&GPIO_InitStructure);GPIO_SetBits(GPIOB,GPIO_Pin_7);	/*A0ĬÈÏÀ­¸ß*/}
}
/***********************************************************
* Ãû    ³Æ£ºLD3320_Spi_cfg(void)
* ¹¦    ÄÜ£ºÅäÖÃSPI¹¦ÄܺͶ˿ڳõʼ»¯
* Èë¿Ú²ÎÊý£º  
* ³ö¿Ú²ÎÊý£º
* ˵    Ã÷£º
* µ÷Ó÷½·¨£º 
**********************************************************/ 
void LD3320_Spi_cfg(void)
{GPIO_InitTypeDef GPIO_InitStructure;SPI_InitTypeDef  SPI_InitStructure;RCC_APB2PeriphClockCmd(	RCC_APB2Periph_GPIOB, ENABLE );//PORTBʱÖÓʹÄÜ RCC_APB1PeriphClockCmd(	RCC_APB1Periph_SPI2,  ENABLE );//SPI2ʱÖÓʹÄÜ 	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //PB13/14/15¸´ÓÃÍÆÍìÊä³ö GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);LD_CS_H();GPIO_SetBits(GPIOB,GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);  //PB13/14/15ÉÏÀ­SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //ÉèÖÃSPIµ¥Ïò»òÕßË«ÏòµÄÊý¾Ýģʽ:SPIÉèÖÃΪ˫ÏßË«Ïòȫ˫¹¤SPI_InitStructure.SPI_Mode = SPI_Mode_Master;		//ÉèÖÃSPI¹¤×÷ģʽ:ÉèÖÃΪÖ÷SPISPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;		//ÉèÖÃSPIµÄÊý¾Ý´óС:SPI·¢ËͽÓÊÕ8λ֡½á¹¹SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;		//Ñ¡ÔñÁË´®ÐÐʱÖÓµÄÎÈ̬:ʱÖÓÐü¿Õ¸ßSPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;	//Êý¾Ý²¶»ñÓÚµÚ¶þ¸öʱÖÓÑØSPI_InitStructure.SPI_NSS = SPI_NSS_Soft;		//NSSÐźÅÓÉÓ²¼þ£¨NSS¹Ü½Å£©»¹ÊÇÈí¼þ£¨Ê¹ÓÃSSI룩¹ÜÀí:ÄÚ²¿NSSÐźÅÓÐSSIλ¿ØÖÆSPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64;		//¶¨Òå²¨ÌØÂÊÔ¤·ÖƵµÄÖµ:²¨ÌØÂÊÔ¤·ÖƵֵΪ16SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;	//Ö¸¶¨Êý¾Ý´«Êä´ÓMSBλ»¹ÊÇLSBλ¿ªÊ¼:Êý¾Ý´«Êä´ÓMSBλ¿ªÊ¼SPI_InitStructure.SPI_CRCPolynomial = 7;	//CRCÖµ¼ÆËãµÄ¶àÏîʽSPI_Init(SPI2, &SPI_InitStructure);  //¸ù¾ÝSPI_InitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèSPIx¼Ä´æÆ÷SPI_Cmd(SPI2, ENABLE); //ʹÄÜSPIÍâÉè
}
/***********************************************************
* Ãû    ³Æ£º LD3320_EXTI_Cfg(void) 
* ¹¦    ÄÜ£º ÍⲿÖжϹ¦ÄÜÅäÖúÍÏà¹Ø¶Ë¿ÚÅäÖÃ
* Èë¿Ú²ÎÊý£º  
* ³ö¿Ú²ÎÊý£º
* ˵    Ã÷£º
* µ÷Ó÷½·¨£º 
**********************************************************/ 
void LD3320_EXTI_Cfg(void)
{EXTI_InitTypeDef EXTI_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;//¶¨ÒåIRQÖжÏÒý½ÅÅäÖÃRCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitStructure.GPIO_Pin =GPIO_Pin_3;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);//ÍⲿÖжÏÏßÅäÖÃGPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource3);EXTI_InitStructure.EXTI_Line = EXTI_Line3;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger =EXTI_Trigger_Falling;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure);EXTI_GenerateSWInterrupt(EXTI_Line3);GPIO_SetBits(GPIOA,GPIO_Pin_3);	 //ĬÈÏÀ­¸ßÖжÏÒý½ÅEXTI_ClearFlag(EXTI_Line3);EXTI_ClearITPendingBit(EXTI_Line3);//ÖжÏǶÌ×ÅäÖÃNVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);
}/***********************************************************
* Ãû    ³Æ£º  EXTI1_IRQHandler(void)
* ¹¦    ÄÜ£º ÍⲿÖжϺ¯Êý
* Èë¿Ú²ÎÊý£º  
* ³ö¿Ú²ÎÊý£º
* ˵    Ã÷£º
* µ÷Ó÷½·¨£º 
**********************************************************/ 
void EXTI3_IRQHandler(void)
{if(EXTI_GetITStatus(EXTI_Line3)!= RESET ) {ProcessInt0();EXTI_ClearFlag(EXTI_Line3);EXTI_ClearITPendingBit(EXTI_Line3);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/web/83411.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RAG技术全解析:从概念到实践,构建高效语义检索系统——嵌入模型与向量数据库搭建指南

一、RAG技术概述&#xff1a;为什么需要RAG&#xff1f; 1.1 什么是RAG&#xff1f; RAG&#xff08;Retrieval-Augmented Generation&#xff09;是一种结合检索与生成能力的AI架构。其核心思想是通过外部知识库动态增强大语言模型&#xff08;LLM&#xff09;的生成能力&…

【资源分享】手机玩转经典游戏!小鸡模拟器1.9.0:PSP/NDS/GBA完美运行!

阿灿今天给大家推荐一款小鸡模拟器&#xff0c;这是一个老款PC和掌上游戏机模拟器。完美模拟街机&#xff08;fbamamemameplus).PS、PSP、FC(NES)SFC(SNES)、GBA、GBC、MD、NDS、DC、NGP、WS (WSC) PCE、ONS 等18款经典掌机游戏机。小鸡模拟器同时也提供海量热门的汉化版游戏免…

matlab脉冲信号并绘制波形2025.6.11

以下是一个使用MATLAB生成5V、10MHz脉冲信号并绘制波形的示例代码: % 5V 10MHz脉冲信号仿真 clc; clear; close all; % 参数设置 voltage = 5; % 信号幅度(V) frequency = 10e6; % 脉冲频率(10MHz) duty_cycle =

ElasticJob初探

依赖版本 JDK版本是&#xff1a;jdk17 springboot版本 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.2.4</version></parent>zookeeper elasticjo…

【Vue3】(三)vue3中的pinia状态管理、组件通信方式及总结、插槽

目录 一、vue3的pinia 1、什么是pinia&#xff1f; 2、为什么Vue3选择pinia&#xff1f; 3、使用pinia的好处 4、安装pinia 2、项目配置 3、存储/读取pinia中的数据 4、修改pinia中的数据 5、storeToRefs&#xff08;保持store中数据的响应式&#xff09; 6、getters 7、…

WEB3全栈开发——面试专业技能点P1Node.js / Web3.js / Ethers.js

一、Node.js 事件循环 Node.js 的事件循环&#xff08;Event Loop&#xff09;是其异步编程的核心机制&#xff0c;它使得 Node.js 可以在单线程中实现非阻塞 I/O 操作。 &#x1f501; 简要原理 Node.js 是基于 libuv 实现的&#xff0c;它使用事件循环来处理非阻塞操作。事件…

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…

web架构4------(nginx常用变量,nginx中英文自动匹配,lnmp网站架构,正向代理,反向代理,负载均衡)

一.前言 本期来介绍nginx最后几个知识点&#xff0c;看着要说的内容很多&#xff0c;其实一点也不多&#xff0c;都是所见即所得的东西。 二.nginx常用变量 2.1 常用变量 $args 请求中的参数&#xff0c;也叫查询参数&#xff0c;如www.123.com/1.php?a1&b2的$args就是…

openeuler系统(CentOs)图形化桌面黑屏/丢失(开启VNC服务冲突)

1. VNC服务开启如下&#xff1a; https://zhuanlan.zhihu.com/p/5049263261 在centos8系统上使用tigervnc-server搭建VNC_centos8 tigervnc-server-CSDN博客 2. 上述操作完成后&#xff0c;连接VNC仍会出现黑屏&#xff0c;则需要编辑/root/.vnc/xstartup&#xff1a; [运维…

MySQL:Prepared Statement 预处理语句

预处理语句&#xff08;Prepared Statements&#xff09;是 MySQL 中一种用于执行 SQL 查询的高效、安全的方法。通过使用预处理语句&#xff0c;可以显著提升查询性能&#xff0c;并防止 SQL 注入攻击。本文将详细介绍 MySQL 预处理语句的概念、使用方法及其优势。 一、预处理…

EPPLUS——CAD c#读写EXCEL的第三方库

EPPLUS(可支持NET35) 在 CAD 的 C# 二次开发中&#xff0c;使用 EPPLUS 库处理 Excel 文件具有以下显著优点&#xff0c;尤其在兼容性、便捷性和性能等方面契合 CAD 项目的需求&#xff1a; 1. 跨.NET 版本兼容性强&#xff0c;适配 CAD 多环境部署 多框架支持&#xff1a;EP…

Linux知识回顾总结----进程状态

本章将会介绍进程的一些概念&#xff1a;冯诺伊曼体系结构、进程是什么&#xff0c;怎么用、怎么表现得、进程空间地址、物理地址、虚拟地址、为什么存在进程空间地址、如何感性得去理解进程空间地址、环境变量是如何使用的。 目录 1. 冯诺伊曼体系结构 1.1 是什么 1.2 结论 …

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…

Android Test3 获取的ANDROID_ID值不同

Android Test3 获取的ANDROID_ID值不同 这篇文章来说明上一篇文章中说到的一个现象&#xff1a;在同一个项目中&#xff0c;创建不同的 app module&#xff0c;运行同一段测试代码&#xff0c;获取到的 ANDROID_ID 的值不同。 我也是第一次认真研究这个现象&#xff0c;这个还…

JSON 和 LabVIEW Data Types 互相转换

使用JSONtext C:\Program Files (x86)\National Instruments\LabVIEW 2021\examples\JDP Science\JSONtext JSONtext LabVIEW Data Types.vi

docker和docker-compose的版本对应关系怎么看?

docker和docker-compose的版本对应关系怎么看&#xff1f;最近在安装这两个工具&#xff0c;像知道他们的版本对应关系&#xff0c;查了不少资料才找到。 虽然 Docker 和 Docker Compose 的版本并不严格绑定&#xff0c;但是在某些情况下&#xff0c;新版本的 Docker Compose …

邮科ODM摄像头:多维度护航高铁安全系统方案解析

‌高铁作为现代交通的重要支柱&#xff0c;其安全稳定运行依赖于高效的监控体系。摄像头系统作为高铁安全管理的“视觉感知中枢”&#xff0c;凭借多场景覆盖、智能分析以及环境适应性设计&#xff0c;在行车安全、设备维护、乘客服务等方面发挥着不可或缺的作用。本文将从技术…

盒模型小全

CSS盒子模型详解 1. 定义 CSS盒子模型是用于描述HTML元素在页面中布局和表现的核心概念之一。在CSS中&#xff0c;所有HTML元素都被视为一个矩形的盒子&#xff0c;这些盒子封装了周围的HTML元素&#xff0c;并允许在其他元素和周围元素边框之间的空间放置内容。 2. 组成部分…

自定义鼠标效果 - 浏览器扩展使用教程

自定义鼠标效果 - 浏览器扩展使用教程 这里写目录标题 自定义鼠标效果 - 浏览器扩展使用教程功能特点安装方法Chrome/Edge浏览器 使用指南1. 更改鼠标光标样式2. 启用鼠标轨迹效果3. 自定义轨迹效果点状/彩虹/渐隐轨迹&#xff1a;表情轨迹&#xff1a; 管理自定义光标支持的文…

基于SpringBoot实现的课程答疑系统设计与实现【源码+文档】

基于SpringBootVue实现的课程答疑系统采用前后端分离架构方式&#xff0c;系统设计了管理员、学生、老师三种角色&#xff0c;系统实现了用户登录与注册、个人中心、学生管理、老师管理、科目类型管理、学生问题管理、老师回答管理、老师信息管理、关注列表管理、交流区、轮播图…