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

2019-05-27来源: 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  中断接收协议 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic462974.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32(RFID)阶段二(读序列,修改金额)
下一篇:基于STM32的串口环形队列IAP调试心得

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

stm8s 低功耗模式
因为用干电池供电,又需要超长待机了,成本又限制不能使用stm8l,所以开启低功耗之旅1.元器件选型挑选低功耗的元器件,一定要关注工作电流led 一定要高电平导通,不然的话,默认状态拉高很费电元器件尽量选择共阴解法,更省电2.主时钟频率频率和功耗是成正比的,选择试用的最低晶振能不开的功能尽量不开下面是对应的功耗表ADC最费电3.合理使用低功耗模式主要有一下几种等待模式活跃停机模式停机模式下面是对比等待模式使用asm(“WFI”)进入会被各种中断激活活跃停机模式AWU是用来当MCU进入低功耗的活跃停机(Active Halt)模式时提供一个内部的唤醒时间基准。该时间基准的时钟是由内部的低速RC振荡器时钟(LSI)或者通过预分频的HSE
发表于 2019-11-20
stm8s 低功耗模式
简单介绍下关于STM8S的几种低功耗模式
STM8S105的低功耗模式总的来说有四种:分别是等待模式,停机模式,快速活跃停机模式和慢速活跃停机模式1、等待模式:可执行指令wif()进入等待模式,该模式下主CPU停止工作,但其外设不停,严格来说只能算是降低功耗而不能算低功耗,该模式可由AMU或外部中断唤醒2、停机模式:可执行指令half()进入停机模式,该模式下主cpu和外设全部停止,达到最低功耗,只能由外部中断进行唤醒。3、快速活跃停机模式:在执行指令half()之前,如果你使能了AMU功能,则进入快速活跃停机模式,该模式下由于主电压调节器打开,在受到AMU或外部中断触发时,可快速唤醒。4、慢速活跃停机模式:在快速活跃停机模式下,如果设置内部时钟寄存器CLK_ICKR
发表于 2019-11-20
简单介绍下关于STM8S的几种低功耗模式
Atomthreads关于STM8S低功耗的思考
Atomthreads像众多操作系统一样,在没有任务调度是会调用idle。static void atomIdleThread (uint32_t param){    /* Compiler warning  */    param = param;     /* Loop forever */    while (1)    {        /** todo Provide user idle hooks*/    }}atomthreads中
发表于 2019-11-20
Atomthreads关于STM8S低功耗的思考
STM8L051之低功耗停机配置问题
在做stm8L的小一个项目,由电池供电,当按键长按关机,系统进入停机模式,虽然系统运行的时候有十几毫安的电流消耗(还没使用RTC定时唤醒),但是在停机模式下电流消耗竟然还有1.33ma的电流,花了半天的时间找资料,看文档,在网上看到不少大牛能做到0.4ua,自己无论如何设置IO,外设都无补于事,停机模式下电流最低还有1ma。 最后只能将开机初始化的外设函数一个一个注释掉,包括ADC,DMA,beep,以及TIM4,最后发现只注释掉ADC的初始化函数,再进入停机模式,果然电流接近0,5ua,也就是说可能ADC模块在进入停机模式前的关闭设置不正确,之前的是这样的:void PerCLK_OFF(){  
发表于 2019-11-20
STM8S 自动唤醒AWU配置
也可以被用来校准蜂鸣器的频率。参考例程如下:uint32_t LSIMeasurment(void){ nt32_t lsi_freq_hz = 0x0;//测到的lsi的频率 uint32_t fmaster = 0x0;//主时钟频率 uint16_t ICValue1 = 0x0;//捕捉到的第一个值 uint16_t ICValue2 = 0x0;//捕捉到的第二个值 fmaster = CLK_GetClockFreq();//获取主时钟 AWU->CSR |= AWU_CSR_MSR;将AWU->CSR的MSR置一来把LSI的内部时钟连接到TIM1定时器的ICAP1 TIM1_ICInit
发表于 2019-11-20
STM32初学笔记---延时函数及u16、u32、u8
在编写流水灯程序时发现,和对之前用的51单片机所用的普通软件延时函数有所不同,51的普通软件延时函数我们一般是这样编写的:#include<reg52.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned charvoid delayms(uint xms){uint i,j;for(i=xms;i>0;i--) for(j=110;j>0;j--);}然而我们在对STM32利用库函数进行编程时采用此延时函数则完全行不通,而是采用下面的延时函数#include "
发表于 2019-11-19
小广播
何立民专栏 单片机及嵌入式宝典

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

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved