STM32(RFID)阶段一:添加串口USART2,修改中断接收协议

发布者:haoying最新更新时间:2019-02-15 来源: eefocus关键字:STM32  RFID  串口USART2  中断接收协议 手机看文章 扫描二维码
随时随地手机看文章

因学校比赛原因接触到RFID技术,并结合STM32单片机开发一卡通系统。由于需要和RFID读写器通信,以及上位机软件通信,所以添加USART2串口,并根据RFID数据包改写中断接收协议。资料支持:《不完全手册》《中文手册》端口通用与复用,APB1外设,串口寄存器,中断配置


阶段一:demo程序功能:通过串口USART2接收数据包,并把数据再发回去。RFID型号M3650A-HA 数据包第二个数据为数据包的长度,使用str接收长度,USART_RX_STA bit15置1 表示接收结束。


上代码

void uart_init(u32 bound){  

    GPIO_InitTypeDef GPIO_InitStructure;

    USART_InitTypeDef USART_InitStructure;

 

    NVIC_InitTypeDef NVIC_InitStructure1; //定义数据结构体USART1

    NVIC_InitTypeDef NVIC_InitStructure2; //定义数据结构体USART2

  

    NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);//将中断矢量放到Flash的0地址

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//设置优先级配置的模式,详情请阅读原材料中的文章


USART_InitStructure.USART_BaudRate = bound;//串口波特率

USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式

USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位

USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位

USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制

USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式

 


RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);//使能USART1,GPIOA时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE); // 



//USART1_TX   GPIOA.9

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出

  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9

   

  //USART1_RX   GPIOA.10初始化

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入

  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10  

 

//USART1_TX   GPIOA.9

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA.9

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出

  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9

   

  //USART1_RX   GPIOA.10初始化

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//PA10

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入

  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10  



 

  //Usart1 NVIC 配置

  NVIC_InitStructure1.NVIC_IRQChannel = USART1_IRQn;

NVIC_InitStructure1.NVIC_IRQChannelPreemptionPriority=0x01 ;//抢占优先级3

NVIC_InitStructure1.NVIC_IRQChannelSubPriority = 0x01; //子优先级3

NVIC_InitStructure1.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能

NVIC_Init(&NVIC_InitStructure1); //根据指定的参数初始化VIC寄存器

//Usart1 NVIC 配置

  NVIC_InitStructure2.NVIC_IRQChannel = USART2_IRQn;

NVIC_InitStructure2.NVIC_IRQChannelPreemptionPriority=0x01 ;//抢占优先级3

NVIC_InitStructure2.NVIC_IRQChannelSubPriority = 0x00; //子优先级3

NVIC_InitStructure2.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能

NVIC_Init(&NVIC_InitStructure2); //根据指定的参数初始化VIC寄存器



   //USART 初始化设置

  USART_Init(USART1, &USART_InitStructure); //初始化串口1

  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断

  USART_Cmd(USART1, ENABLE);                    //使能串口1 

//USART 初始化设置

  USART_Init(USART2, &USART_InitStructure); //初始化串口1

  USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启串口接受中断

  USART_Cmd(USART2, ENABLE);                    //使能串口1 


}

 

#if EN_USART1_RX   //如果使能了接收


u8 USART_RX_BUF[USART_REC_LEN];     //接收缓冲,最大USART_REC_LEN个字节.

 

u16 USART_RX_STA=0;       //接收状态标记  

 

u8 str=3;   //   

            //   

 

 

void USART2_IRQHandler(void)                //串口2中断服务程序

{

u8 Res;


#if SYSTEM_SUPPORT_OS //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.

OSIntEnter();    

#endif

if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)  //接收中断

{

Res =USART_ReceiveData(USART2); //读取接收到的数据

USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;

USART_RX_STA++;

if((USART_RX_STA&0x3FFF)==2)

str = Res;

if((USART_RX_STA&0X3FFF)==str)

USART_RX_STA|=0x8000; 

    } 

#if SYSTEM_SUPPORT_OS //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.

OSIntExit();   

#endif


 

#endif

 

 

-----------------------------------------------

main.c

 

int main(void)

 {

u8 t;

u8 len=0;

u8 times=0;

 

int money=100;    //

 

delay_init();     //延时函数初始化

//NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2

uart_init(9600); //串口初始化为9600

LED_Init();   //初始化与LED连接的硬件接口 

    LCD_Init();

 

 

LCD_Clear(WHITE);

POINT_COLOR=RED;

LCD_ShowString(30,40,200,24,24,"Mini STM32 ^_^");

LCD_ShowString(30,70,120,24,24,"LEN:");

LCD_ShowxNum(78,70,len,2,24,0);

LCD_ShowString(30,100,200,24,24,"money:");

LCD_ShowxNum(102,100,money,4,24,0);


while(1)

{

 

if(USART_RX_STA&0x8000)

{    

len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度

LCD_ShowxNum(78,70,len,2,24,0);

money+=100;

LCD_ShowxNum(102,100,money,4,24,0);

for(t=0;t

{

USART2->DR=USART_RX_BUF[t];

USART_ClearFlag(USART2,USART_FLAG_TC); //

while((USART2->SR&0X40)==0);//等待发送结束

}


USART_RX_STA=0;

}


times++;  

if(times%300==0)

{LED0=!LED0;//闪烁LED,提示系统正在运行.

 

}

delay_ms(10);   


}  

}

 


关键字:STM32  RFID  串口USART2  中断接收协议 引用地址:STM32(RFID)阶段一:添加串口USART2,修改中断接收协议

上一篇:STM32(RFID)阶段二(读序列,修改金额)
下一篇:LPC1768@100MHz和LPC1788@120MHz的PLL0设置

推荐阅读最新更新时间:2024-03-16 16:24

STM32】DMA—直接存储器存取(原理篇)
一、DMA是什么? 直接存储器存取(DMA)用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU干预,数据可以通过DMA快速地移动,这就节省了CPU的资源来做其他操作。两个DMA控制器有12个通道(DMA1有7个通道,DMA2有5个通道),每个通道专门用来管理来自于一个或多个外设对存储器访问的请求。还有一个仲裁器来协调各个DMA请求的优先权。FLASH、SRAM、外设的SRAM、APB1、APB2和AHB外设均可作为访问的源和目标! 二、DMA的工作原理是什么? 1.DMA的工作流程分析 在发生一个事件后,外设向DMA控制器发送一个请求信号。DMA控制器根据通道的优先权处理请求。当DMA控制器开始
[单片机]
STM32通用定时器的输入捕获(实例:输入捕获)
通用定时器输入捕获概述 输入捕获的工作原理 在通用定时器框图中,主要涉及到最顶上的一部分(计数时钟的选择)、中间部分(时基单元)、左下部分(输入捕获)这三个部分。这里主要讲解一下左下部分(输入捕获),其他两个部分可以参考文章:【STM32】通用定时器的基本原理(实例:定时器中断)。 输入捕获模式可以用来测量脉冲宽度或者测量频率。STM32的定时器,除了TIM6、TIM7,其他的定时器都有输入捕获的功能。下面以一个简单的脉冲输入为例,简单地讲述一下输入捕获用于测量脉冲宽度的工作原理: 先设置输入捕获为上升沿检测,记录发生上升沿时TIMx_CNT的值。然后配置捕获信号为下降沿捕获,当下降沿到来的时候
[单片机]
<font color='red'>STM32</font>通用定时器的输入捕获(实例:输入捕获)
学习STM32单片机之结构体思想
学习内容: 1.我们在操作寄存器的时候,操作的是寄存器的绝对地址,如果每个寄存器都这样操作,那将非常麻烦。 2.我们考虑到外设寄存器的地址都是基于外设基地址的偏移地址,都是在外设基地址上逐个连续递增的,每个寄存器占32 个或者16 个字节,这种方式跟结构体里面的成员类似。 3.定义一种外设结构体,结构体的地址等于外设的基地址,结构体的成员等于寄存器,成员的排列顺序跟寄存器的顺序一样。这样我们操作寄存器的时候就不用每次都找到绝对地址,只要知道外设的基地址就可以操作外设的全部寄存器,即操作结构体的成员即可。 下面先定义一个GPIO 寄存器结构体,结构体里面的成员是GPIO 的寄存器,成员的顺序按照寄存器的偏移地址从低到高排
[单片机]
STM32 keil mdk启动代码发分析
学习STM32,看了一堆乱七八糟的文档,准备写程序了,先分析了下STM32的启动代码,看着这堆鬼鬼的汇编代码,挺吓人的,看看帮助,查查网路,还是不那么难懂。 ;// h Stack Configuration ;// o Stack Size (in Bytes) 0x0-0xFFFFFFFF:8 ;// /h Stack_Size EQU 0x00000200 ;//定义堆栈大小 AREA STACK, NOINIT, READWRITE, ALIGN=3 ;//定义一个数据段 按8字节对齐 Stack_Mem SPACE Stac
[单片机]
STM32的IO口的8种配置
1 STM32的输入输出管脚有下面8种可能的配置:(4输入+2输出+2复用输出) ① 浮空输入_IN_FLOATING ② 带上拉输入_IPU ③ 带下拉输入_IPD ④ 模拟输入_AIN ⑤ 开漏输出_OUT_OD ⑥ 推挽输出_OUT_PP ⑦ 复用功能的推挽输出_AF_PP ⑧ 复用功能的开漏输出_AF_OD 1.1 I/O口的输出模式下,有3种输出速度可选(2MHz、10MHz和50MHz),这个速度是指I/O口驱动电路的响应速度而不是输出信号的速度,输出信号的速度与程序有关(芯片内部在I/O口 的输出部分安排了多个响应速度不同的输出驱动电路,用户可以根据自己的需要选择合适的驱动电路)。通过选择速度来选择
[单片机]
循环冗余校验技术,以及在STM32中的一些具体使用体会
在嵌入式产品应用中,常常需要应对系统数据在存储或者传输过程中的完整性问题。 所谓完整性是指数据在其生命周期中的准确性和一致性。这些数据可能存储在EEPROM/FLASH里,或者基于通信协议进行传输,它们有可能因为外界干扰或者程序错误,甚至系统入侵而导致被破坏。如果这些数据在使用前不做校验,产品功能可能失效。在一些特定领域,严重时可能会危及用户财产甚至生命安全。 本文就来聊聊使用较为广泛的循环冗余校验技术,以及在STM32中的一些具体使用体会。 所谓循环冗余校验(CRC:Cyclic Redundancy Check)是一种错误检测算法,通常在通信协议中或存储设备中用于检测原始数据的意外变动。可以简单理解成对有用数据按照一定的算法进
[单片机]
循环冗余校验技术,以及在<font color='red'>STM32</font>中的一些具体使用体会
STM32系列可以通过FMSC接口来实现外扩并口SRAM
STM32MCU一般情况下配置有1~2MB双块Flash存储器和256KB SRAM,在某些应用设计中会出现内置RAM不足的情况,需要对STM32单片机进行外扩RAM的处理,可以选择更换更高RAM容量的单片机,除了价格贵还需要涉及其他被动器件的更改,STM32系列可以通过FMSC接口外扩并口SRAM,比如采用ISSI的IS62WV51216。 IS62WV51216 SRAM芯片是一个8M容量,组织结构为512K*16的高速率低功耗静态随机存储器。IS62WV51216高性能CMOS工艺制造。高度可靠的工艺水准再加创新的电路设计技术,造就了这款高性能,低功耗的器件。使用IS62WV51216的片选引脚和输出使能引脚,可以简单实
[单片机]
Atmel公司先推出小型低频RFID集成电路
  Atmel公司是全球开发和设计先进半导体解决方案的领军公司,最近宣布其具有独特识别能力的ATA5567小型330位解读/记录发送机应答器可以投入使用,这种经过优化的发送机应答器适用于访问控制系统(用于饭店房间、工程部门和办公室、时间记录系统和停车区域)中的下一代访问控制用国际标准化组织卡和智能钥匙以及用作成员卡。   自从该装置采用低频以来,它可以在世界范围加以使用。它对恶劣的环境并不敏感,还可在通常使用RFID装置会变得复杂的不甚理想条件(潮湿、肮脏、有金属屏蔽、视线外或外体磨损等)下使用。   ATA5567装置特别小。包括一个可以选用的75微微法拉芯片电容器在内,其尺寸小于1平方厘米,比市场上绝大数所用的解读/记录产
[安防电子]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved