历史上的今天
返回首页

历史上的今天

今天是:2025年02月15日(星期六)

2019年02月15日 | STM32(RFID)阶段一:添加串口USART2,修改中断接收协议

2019-02-15 来源:eefocus

因学校比赛原因接触到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);   


}  

}

 


推荐阅读

史海拾趣

Alpha-Micro Electronics公司的发展小趣事

Alpha-Micro Electronics是一家提供嵌入式系统解决方案的公司,专注于设计和制造微控制器、传感器和其他嵌入式设备。以下是关于Alpha-Micro Electronics公司发展的五个相关故事:

  1. 公司成立:Alpha-Micro Electronics公司成立于1982年,总部位于德国斯图加特。公司的创始人是一群电子工程师,他们致力于为各种应用领域提供高性能的嵌入式系统解决方案。

  2. 技术创新:在公司创立之初,Alpha-Micro Electronics就开始致力于技术创新。他们不断投资于研发,推出了一系列先进的微控制器和传感器产品,以满足客户对功能强大和性能稳定的需求。

  3. 解决方案定制:Alpha-Micro Electronics公司注重与客户的紧密合作,提供定制化的解决方案。他们的工程团队具有丰富的经验和专业知识,能够根据客户的具体要求设计和制造符合其需求的嵌入式系统。

  4. 国际扩展:随着业务的不断发展,Alpha-Micro Electronics逐渐拓展了国际市场。除了在德国的总部和研发中心外,公司还在全球范围内建立了销售和服务网络,包括在美国、亚洲和欧洲的分支机构和合作伙伴。

  5. 行业合作与创新:Alpha-Micro Electronics公司积极参与行业合作和创新项目,与其他企业、研究机构和学术界合作,共同推动嵌入式技术的发展。通过与行业领先者合作,公司不断探索新的技术和应用领域,为客户提供更具竞争力的解决方案。

这些故事展示了Alpha-Micro Electronics公司在技术创新、解决方案定制、国际扩展和行业合作方面的发展历程,以及其在电子行业中的重要地位和影响力。

Concord Semiconductor Corp公司的发展小趣事

随着业务规模的不断扩大,Concord Semiconductor Corp开始将市场拓展作为重要的发展战略。公司通过参加国际电子展会、举办技术研讨会等方式,积极宣传自己的产品和技术,提升品牌知名度。同时,公司还针对不同地区的市场需求,推出定制化产品和服务,进一步巩固了市场地位。

意普(ESPE)公司的发展小趣事

作为一家有社会责任感的企业,意普(ESPE)公司始终关注环保和可持续发展。公司采用环保材料和生产工艺,减少了对环境的污染。同时,公司还积极参与社会公益活动,为社会做出了积极贡献。这些举措不仅提升了公司的社会形象,也为企业的长期发展奠定了良好的社会基础。

绿索超容(GreenSource)公司的发展小趣事

意普(ESPE)公司成立于XXXX年,初期专注于光电保护技术的研发。在创始人XXX的领导下,公司凭借对光电技术的深入理解和创新,成功研发出首款红外线安全保护装置,并在行业内获得了广泛的认可。这一技术的突破不仅为公司赢得了市场份额,也为后续的发展奠定了坚实的基础。

EHC(ELECTRONICHARDWARE)公司的发展小趣事

面对日益全球化的市场环境,EHC公司积极实施国际化战略。公司通过与国外知名企业的合作,引进先进的技术和管理经验,不断提升自身的竞争力。同时,EHC公司还积极参加国际展会和论坛,拓展海外市场。经过多年的努力,EHC公司的产品已经成功打入国际市场,并在多个国家和地区建立了稳定的销售渠道。

Frequency Electronics Inc公司的发展小趣事

高频电子在精确时间和频率生成技术方面一直处于世界领先地位。公司不断投入研发,推出了一系列高精度、高性能的定时和频率控制产品,如铷蒸气原子振荡器、温度稳定的石英晶体振荡器等。这些产品被广泛应用于商业、政府、军事等多个领域,包括卫星通信、指挥控制系统、电子战系统等。高频电子的技术创新不仅提升了自身竞争力,还推动了整个行业的发展。

问答坊 | AI 解惑

征集单片机创意

想参加一个比赛,但想了半天都想不出来做什么。所以来看一下大家都有什么好的想法,学习,做做!…

查看全部问答>

Platform Builder 5,问个极端弱智的问题

几个月前用过pb 5.0,现在又捡起来了,结果发现Workspace->FileView下的内容好像变了。根目录下主要有三项,PLATFORM、PRIVATE和public。其中Private和public下主要是通用Wince 5.0的内容,而PLATFORM里应该是与板子有关的BSP的内容吧。现在的情况 ...…

查看全部问答>

基础display controller问题

The Overlay/Display controller consists of logic for transferring image data from a local bus of the POST Processor or a video buffer located in system memory to an external LCD driver interface. what\'s the meaning of Overlay? ...…

查看全部问答>

电力行业企业高薪招聘嵌入式开发人员!!

    欢迎满足以下条件之一的有识之士与我们联系,公司网址:     www.nerc.com.cn,发送简历邮箱地址:whl668@epri.ac.cn。     1.具有2年以上电力行业嵌入式产品开发经验。         2. ...…

查看全部问答>

PPPoE拨号上网问题!

我在wince实现PPPoE拨号上网,现在可以拨号成功了,不过就是上不了网,ping也不通,哪位朋友遇到过这种情况,帮帮忙。 谢谢!…

查看全部问答>

ARM嵌入式入门

我以前作过51和AVR单片机的开发工作,对VC++也有了解,想学习ARM体系开发,LINUX一点不懂,感觉难学,WINCE方向是否容易掌握,怎样入门? …

查看全部问答>

在WinCE下可以用DirectShow播放MPEG4视频文件 的问题??求教!!!

各位高手:求教! 我在EVC中利用DirectShow开发出的播放器,播放WMV格式的文件时,只有声音,没有视频!在WINCE的OS 设计中,改加的feature 也都有加了!不知为什么?还请各位高手赐教?…

查看全部问答>

还是搞不懂怎么烧写NORFLASH

                                 我用的是STM3210E-EVAL评估板,想把程序中有一些表,数组放到NOR FLSAH中去,实在不知怎么烧进去,请懂的朋友 ...…

查看全部问答>

网上惊现-----STM32F207芯片!!!

下载 (211.05 KB) 2010-12-15 12:04 …

查看全部问答>

ADC 状态寄存器

ADC 状态寄存器能软件清除吗,手册上写的是软件清除,我在操作的时候却发现没有清除,软件、硬件仿真都显示没有清除…

查看全部问答>