Proyecto de graduación de microcomputadora de un solo chip | Diseño de caja exprés inteligente basado en stm32

Página de inicio del autor: Programación de Paper Crane

Sobre el autor: Java, front-end y Python se han desarrollado durante muchos años y han trabajado como ingenieros, gerentes de proyectos y arquitectos.

Contenidos principales: desarrollo de proyectos Java, desarrollo de proyectos Python, datos universitarios y desarrollo de proyectos de IA, diseño de proyectos de microcontroladores, compilación de tecnología de entrevistas, intercambio de últimas tecnologías.

Colecciona, dale me gusta y no te pierdas, es bueno seguir al autor.

Obtenga el código fuente al final del artículo.

 

Número de proyecto: BS-DPJ-005

1. Introducción al medio ambiente

Configuración regional: lenguaje C

Tecnología de desarrollo: 51 microcontroladores

2. Introducción al proyecto

En la sociedad actual, las compras en línea y la entrega urgente fuera de línea se han convertido en una parte muy importante de la vida diaria. El desarrollo del comercio electrónico también ha propiciado la prosperidad de la industria de la entrega urgente. Esta es una gran oportunidad de desarrollo para la industria de entrega urgente, pero también es un desafío que no se puede ignorar. En la actualidad, la seguridad del transporte urgente ha atraído cada vez más atención y los requisitos de servicio para la entrega urgente también son cada vez mayores. Pero en lo que respecta al sector del envío urgente actual, también se enfrenta a problemas de un tipo u otro, siendo más común encontrarse con situaciones en las que el repartidor urgente no está en casa, y la hora de recoger el envío urgente no es correcto. Sobre esta base, se propone un gabinete exprés inteligente con STM32 como núcleo. Las funciones principales de este gabinete exprés incluyen la función de desbloqueo de huellas digitales, la función de botones, la función de alarma, la función de desbloqueo de puertas de gabinetes de relé y la función de código de verificación. El diseño principal incluye una función de desbloqueo de huellas digitales. Este sistema utiliza STM32F103 como chip de control principal y está equipado con una serie de módulos como sensor de huellas dactilares, teclado matricial 4*4, aviso de alarma y módulo de relé, lo que permite al mensajero almacenar de forma segura la entrega urgente. mensajería, pero también es conveniente para los usuarios. Si bien permite un acceso seguro y conveniente a la entrega urgente, también mejora el nivel de servicio de la industria de la entrega urgente.

3. Visualización del sistema

En el diseño de una caja express inteligente basada en STM32, se divide principalmente en los siguientes circuitos según el análisis de la demanda: circuito de alimentación, circuito de pantalla LCD1602, circuito de botón de función, circuito indicador, circuito de alarma y circuito del módulo de huellas dactilares.

Antes de fabricar, es necesario comprender el principio de funcionamiento y la función de cada circuito y luego determinar los componentes que se pueden utilizar en el circuito. Por ejemplo, el condensador del circuito de alimentación conmutada tiene la función de circuito de filtrado. Al mismo tiempo, también podemos elegir el condensador apropiado según el nivel de corriente en la línea. La corriente que pasa a través del circuito de indicación LED tiene la función de limitar la corriente. En general, se puede seleccionar. El rango de corriente es 100Ω-1 kΩ. Solo así podremos tener una buena comprensión de la selección de componentes.

Durante el proceso de diseño de esta serie, se encontraron muchos problemas, incluido el problema de diseño de la placa de circuito. Debido a un diseño incorrecto del cableado, el microcontrolador de la pantalla y el teclado no se pudieron coordinar y solo se pudieron rediseñar, lo cual fue un Pérdida de tiempo, mucho tiempo. Estos pueden reducirse mediante sus propios esfuerzos. Soldadura de salida ver.

Después de fabricar el cuerpo físico, primero use un multímetro para medir las piezas que están demasiado corroídas y conectadas mediante soldadura para asegurar la conexión entre ellas, y luego verifique los capacitores electrolíticos, diodos, transistores, zumbadores, etc. Suelde el positivo y el negativo. piezas para ver si están conectadas al revés. Después de confirmar que era correcto, para comprobar si la línea podía funcionar normalmente, el sensor era relativamente caro, así que no lo conecté, finalmente probé la línea y descubrí que no había ningún problema con la línea y la pantalla. era brillante. Conecte los sensores juntos en el orden de cada pin. Vea la imagen después de abrir.

La pantalla está en modo de espera. Presione el botón A para ingresar a las opciones de reconocimiento de huellas digitales y reconocimiento de contraseña, como se muestra en la figura.

Presione el botón B para ingresar al modo de huella digital, ingrese la huella digital y presione el botón D para confirmar que el relé ha completado la pantalla de desbloqueo, como se muestra en la figura.

Presione la tecla C para ingresar al modo de contraseña y se mostrará la contraseña. Presione la tecla D para confirmar que el relé ha completado la pantalla de desbloqueo, como se muestra en la figura.

4. Visualización del código central

#include "sys.h" 


//设置向量表偏移地址
//NVIC_VectTab:基址
//Offset:偏移量			 
void MY_NVIC_SetVectorTable(u32 NVIC_VectTab, u32 Offset)	 
{ 	   	 
	SCB->VTOR = NVIC_VectTab|(Offset & (u32)0x1FFFFF80);//设置NVIC的向量表偏移寄存器
	//用于标识向量表是在CODE区还是在RAM区
}
//设置NVIC分组
//NVIC_Group:NVIC分组 0~4 总共5组 		   
void MY_NVIC_PriorityGroupConfig(u8 NVIC_Group)	 
{ 
	u32 temp,temp1;	  
	temp1=(~NVIC_Group)&0x07;//取后三位
	temp1<<=8;
	temp=SCB->AIRCR;  //读取先前的设置
	temp&=0X0000F8FF; //清空先前分组
	temp|=0X05FA0000; //写入钥匙
	temp|=temp1;	   
	SCB->AIRCR=temp;  //设置分组	    	  				   
}
//设置NVIC 
//NVIC_PreemptionPriority:抢占优先级
//NVIC_SubPriority       :响应优先级
//NVIC_Channel           :中断编号
//NVIC_Group             :中断分组 0~4
//注意优先级不能超过设定的组的范围!否则会有意想不到的错误
//组划分:
//组0:0位抢占优先级,4位响应优先级
//组1:1位抢占优先级,3位响应优先级
//组2:2位抢占优先级,2位响应优先级
//组3:3位抢占优先级,1位响应优先级
//组4:4位抢占优先级,0位响应优先级
//NVIC_SubPriority和NVIC_PreemptionPriority的原则是,数值越小,越优先	   
void MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group)	 
{ 
	u32 temp;	
	MY_NVIC_PriorityGroupConfig(NVIC_Group);//设置分组
	temp=NVIC_PreemptionPriority<<(4-NVIC_Group);	  
	temp|=NVIC_SubPriority&(0x0f>>NVIC_Group);
	temp&=0xf;								//取低四位  
	NVIC->ISER[NVIC_Channel/32]|=(1<<NVIC_Channel%32);//使能中断位(要清除的话,相反操作就OK) 
	NVIC->IP[NVIC_Channel]|=temp<<4;		//设置响应优先级和抢断优先级   	    	  				   
} 
//外部中断配置函数
//只针对GPIOA~G;不包括PVD,RTC和USB唤醒这三个
//参数:
//GPIOx:0~6,代表GPIOA~G
//BITx:需要使能的位;
//TRIM:触发模式,1,下升沿;2,上降沿;3,任意电平触发
//该函数一次只能配置1个IO口,多个IO口,需多次调用
//该函数会自动开启对应中断,以及屏蔽线   	    
void Ex_NVIC_Config(u8 GPIOx,u8 BITx,u8 TRIM) 
{
	u8 EXTADDR;
	u8 EXTOFFSET;
	EXTADDR=BITx/4;//得到中断寄存器组的编号
	EXTOFFSET=(BITx%4)*4; 
	RCC->APB2ENR|=0x01;//使能io复用时钟			 
	AFIO->EXTICR[EXTADDR]&=~(0x000F<<EXTOFFSET);//清除原来设置!!!
	AFIO->EXTICR[EXTADDR]|=GPIOx<<EXTOFFSET;//EXTI.BITx映射到GPIOx.BITx 
	//自动设置
	EXTI->IMR|=1<<BITx;//  开启line BITx上的中断
	//EXTI->EMR|=1<<BITx;//不屏蔽line BITx上的事件 (如果不屏蔽这句,在硬件上是可以的,但是在软件仿真的时候无法进入中断!)
 	if(TRIM&0x01)EXTI->FTSR|=1<<BITx;//line BITx上事件下降沿触发
	if(TRIM&0x02)EXTI->RTSR|=1<<BITx;//line BITx上事件上升降沿触发
} 	  
//不能在这里执行所有外设复位!否则至少引起串口不工作.		    
//把所有时钟寄存器复位		  
void MYRCC_DeInit(void)
{	
 	RCC->APB1RSTR = 0x00000000;//复位结束			 
	RCC->APB2RSTR = 0x00000000; 
	  
  	RCC->AHBENR = 0x00000014;  //睡眠模式闪存和SRAM时钟使能.其他关闭.	  
  	RCC->APB2ENR = 0x00000000; //外设时钟关闭.			   
  	RCC->APB1ENR = 0x00000000;   
	RCC->CR |= 0x00000001;     //使能内部高速时钟HSION	 															 
	RCC->CFGR &= 0xF8FF0000;   //复位SW[1:0],HPRE[3:0],PPRE1[2:0],PPRE2[2:0],ADCPRE[1:0],MCO[2:0]					 
	RCC->CR &= 0xFEF6FFFF;     //复位HSEON,CSSON,PLLON
	RCC->CR &= 0xFFFBFFFF;     //复位HSEBYP	   	  
	RCC->CFGR &= 0xFF80FFFF;   //复位PLLSRC, PLLXTPRE, PLLMUL[3:0] and USBPRE 
	RCC->CIR = 0x00000000;     //关闭所有中断		 
	//配置向量表				  
#ifdef  VECT_TAB_RAM
	MY_NVIC_SetVectorTable(0x20000000, 0x0);
#else   
	MY_NVIC_SetVectorTable(0x08000000,0x0);
#endif
}
//THUMB指令不支持汇编内联
//采用如下方法实现执行汇编指令WFI  
void WFI_SET(void)
{
	__ASM volatile("wfi");		  
}
//关闭所有中断
void INTX_DISABLE(void)
{		  
	__ASM volatile("cpsid i");
}
//开启所有中断
void INTX_ENABLE(void)
{
	__ASM volatile("cpsie i");		  
}
//设置栈顶地址
//addr:栈顶地址
__asm void MSR_MSP(u32 addr) 
{
    MSR MSP, r0 			//set Main Stack value
    BX r14
}

//进入待机模式	  
void Sys_Standby(void)
{
	SCB->SCR|=1<<2;//使能SLEEPDEEP位 (SYS->CTRL)	   
  	RCC->APB1ENR|=1<<28;     //使能电源时钟	    
 	PWR->CSR|=1<<8;          //设置WKUP用于唤醒
	PWR->CR|=1<<2;           //清除Wake-up 标志
	PWR->CR|=1<<1;           //PDDS置位		  
	WFI_SET();				 //执行WFI指令		 
}	     
//系统软复位   
void Sys_Soft_Reset(void)
{   
	SCB->AIRCR =0X05FA0000|(u32)0x04;	  
} 		 
//JTAG模式设置,用于设置JTAG的模式
//mode:jtag,swd模式设置;00,全使能;01,使能SWD;10,全关闭;	   
//#define JTAG_SWD_DISABLE   0X02
//#define SWD_ENABLE         0X01
//#define JTAG_SWD_ENABLE    0X00		  
void JTAG_Set(u8 mode)
{
	u32 temp;
	temp=mode;
	temp<<=25;
	RCC->APB2ENR|=1<<0;     //开启辅助时钟	   
	AFIO->MAPR&=0XF8FFFFFF; //清除MAPR的[26:24]
	AFIO->MAPR|=temp;       //设置jtag模式
} 
//系统时钟初始化函数
//pll:选择的倍频数,从2开始,最大值为16		 
void Stm32_Clock_Init(u8 PLL)
{
	unsigned char temp=0;   
	MYRCC_DeInit();		  //复位并配置向量表
 	RCC->CR|=0x00010000;  //外部高速时钟使能HSEON
	while(!(RCC->CR>>17));//等待外部时钟就绪
	RCC->CFGR=0X00000400; //APB1=DIV2;APB2=DIV1;AHB=DIV1;
	PLL-=2;				  //抵消2个单位(因为是从2开始的,设置0就是2)
	RCC->CFGR|=PLL<<18;   //设置PLL值 2~16
	RCC->CFGR|=1<<16;	  //PLLSRC ON 
	FLASH->ACR|=0x32;	  //FLASH 2个延时周期
	RCC->CR|=0x01000000;  //PLLON
	while(!(RCC->CR>>25));//等待PLL锁定
	RCC->CFGR|=0x00000002;//PLL作为系统时钟	 
	while(temp!=0x02)     //等待PLL作为系统时钟设置成功
	{   
		temp=RCC->CFGR>>2;
		temp&=0x03;
	}    
}		    

void GPIO_Config(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef GPIO_pin,uint8_t GPIO_mode)
{
	uint32_t reg_tmp = 0x00; //寄存器缓存
    uint32_t reg_mode = 0x4; //寄存器模式配置   
    int8_t bitPos = -1;//引脚位置
    
	
    //PB3,PB4,PA12
    if((GPIO_pin==GPIO_Pin_12 && GPIOx==GPIOA)||((GPIO_pin &(GPIO_Pin_3|GPIO_Pin_4))!=0 && GPIOx==GPIOB))
    {                                                                                                                                                                                                          
		RCC->APB2ENR|= 0x00000001;//AFIOEN = 1;辅助功能IO时钟使能
		AFIO->MAPR 	|= 0x02000000;//配置AFIO_MAPR,的SWJ_CFG[2:0]位为010:关闭JTAG-DP,启用SW-DP
	}
	//先打开时钟
	     if(GPIOx == GPIOA)RCC->APB2ENR|=1<<2;
	else if(GPIOx == GPIOB)RCC->APB2ENR|=1<<3;	
	else if(GPIOx == GPIOC)RCC->APB2ENR|=1<<4;
	else return;

    //取得引脚位置
    while(GPIO_pin != ((uint16_t)0x0000))
    {
        GPIO_pin >>= 1;
        bitPos++;
    }
    
    //取寄存器配置模式
    reg_mode = GPIO_mode & ((uint32_t)0xF);
    if(GPIO_mode==GPIO_Mode_IPD)GPIOx->BRR = (((uint32_t)0x01) << bitPos);
    else if(GPIO_mode==GPIO_Mode_IPU)GPIOx->BSRR = (((uint32_t)0x01) << bitPos);
    //输出速度配置
    if (((GPIO_mode) & ((uint8_t)0x10)) != 0x00)
    {
        if((GPIO_mode&((uint8_t)0x03))==0x00)reg_mode |= GPIO_Speed_50MHz;//缺省位50MHz速度
    }
    
 
    
    //送到寄存器
    if(bitPos < 8) //引脚GPIO_Pin_x为低8位
    {
        reg_tmp = GPIOx->CRL;//拷贝寄存器
        reg_tmp &= (~(((u32)0xF)<<(bitPos*4)));//置零配置位
        reg_tmp |= ((reg_mode)<<(bitPos*4));//模式配置
        GPIOx->CRL = reg_tmp;
    }
    else//高8位
    {
        reg_tmp = GPIOx->CRH;
        reg_tmp &= (~(((u32)0xF)<<((bitPos-8)*4)));
        reg_tmp |= ((reg_mode)<<((bitPos-8)*4));
        GPIOx->CRH = reg_tmp;
        
    }
}


uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
  uint8_t bitstatus = 0x00;
   
  if ((GPIOx->IDR & GPIO_Pin) != (uint32_t)Bit_RESET)
  {
    bitstatus = (uint8_t)Bit_SET;
  }
  else
  {
    bitstatus = (uint8_t)Bit_RESET;
  }
  return bitstatus;
}

void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
  
  GPIOx->BSRR = GPIO_Pin;
}
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{ 
  GPIOx->BRR = GPIO_Pin;
}










5. Exhibición de trabajos relacionados

Basado en trabajos relacionados de Ja basados ​​en el subprograma WeChat y el desarrollo de aplicaciones de aplicaciones de Android

Desarrollo y aplicación de Internet de las Cosas embebido basado en 51 microcontroladores y otros dispositivos embebidos

Aplicaciones inteligentes de IA basadas en varios algoritmos

Diversos sistemas de gestión y recomendación de datos basados ​​en big data.

 

 

Supongo que te gusta

Origin blog.csdn.net/BS009/article/details/133303268
Recomendado
Clasificación