精华内容
下载资源
问答
  • 资料链接 :stm32智能门锁.rar 哔哩哔哩项目展示视频:https://b23.tv/bxfxvd 一、项目背景 在消费升级渗透在各个领域的今天,国民消费发生着巨大的变化,与每个人息息相关的家居行业也是如此。现今,越来越多的...

    智能门锁

    资料链接 :智能门锁.rar

    百度网盘下载链接:https://pan.baidu.com/s/1jmrMfNDlkZ9denImJRwzOw
    提取码:abcd(2020年12月7日08:26:11)

    原理图清晰图片:智能门锁连接图.bmp

    哔哩哔哩配套视频笔记:
    https://download.csdn.net/download/mbs520/20049130

    哔哩哔哩项目展示视频:https://b23.tv/bxfxvd

    哔哩哔哩视频教程:https://www.bilibili.com/video/BV1Ah411y71E
    在这里插入图片描述

    取走记得点赞,谢谢各位。

    一、项目背景

    在消费升级渗透在各个领域的今天,国民消费发生着巨大的变化,与每个人息息相关的家居行业也是如此。现今,越来越多的智能家居产品出现在普通老百姓的生活中,智能照明、智能窗帘、智能扫地机器人等各种智能产品都给人们的生活带来了极大的便利。智能门锁作为智能家居中重要的一环,也成为消费者家居智能化的重要选择。智能相比市面的机械门锁更加安全、更智能、更人性化而得到市场的认可,在智能门锁行业里,不少世界500强企业也在智能门锁上进行产品布局,像中国小米公司就生产智能门锁,致力打造智慧家庭,市场智能门锁能够支持五种解锁方式,支持指纹、手机、门禁门、按键密码、钥匙解锁功能。可以说是智能家庭必不可少的成员。
    在这里插入图片描述

    二、项目功能要求

    1、可通过指纹模块增删查改家庭成员的指纹信息,增删查改是否成功的相关信息显示在OLED屏幕上
    2、在指纹匹配过程中,如果采集的指纹与指纹模块库相匹配,OLED显示匹配成功,并转动步进电机一圈
    3、可通过按键设定智能门锁密码,密码可设置为两个(密码六位),如果匹配两个中的一个成功,即可开锁,也可通过按键修改密码,所有的操作过程显示于OLED中
    4、实现RFID与手机解锁(蓝牙解锁)
    5、扩展:虚位密码解锁(虚位密码:自己百度)

    项目所用到的主要技术:
    1、IIC协议、SPI协议、串口协议
    2、外部flash驱动、SD卡驱动
    3、FTAFS文件系统
    4、RTC实时时钟

    三、元件准备

    1、步进电机(带驱动模块)
    型号:28BYJ4+ULN2003

    在这里插入图片描述

    2、4X4矩阵按键
    在这里插入图片描述
    3、指纹模块AS608(串口控制)在这里插入图片描述

    4、0.96寸OLED显示屏(IIC)
    型号:7针

    在这里插入图片描述

    5、蓝牙模块HC-05
    在这里插入图片描述

    6、主控芯片STM32F407ZGT6
    型号:普中最小系统板
    在这里插入图片描述
    7、RFID RC522 射频模块(带一张卡片)在这里插入图片描述
    8、杜邦线

    四、项目设计

    (一)原理图设计

    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述
    在这里插入图片描述

    (二)硬件设计

    根据原理图连接好硬件电路
    在这里插入图片描述

    (三)程序设计

    由于代码过长只展示部分代码:

    #include "sys.h"
    #include "delay.h"
    #include "usart.h"
    #include "led.h"
    #include "sram.h"   
    #include "malloc.h" 
    #include "sdio_sdcard.h"    
    #include "malloc.h" 
    #include "w25qxx.h"    
    #include "ff.h"  
    #include "exfuns.h"    
    #include "fontupd.h"
    #include "text.h"	
    #include "oled.h"
    #include "beep.h"
    #include "button4_4.h"
    #include "AS608.h"
    #include "walkmotor.h"
    #include "usart2.h"
    #include "rtc.h"
    #include "MFRC522.h"
    #include "usart3.h"	
    #include "stmflash.h"
    
    #define usart2_baund  57600//串口2波特率,根据指纹模块波特率更改
    
    //要写入到STM32 FLASH的字符串数组
    const u8 TEXT_Buffer[]={0x17,0x23,0x6f,0x60,0,0};
    #define TEXT_LENTH sizeof(TEXT_Buffer)	 		  	//数组长度	
    #define SIZE TEXT_LENTH/4+((TEXT_LENTH%4)?1:0)
    #define FLASH_SAVE_ADDR  0X0802C124 	//设置FLASH 保存地址(必须为偶数,且所在扇区,要大于本代码所占用到的扇区.
    										//否则,写操作的时候,可能会导致擦除整个扇区,从而引起部分程序丢失.引起死机.
    
    SysPara AS608Para;//指纹模块AS608参数
    u16 ValidN;//模块内有效指纹个数
    u8** kbd_tbl;
    
    void Display_Data(void);//显示时间
    void Add_FR(void);	//录指纹
    void Del_FR(void);	//删除指纹
    int press_FR(void);//刷指纹
    void ShowErrMessage(u8 ensure);//显示确认码错误信息
    int password(void);//密码锁
    void SetPassworld(void);//修改密码
    void starting(void);//开机界面信息
    u8 MFRC522_lock(void);//刷卡解锁
    u8 Add_Rfid(void);		//录入
    void Set_Time(void);
    void Massige(void);
    u8 Pwd[7]="      ";  //解锁密码1
    u8 Pwd2[7]="      ";  //解锁密码2
    u8 cardid[6]={0,0,0,0,0,0};  //卡号1
    int Error;  //密码验证信息
    
    
    //数字的ASCII码
    uc8 numberascii[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
    //显示缓冲区
    u8  dispnumber5buf[6];
    u8  dispnumber3buf[4];
    u8  dispnumber2buf[3];
    //MFRC522数据区
    u8  mfrc552pidbuf[18];
    u8  card_pydebuf[2];
    u8  card_numberbuf[5];
    u8  card_key0Abuf[6]={0xff,0xff,0xff,0xff,0xff,0xff};
    u8  card_writebuf[16]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
    u8  card_readbuf[18];
    //SM05-S数据区
    u8  sm05cmdbuf[15]={14,128,0,22,5,0,0,0,4,1,157,16,0,0,21};
    //extern声明变量已在外部的C文件里定义,可以在主文件中使用
    extern u8  sm05receivebuf[16];	//在中断C文件里定义
    extern u8  sm05_OK;							//在中断C文件里定义
    
    u8 * week[7]={"Mon","Tue","Wed","Thu","Fri","Sat","Sun"};
    u8 * setup[7]={"1、录入指纹","2、删除指纹","3、修改密码","4、修改时间","5、录入卡片","6、查看信息"};
    
    int main(void)
    {
    	u16 set=0;
    	int key_num;
    	int time1;
    	int time2;		//锁屏时间
    	char arrow=0;  //箭头位子
    	
    	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
    	My_RTC_Init();		 		//初始化RTC
    	RTC_Set_WakeUp(RTC_WakeUpClock_CK_SPRE_16bits,0);		//配置WAKE UP中断,1秒钟中断一次
    	delay_init(168);  //初始化延时函数
    	uart_init(115200);	//初始化串口1波特率为115200,用于支持USMART
    	uart3_init(9600);// 蓝牙初始化
    	usart2_init(usart2_baund);//初始化串口2,用于与指纹模块通讯
    	PS_StaGPIO_Init();	//初始化FR读状态引脚
    	LED_Init();					//初始化LED  
    //	BEEP_Init();    		//beep初始化
    	Button4_4_Init();//矩阵按键初始化
    	OLED_Init(); 			//oled初始化
    	W25QXX_Init();				//初始化W25Q128
    	
    	Walkmotor_Init(); //步进电机初始化
    	my_mem_init(SRAMIN);		//初始化内部内存池 
    	my_mem_init(SRAMCCM);		//初始化CCM内存池 
    	exfuns_init();				//为fatfs相关变量申请内存  
     	 f_mount(fs[0],"0:",1); 		//挂载SD卡 
     	f_mount(fs[1],"1:",1); 		//挂载FLASH.
    	starting();//开机信息  logo
    
    	STMFLASH_Read(0X08020004,(u32*)Pwd,2);	//读取密码1
    	STMFLASH_Read(0X08090004,(u32*)Pwd2,2); //读取密码2
    	STMFLASH_Read(0X080f0004,(u32*)cardid,1); //读取卡号1
    	 while(1)
    	 {
    //锁屏界面
    MAIN:
    			OLED_Show_Font(56,48,0);//显示锁图标
    			while(1)
    			{
    				time1++;
    				if((time1%200)==0)//时间显示:每50ms更新一次显示数据
    				{
    					Display_Data();
    				}
    				if((time1%1000)==0)//每200ms检测一次卡片,蓝牙数据
    				{
    					//MFRC522解锁
    					MFRC522_Initializtion();			
    					Error=MFRC522_lock();
    					if(Error==0)goto MENU;	
    					else 
    						OLED_Show_Font(56,48,0);//锁
    					//手机蓝牙解锁密码1
    					Error=usart3_cherk((char*)Pwd);         
    					if(Error==0){
    						OLED_Clear();
    						Show_Str(20,10,128,24,"解锁中...",24,0);	
    						Walkmotor_ON();
    						Show_Str(20,10,128,24,"已解锁!",24,0);
    						goto MENU;	
    					}
    					else 
    						OLED_Show_Font(56,48,0);//锁
    					//手机蓝牙解锁密码2
    					Error=usart3_cherk((char*)Pwd2);
    					if(Error==0){
    						OLED_Clear();
    						Show_Str(20,10,128,24,"解锁中...",24,0);	
    						Walkmotor_ON();
    						Show_Str(20,10,128,24,"已解锁!",24,0);
    						goto MENU;	
    					}
    					else 
    						OLED_Show_Font(56,48,0);//锁
    					
    				} 
    				//指纹解锁
    				if(PS_Sta)	 //检测PS_Sta状态,如果有手指按下
    				{
    						while(PS_Sta){
    						Error=press_FR();//刷指纹
    						if(Error==0)goto MENU;
    						else 
    							OLED_Show_Font(56,48,0);//锁
    					}
    				}
    				//密码锁
    				key_num=Button4_4_Scan();	//按键扫描
    				if(key_num!=-1)
    				{
    					Error=password();
    					if(Error==0)goto MENU;	
    					else 
    						OLED_Show_Font(56,48,0);//锁
    				}
    			}
    
    

    五、上机调试

    把硬件连接好之后还需要做一些准备工作:
    录入指纹:
    (1)程序下载之前需要给门禁一个解锁方式,门锁一共有4种解锁方式:指纹、蓝牙、卡片、密码。其中卡片需要录入过系统的才可以解锁,密码一开始保存在stm32内部flash中,内部flash做eeprom需要先初始化,解锁后在设置中更改密码或者在代码中进行初始化密码,不然密码是乱码。
    (2)串口录入指纹:将串口转TTL CH340模块连接好指纹模块,用配套上位机录入自己的一个指纹。详细连接方法参考指纹模块资料
    (3)解锁后就可以进行设置密码和录入卡片等操作在这里插入图片描述
    在这里插入图片描述
    移植汉字库:(如果没有SD卡接口可以自己汉字取模显示)
    (1)准备一个sd卡,一个读卡器,用来存储汉字库,显示到OLED
    (2)找到开发资料下的SYSTEM文件夹
    在这里插入图片描述
    (3)把SYSTEM文件夹复制到SD卡根目录下(一定要是根目录下)在这里插入图片描述
    (4)复制好之后吧SD卡插到开发板
    (5)下载程序到开发板启动,如果可以显示汉字说已经移植成功。(注意:开始的化作尘&指纹锁界面是显示的图片,并不是汉字字体)

    一般遇到的问题:

    如果进去只显示“化作尘指纹锁”然后黑屏,那么是字库的问题
    如果因为不知道密码进不去主界面,那么打开代码,将密码打印出来,然后就可以用密码解锁了,一共两个密码,任意一个都可以解锁:
    在这里插入图片描述
    因为没有考虑到字符不全是’0’- '9’的关系,密码打印出来不是数字,所以查看密码不成功

    正确打开方式
    步骤一:直接给密码赋值操作,然后编译下载,下载完成后输入密码“123456”是肯定可以进主界面的,然后点击修改密码,密码修改为你想要的密码“000111”,这个密码会保存到内部eeprom
    ,密码初始化就完成了

    1、在127行加入如下代码编译下载
    在这里插入图片描述
    2、输入密码“123456”解锁
    在这里插入图片描述
    3、进入解锁后界面,选择修改密码
    在这里插入图片描述
    密码修改为“123456”后保存,会保存到内部eeprom
    在这里插入图片描述

    步骤二:把刚刚写的代码注释,重新下载进去,代码就可以正常运行了,输入刚刚设置的密码“000111”就可以解锁

    在这里插入图片描述
    蓝牙调试
    1、首先下载“蓝牙串口”APP
    2、连接蓝牙后发送密码“123456::”

    蓝牙发送密码不解锁?

    1、可能是波特率不对
    ①可以通过AT指令修改蓝牙模块的波特率与单片机一样(9600),使得蓝牙模块能连接单片机(单片机代码初始化蓝牙模块的波特率一般为9600)
    ②可以用usb转ttl将蓝牙模块与电脑相连,打开串口助手后,用手机连接蓝牙发送数据,调节串口助手的波特率,接收到正常数据后记录波特率,这个就是蓝牙模块现在的波特率,随后将代码中初始化蓝牙模块的波特率改成这个波特率,单片机就可以正常与蓝牙模块通信
    2、可能是蓝牙模块接线不对,吧tx rx对调
    3、可能蓝牙模块已经损坏

    开机图片取模显示
    取模软件合集.rar
    1、先画一张黑白的128*64分辨率的 .bmp图片
    在这里插入图片描述
    2、打开Image2Lcd软件,先打开图片,按照如下配置,点击保存,会生成取模代码
    在这里插入图片描述

    六、知识扫盲

    (一)汉字的显示
    (具体代码参考正点原子“汉字显示实验”)

    1、汉字的显示原理

    1)学习过屏幕驱动的应该都知道,屏幕的显示无非就是在屏幕上打相应颜色的点,比如要显示一个字符 ‘A’ 那么我只需要知道 ‘A’ 相应的点阵数据就可以把它显示出来,汉字也一样。

    2、汉字库

    1)汉字库文件在正点原子的开发板资料->“SD卡根目录文件”中,可以到正点原子官网论坛下载
    在这里插入图片描述
    2)汉字库有两类文件,.FON与.BIN文件,.FON代表汉字库点阵文件,.BIN表示的是编码表,与点阵一一对应,比如GBK编码的第一个字就对应着点阵里的第一个点阵数据,映射关系如下:
    UNIGBK->GBK12.FON
    UNIGBK->GBK24.FON
    UNIGBK->GBK32.FON

    有兴趣可以百度一下查看GBK编码表:
    在这里插入图片描述

    2、汉字库的存储位置

    2)汉字与字符不同的是,汉字有1万多个,ASCII码字符却只有100多个,并且汉字的显示明显比字符的点阵复杂程度高,比如说字体是12的字符占用点阵是12x6,每个字符需要12x6/8=9个字节的存储空间。字体是12 的汉字占用12x12的点阵,每个汉字需要12x12/8=18个字节存储空间,这还是最小字体,大的字体所需要的存储空间只会成倍增加

    3)一般12号字体的汉字库需要500K字节、16号字体700K、24号字体1.6M、32号字体3M,这对于单片机来说数据量太大了,内部FLASH512K~1M表示压力很大
    在这里插入图片描述
    4)需要把汉字库保存到SD卡,再将SD卡中的汉字库数据保存到外部FILASH才行,w25q128无疑是个好选择,它拥有16M的存储空间,SPI通信协议,读写速度也是相当快。

    (二)把汉字库里的点阵数据读取出来显示到MCU屏

    1、数据编码格式的问题

    1)有关显示汉字就必然会涉及编码格式的问题,不同的编码格式对应的汉字编码是不同的,比如UTF-8编码的文件用GB2312编码打开就会乱码。
    同理,比如文档的格式是UTF-8编码,但是我的字库是GBK编码,读出来的数据直接显示到屏幕就必然会乱码

    2)所以显示汉字如果乱码首先需要检查的就是编辑器的编码,保证编码一致。

    七、项目图片展示

    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述

    资料下载:https://download.csdn.net/download/mbs520/12662458
    在这里插入图片描述

    在这里插入图片描述

    展开全文
  • STM32开发项目:如何从TRUEStudio转移到STM32CubeIDE 以 Ubuntu 18.04 的TRUEStudio(版本号:9.1)转移至macOS STM32CubeIDE(版本号:1.3.0)为例 Clean原TrueStudio工程(Project->Clean) 删除原True...

    目录

    转移的一般步骤

    sprintf函数报错处理

    尚未查明原因的一个现象


    以 Ubuntu 18.04 的TRUEStudio(版本号:9.1)转移至macOS/windows STM32CubeIDE(版本号:1.3.0)为例

    转移的一般步骤

    • Clean原TrueStudio工程(Project->Clean)
    • 修改Makefile文件,可与已经移植过来的工程中Makefile作个文件对比
      • 修改1,主要是编译器的选择
      • 修改2,修改linker flags选项,主要与sprintf函数使用有关
        • 增加-lrdimon -u _printf_float选项
        • 修改-specs=nosys.specs-specs=nano.specs
    SHELL = sh
    OBJECT_NAME = alwhalesStm32Project
    # System configuration
    CC = arm-none-eabi-gcc
    CC_OBJCOPY = arm-none-eabi-objcopy
    LINKER_FLAGS = -lm -mthumb -mcpu=cortex-m3  -Wl,--gc-sections -T$(LINK_SCRIPT) \
    	-static  -Wl,--start-group -lc -lrdimon -u _printf_float \
    	-lm -Wl,--end-group  -specs=nano.specs  -Wl,-cref "-Wl,-Map=$(BIN_DIR)/$(OBJECT_NAME).map" \
    	-Wl,--defsym=malloc_getpagesize_P=0x1000
    • 在STM32CubeIDE中再创建一个新的STM32工程。

    • 将新创建的工程文件夹中的工程文件(.cproject & .project)拷贝(替换)到已导入的TrueStudio工程的工程文件夹中(先关闭该工程)

    亦可以直接将已经成功移植过来的工程文件.cproject & .project替换原工程文件,然后直接用STM32F103CubeIDE导入已存在的项目到工作空间即可:


    重新打开已导入的TrueStudio工程,修改部分参数(笔者没有采用系统自动生成的Makefile体系,采用了自定义Makefile文件),需要修改的如下图所示:

    0.设置构建自动刷新的目录

     

    1. 设置构建命令和构建位置

    2. 删除定义的引用文件与源码文件(手动在Makefile文件中添加)

    • ⌘+B 重新编译工程

    • 重新设置调试过程(Run->Debug Configurations...)

    ⌘+F11 下载程序,调试(All done.)


    sprintf函数报错处理

    如果使用了int sprintf(char* str, const char *fmt, ...)函数,可能会在对应位置出现如下报错:

    The float formatting support is not enabled, check your MCU Settings from "Project Properties > C/C++ Build > Settings > Tool Settings", or add manually "-u _printf_float" in linker flags.

    初步判断错误类型为: Code analysis problem, 属于Codan Errors:

    笔者的项目由于完全采用自己编写的Makefile文件,因此编译过程与这些错误无关,只需要按照它指示的要求在Makefile文件中linker flags中添加"-u _printf_float"选项即可(但是不能消除错误)。经过摸索,可以采取以下步骤“骗过”编译器,消除这个错误:

    1. 重新打开自动生成Makefile文件功能

    2. 此时的C/C++ Build->Settings出现了Tool Settings的选项

    3.勾选Use float with printf from newlib-nano (-u _printf_float),并点击Apply and Close,此时错误会自动消除

    4.再次取消自动生成Makefile文件功能,这个报错不会再次出现。


    尚未查明原因的一个现象

    STM32CubeIDE中自动生成的makefile文件中在linker flags 中有一个选项是-specs=nano.specs,而笔者用的选项是-specs=nosys.specs,这个选项的区别在于选择哪一个静态库

    已经观察到的一个区别是:

    1.代码编译后的使用空间不一样:

    nano库:

    nosys库:

    2.使用nosys库无论是否添加-lrdimon -u _printf_float选项都会报错:

    The float formatting support is not enabled, check your MCU Settings from "Project Properties > C/C++ Build > Settings > Tool Settings", or add manually "-u _printf_float" in linker flags.

     

    展开全文
  • STM32】HAL库 STM32CubeMX教程四---UART串口通信详解

    万次阅读 多人点赞 2019-08-11 08:57:51
    今天我们学习STM32CubeMX串口的操作,以及HAL库串口的配置,我们会详细的讲解各个模块的使用和具体功能,并且基于HAL库实现Printf函数功能重定向,UART中断接收,本系列教程将HAL库与STM32CubeMX结合在一起讲解,使...

    前言: 

    今天我们学习STM32CubeMX串口的操作,以及HAL库串口的配置,我们会详细的讲解各个模块的使用和具体功能,并且基于HAL库实现Printf函数功能重定向,UART中断接收,本系列教程将HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用

     

    所用工具

    1、芯片: STM32F407ZET6

    2、STM32CubeMx软件

    3、IDE: MDK-Keil软件

    4、STM32F1xx/STM32F4xxHAL库 

    5、串口: 使用USART1 PA9,PA10

    知识概括:

    通过本篇博客您将学到:

    STM32CubeMX创建串口例程

    HAL库UATR函数库

    重定义printf函数

    HAL库,UART中断接收

    HAL库UATR接收与发送例程

    工程创建

     

    1设置RCC

    • 设置高速外部时钟HSE 选择外部时钟源

    2设置串口

    • 1点击USATR1   
    • 2设置MODE为异步通信(Asynchronous)       
    • 3基础参数:波特率为115200 Bits/s。传输数据长度为8 Bit。奇偶检验无,停止位1      接收和发送都使能 
    • 4GPIO引脚设置 USART1_RX/USART_TX
    • 5 NVIC Settings 一栏使能接收中断

    3设置时钟

    我的是  外部晶振为8MHz 

    • 1选择外部时钟HSE 8MHz   
    • 2PLL锁相环倍频72倍
    • 3系统时钟来源选择为PLL
    • 4设置APB1分频器为 /2

    32的时钟树框图  如果不懂的话请看《【STM32】系统时钟RCC详解(超详细,超全面)》

     

    4项目文件设置

    • 1 设置项目名称
    • 2 设置存储路径
    • 3 选择所用IDE

    5创建工程文件

    然后点击GENERATE CODE  创建工程

    配置下载工具

    新建的工程所有配置都是默认的  我们需要自行选择下载模式,勾选上下载后复位运行

    HAL库UART函数库介绍

     

      UART结构体定义

    UART_HandleTypeDef huart1;

    UART的名称定义,这个结构体中存放了UART所有用到的功能,后面的别名就是我们所用的uart串口的别名,默认为huart1

    可以自行修改

    1、串口发送/接收函数

    • HAL_UART_Transmit();串口发送数据,使用超时管理机制 
    • HAL_UART_Receive();串口接收数据,使用超时管理机制
    • HAL_UART_Transmit_IT();串口中断模式发送  
    • HAL_UART_Receive_IT();串口中断模式接收
    • HAL_UART_Transmit_DMA();串口DMA模式发送
    • HAL_UART_Transmit_DMA();串口DMA模式接收

    这几个函数的参数基本都是一样的,我们挑两个讲解一下

    串口发送数据:

    HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)

    功能:串口发送指定长度的数据。如果超时没发送完成,则不再发送,返回超时标志(HAL_TIMEOUT)。

    参数:

    • UART_HandleTypeDef *huart      UATR的别名    如 :   UART_HandleTypeDef huart1;   别名就是huart1  
    • *pData      需要发送的数据 
    • Size    发送的字节数
    • Timeout   最大发送时间,发送数据超过该时间退出发送   
    举例:   HAL_UART_Transmit(&huart1, (uint8_t *)ZZX, 3, 0xffff);   //串口发送三个字节数据,最大传输时间0xffff

    中断接收数据:

    HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)

    功能:串口中断接收,以中断方式接收指定长度数据。
    大致过程是,设置数据存放位置,接收数据长度,然后使能串口接收中断。接收到数据时,会触发串口中断。
    再然后,串口中断函数处理,直到接收到指定长度数据,而后关闭中断,进入中断接收回调函数,不再触发接收中断。(只触发一次中断)

    参数:

    • UART_HandleTypeDef *huart      UATR的别名    如 :   UART_HandleTypeDef huart1;   别名就是huart1  
    • *pData      接收到的数据存放地址
    • Size    接收的字节数
    举例:    HAL_UART_Receive_IT(&huart1,(uint8_t *)&value,1);   //中断接收一个字符,存储到value中

    2、串口中断函数

     

    • HAL_UART_IRQHandler(UART_HandleTypeDef *huart);  //串口中断处理函数
    • HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart);  //串口发送中断回调函数
    • HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart);  //串口发送一半中断回调函数(用的较少)
    • HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);  //串口接收中断回调函数
    • HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart);//串口接收一半回调函数(用的较少)
    • HAL_UART_ErrorCallback();串口接收错误函数

    串口接收中断回调函数:

    HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);  

    功能:HAL库的中断进行完之后,并不会直接退出,而是会进入中断回调函数中,用户可以在其中设置代码,

               串口中断接收完成之后,会进入该函数,该函数为空函数,用户需自行修改,

    参数:

    • UART_HandleTypeDef *huart      UATR的别名    如 :   UART_HandleTypeDef huart1;   别名就是huart1  
    举例:   HAL_UART_RxCpltCallback(&huart1){           //用户设定的代码               }

    串口中断处理函数

    HAL_UART_IRQHandler(UART_HandleTypeDef *huart);  

    功能:对接收到的数据进行判断和处理  判断是发送中断还是接收中断,然后进行数据的发送和接收,在中断服务函数中使用

     

    如果接收数据,则会进行接收中断处理函数

     /* UART in mode Receiver ---------------------------------------------------*/
      if((tmp_flag != RESET) && (tmp_it_source != RESET))
      { 
        UART_Receive_IT(huart);
      }
    

    如果发送数据,则会进行发送中断处理函数

      /* UART in mode Transmitter ------------------------------------------------*/
      if (((isrflags & USART_SR_TXE) != RESET) && ((cr1its & USART_CR1_TXEIE) != RESET))
      {
        UART_Transmit_IT(huart);
        return;
      }

    3串口查询函数

      HAL_UART_GetState();  判断UART的接收是否结束,或者发送数据是否忙碌

      举例:     

    while(HAL_UART_GetState(&huart4) == HAL_UART_STATE_BUSY_TX)   //检测UART发送结束

     

    USART接收与发送

     

    重新定义printf函数

    • 在 stm32f4xx_hal.c中包含#include <stdio.h>
    #include "stm32f4xx_hal.h"
    #include <stdio.h>
    extern UART_HandleTypeDef huart1;   //声明串口
    • 在 stm32f4xx_hal.c 中重写fget和fput函数
    • /**
        * 函数功能: 重定向c库函数printf到DEBUG_USARTx
        * 输入参数: 无
        * 返 回 值: 无
        * 说    明:无
        */
      int fputc(int ch, FILE *f)
      {
        HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
        return ch;
      }
      
      /**
        * 函数功能: 重定向c库函数getchar,scanf到DEBUG_USARTx
        * 输入参数: 无
        * 返 回 值: 无
        * 说    明:无
        */
      int fgetc(FILE *f)
      {
        uint8_t ch = 0;
        HAL_UART_Receive(&huart1, &ch, 1, 0xffff);
        return ch;
      }
      
      在main.c中添加
     #define RXBUFFERSIZE  256
    char RxBuffer[RXBUFFERSIZE]; 
    
      while (1)
      {
        /* USER CODE END WHILE */
    			printf("Z小旋测试\n");
    			HAL_Delay(1000);
        /* USER CODE BEGIN 3 */
      }

    之后便可以使用Printf函数和Scanf,getchar函数

    UART接收中断

    因为中断接收函数只能触发一次接收中断,所以我们需要在中断回调函数中再调用一次中断接收函数

    具体流程:

    1、初始化串口

    2、在main中第一次调用接收中断函数

    3、进入接收中断,接收完数据  进入中断回调函数

    4、修改HAL_UART_RxCpltCallback中断回调函数,处理接收的数据,

    5  回调函数中要调用一次HAL_UART_Receive_IT函数,使得程序可以重新触发接收中断

    函数流程图:

    HAL_UART_Receive_IT(中断接收函数   ->  USART2_IRQHandler(void)(中断服务函数)    ->    HAL_UART_IRQHandler(UART_HandleTypeDef *huart)(中断处理函数)    ->    UART_Receive_IT(UART_HandleTypeDef *huart) (接收函数)   ->    HAL_UART_RxCpltCallback(huart);(中断回调函数)

    HAL_UART_RxCpltCallback函数就是用户要重写在main.c里的回调函数。

    代码实现:

        并在main.c中添加下列定义:

    #include <string.h>
    
    #define RXBUFFERSIZE  256     //最大接收字节数
    char RxBuffer[RXBUFFERSIZE];   //接收数据
    uint8_t aRxBuffer;			//接收中断缓冲
    uint8_t Uart1_Rx_Cnt = 0;		//接收缓冲计数
    

    在main()主函数中,调用一次接收中断函数

    /* USER CODE BEGIN 2 */
    	HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1);
    /* USER CODE END 2 */
    

    在main.c下方添加中断回调函数

    /* USER CODE BEGIN 4 */
    
    void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
    {
      /* Prevent unused argument(s) compilation warning */
      UNUSED(huart);
      /* NOTE: This function Should not be modified, when the callback is needed,
               the HAL_UART_TxCpltCallback could be implemented in the user file
       */
     
    	if(Uart1_Rx_Cnt >= 255)  //溢出判断
    	{
    		Uart1_Rx_Cnt = 0;
    		memset(RxBuffer,0x00,sizeof(RxBuffer));
    		HAL_UART_Transmit(&huart1, (uint8_t *)"数据溢出", 10,0xFFFF); 	
            
    	}
    	else
    	{
    		RxBuffer[Uart1_Rx_Cnt++] = aRxBuffer;   //接收数据转存
    	
    		if((RxBuffer[Uart1_Rx_Cnt-1] == 0x0A)&&(RxBuffer[Uart1_Rx_Cnt-2] == 0x0D)) //判断结束位
    		{
    			HAL_UART_Transmit(&huart1, (uint8_t *)&RxBuffer, Uart1_Rx_Cnt,0xFFFF); //将收到的信息发送出去
                while(HAL_UART_GetState(&huart1) == HAL_UART_STATE_BUSY_TX);//检测UART发送结束
    			Uart1_Rx_Cnt = 0;
    			memset(RxBuffer,0x00,sizeof(RxBuffer)); //清空数组
    		}
    	}
    	
    	HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1);   //再开启接收中断
    }
    /* USER CODE END 4 */
    

    发送数据被正常返回

     

     

    展开全文
  • STM32毕业设计项目

    2021-05-11 19:21:46
    STM32毕业设计项目 文章目录STM32毕业设计项目1、基于STM32单片机大棚环境参数无线蓝牙检测设计 1、基于STM32单片机大棚环境参数无线蓝牙检测设计 开题报告 论文 制作原理 原理图&PCB

    STM32毕业设计项目

    1、基于STM32单片机大棚环境参数无线蓝牙检测设计

    2、基于STM32单片机智能RFID刷卡汽车位锁设计

    https://wusiyuan.blog.csdn.net/article/details/117019231

    展开全文
  • 本文将以工程中MCU型号从STM32F103C8Tx改为STM32F103VCTx为例,说明一下具体的操作步骤。 操作步骤 修改工程文件.cproject 用文本编辑器(NotePad++)打开.cproject工程文件,采用查找替换的方式,将工程文件中的原...
  • 项目是在Atollic TrueSTUDIO for STM32 9.3.0中采用STM32标准库生成的STM32工程项目,之后采用STM32CubeIDE进行开发。现需要将C8T6工程文件移植成RCT6工程文件。未在STM32CubeIDE生成工程文件的原因是,该IDE无法...
  • STM32开源项目

    千次阅读 2012-10-23 09:41:42
    STM32开源项目2012总目录 http://armjishu.com/bbs/forum.php?mod=viewthread&tid=2905 STM32神舟开发板博客:http://blog.sina.com.cn/u/1989261580 STM32神舟开发板微博: ...
  • STM32物联网实战项目

    千次阅读 2020-06-02 15:25:45
    B站视频介绍: STM32物联网实战项目介绍20200602
  • STM32CubeMX 项目配置窗口介绍(二):介绍了 Project Manager 窗口,内附图文。
  • 实验2 新建Stm32点灯项目 一、 实验准备 硬件:RFID 实验箱,电脑等。 软件:Keil4 工具: 1.JLINK 驱动安装(必备) 2.STM32芯片开发环境(必备) 3.串口助手sscom32(必备) 4.实验对应的源代码(必备) 二...
  • STM32物联网实战项目 - 项目需求

    千次阅读 2020-06-17 08:05:20
    以主流的STM32单片机为主控,GPRS与WIFI为联网模组,配合丰富的外设与接口,设计一款功能齐全的开发板,让学员在学习产品设计的过程中,熟练的掌握STM32单片机的应用。 一、功能需求 1、单片机型号 主流的STM32F103...
  • STM32CubeMX 项目配置窗口介绍(一)

    千次阅读 2020-08-09 10:50:57
    STM32CubeMX 项目配置窗口介绍(一):介绍了 Pinout & Configuration 和 Clock Configuration 窗口,内附图文。
  • 本系列教程将 对应外设原理,HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 所用工具: 1、芯片: STM32F407ZET6/ STM32F103ZET6 2、STM32CubeMx软件 3、IDE: MDK-Keil软件 4、STM32F1xx/...
  • STM32学习——入门小项目

    千次阅读 2020-09-18 20:26:54
    这个小项目是来自参加电设时,老师发的STM32入门(进阶)任务,具体的要求如下: 软件设计要求 编写简单I/O程序,能用板上的4个基本按键控制10个LED灯的亮灭。(扩展要求:设计不同的流水灯或呼吸灯效果,并能...
  • 第一个STM32CubeIDE项目

    万次阅读 热门讨论 2019-06-22 08:34:22
    使用STM32CubeIDE的第一个项目开始第一个项目添加代码 今天开始做一个STM32CubeIDE的第一个项目,首先需要说明的: STM32CubeIDE是一个免费的软件 开始第一个项目 在文件菜单中选择NEW -> STM32 Project ...
  • STM32项目文件分组

    千次阅读 2016-06-30 16:07:45
    STM32的库文件下面一堆文件,看着好晕,创建工程分组也很麻烦,其实分类清楚,也就有调理了。 首先,从前面介绍过的STM32的启动文件开始。 启动文件一般在startup文件夹里,一般有几个,文件名一般都是startup_stm32...
  • STM32F0项目进阶之实时时钟DS1307

    千次阅读 2015-07-06 12:06:12
    写在前面的话:STM32F0项目进阶系列是硬件系统工程师星克曼以项目进阶的方式写出的入门教程,以项目开发为蓝底,快速学习进入实战。STM32 I2C总线在上一讲 STM32F030项目进阶之I2C 中已经讲过了,已经将标准库抽象成...
  • STM32实战项目经验:HAL_RCC_OscConfig中程序卡死问题解决办法 工程环境 STM32CUBEIDE STM32F415VG 现象复现 项目中一个是IAP程序,另一个是APP程序,两个程序都是使用STM32CubeIDE生成,当程序跳转到APP中并且...
  • 1、STM32+ESP8266+程序的智能家居(项目简介)

    千次阅读 多人点赞 2020-07-11 12:28:32
    文章目录1、STM32+ESP8266+程序的智能家居学习1.1 准备知识,了解整个项目的过程1.1.1 Esp82661.1.1.1 ESP8266-01s1.1.1.2 esp8266 -12F1.1.2 stm321.1.2.1 stm32f103c8t61.1.3 传感器的选择(我用了一个传感器,...
  • STM32项目设计:基于STM32F4的电子阅读器制作教程

    千次阅读 多人点赞 2020-12-08 09:58:13
    基于STM32F4的电子阅读器 一、项目功能要求 项目说明: 项目偏软件,但是要依赖于自己对硬件的熟悉和驱动才能完成 用到的主要技术: SD卡驱动(难–不过可移植 SD卡驱动细节可在用完再了解其驱动协议) FatFs文件...
  • 2018.1.19 HAL库详解见STM32之HAL库详解 及 手动移植 STM32 Embedded Software   工作以来一直使用ST的STM32系列芯片,ST为开发者提供了非常方便的开发库。到目前为止,有标准外设库(STD库)、HAL库、LL库 三...
  • STM32F103为例,记录配置GPIO外部中断的一般方法与流程。 配置RCC时钟 RCC时钟配置是STM32MCU顺利运行的必备步骤,笔者使用的参考代码如下: void RCC_Config() { RCC_DeInit(); //使能HSE,并...
  • 前言: 小车的避障功能可以通过红外或者超声波模块来实现,这里先讲讲使用红外...红外模块和stm32的连线如下 只要三根线,VCC接开发板的3.3V,GND就接GND,红外对管的OUT找个普通IO引脚就可以。 一、避障流程图 ...
  • 3.stm32的标准库(下载对应芯片的库) 注意:本教程是以STM32F103CB芯片为例 keil配置 1.从官网下载标准外设库 声明:因为在官网下载需要注册,本博主已经有了那个库,没有在官网下载。下面附了两个链接,一个是...
  • 在keil5 新建stm32项目的时候很多人都在找最新3.5的外设库文件,因为需要手动添加到项目目录中 直接在这下载就好了,省的你去官网找了。我当初也是找了很久。这只是f10x的,如果需要别的留言,我再上传,目前用这个...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 22,014
精华内容 8,805
关键字:

stm32小项目