久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標(biāo)題:
stm32驅(qū)動(dòng)mfrc522源碼
[打印本頁(yè)]
作者:
cjyg
時(shí)間:
2018-4-21 18:15
標(biāo)題:
stm32驅(qū)動(dòng)mfrc522源碼
stm32驅(qū)動(dòng)mfrc522單片機(jī)源程序如下:
//MDK V3.5編程模板2說(shuō)明
//基本源文件結(jié)構(gòu)
/*
在任何地方建一個(gè)與工程名相關(guān)的文件夾,再在這個(gè)文件夾下建立如下結(jié)構(gòu)的文件夾
User/SysTick文件夾及其它需要用到的用戶文件夾,如LCD等
Libraries/cmsis startup/arm src inc
Project/list out及Keil MDK工程文件
//
從STM32固件庫(kù)v3.5中找出所需文件并復(fù)制到所建立的文件夾中
1:User\system_stm32f10x.c stm32f10x_it.c stm32f10x_it.h stm32f10x_conf.h
2:User\SysTick\stm32f10x_systick.c stm32f10x_systick.h
在STM32固件庫(kù)v3.5沒有提供stm32f10x_systick.c stm32f10x_systick.h
可從STM32固件庫(kù)v2.0中找到,復(fù)制過(guò)來(lái)后要對(duì)這兩文件修改一下才能用
方法是:(先把SysTick的只讀屬性去掉)
(1):對(duì)stm32f10x_systick.c中的函數(shù)SysTick_CLKSourceConfig(u32 SysTick_CLKSource)
注釋掉。
(2):對(duì)stm32f10x_systick.h中的#define SysTick_CLKSource_HCLK_Div8 ((u32)0xFFFFFFFB)
#define SysTick_CLKSource_HCLK ((u32)0x00000004)
注釋掉。
(3):#include "stm32f10x_map.h"改為#include "stm32f10x.h"
3:Libraries/cmsis/core_cm3.c core_cm3.h stm32f10x.h system_stm32f10x.h
4:Libraries/startup/arm/所有8個(gè)ARM的啟動(dòng)文件
5:Libraries/src\mise.c和所有外設(shè)C文件
6:Libraries/inc\mise.h和所有外設(shè)H文件
//
添加完文件后用記事本或其它C文件編輯工具編寫一個(gè)名為main.c內(nèi)容如下的文件保存到User中
//
#include "stm32f10x.h"
#include "stm32f10x_systick.h"
//
int main(void)
{
while (1)
{
}
}
//
*/
//基本工程文件結(jié)構(gòu)
/*
完成以上工作后,打開Keil新建一個(gè)工程保存到Project中
選擇CUP確定后在彈出的添加啟動(dòng)文件詢問窗中選擇否,這樣就建好了一個(gè)空的工程文件
把工程的標(biāo)簽改成與工程名一樣,當(dāng)然也可不同或不改,然后在工程中加入以下文件組
User
CMSIS
StartUp
StdPeriphDriver
SysTick
//
接下來(lái)從源文件中給文件組添加文件
1:User/main.c stm32f10x_it.c
2:CMSIS/core_cm3.c system_stm32f10x.c
3:StartUp/startup_stm32f10x.hd.s(這個(gè)文件是根據(jù)所用的CPU來(lái)確定的)
4:StdPeriphDriver/misc.c stm32f10x_rcc.c stm32f10x_fsmc.c stm32f10x_gpio.c以及其它選用的外設(shè)C文件
5:SysTick/stm32f10x_systick.c
*/
//接下來(lái)要設(shè)置工程文件的一些屬性選項(xiàng)
/*
打開工程的屬性框
OutPut選項(xiàng)卡中
將Select Folder For Object指定到Out文件夾
勾選Great Hex File(生成Hex文件)
//
Listing選項(xiàng)卡中
將Select Folder For Listings指定到List文件夾
//
C/C++選項(xiàng)卡中
根據(jù)所用CPU選擇下列條目復(fù)制到define欄
USE_STDPERIPH_DRIVER,STM32F10X_LD
USE_STDPERIPH_DRIVER,STM32F10X_MD
USE_STDPERIPH_DRIVER,STM32F10X_HD
頭文件包含路徑設(shè)定(所有有頭文件的文件夾)
在include paths添加所有有頭文件的文件夾路徑
../../Libraries/inc;
../../Libraries/cmsis;
../../User
../../User/systick
也可只添加有頭文件的根目錄,此時(shí)必須在包含頭文件前加上一級(jí)的文件名
如:#include "SysTick/stm32f10x_systick.h" stm32f10x_systick.h的上一級(jí)是SysTick
另外勾選C/C++選項(xiàng)卡中的One ELF Section Per Function后生成的代碼得到優(yōu)化
*/
//最后編譯這個(gè)沒有任何功能的工程,看是否有錯(cuò)誤和警告。
//如有則修改直至通過(guò),之后就可以根據(jù)需要添加各種功能函數(shù)了。
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
#include "TouchPanel/TouchPanel.h"
#include "SysTick/stm32f10x_systick.h"
#include "LCD/LCD.h"
#include "LCD/AsciiLib.h"
#include "LCD/Chinese16Lib.h"
#include "MFRC522/MFRC522.h"
//BEE控制定義(PA.13)當(dāng)x=1時(shí)蜂鳴器響,當(dāng)x=0時(shí)蜂鳴器不響
#define BEE_Cont(x) x ? GPIO_SetBits(GPIOA,GPIO_Pin_13):GPIO_ResetBits(GPIOA,GPIO_Pin_13)
//延時(shí)函數(shù)
void Delay1(u32 nCount)
{
for(; nCount != 0; nCount--);
}
//蜂鳴器函數(shù)
void SoundBEE(void)
{
BEE_Cont(1);
Delay1(20000);
BEE_Cont(0);
}
//端口初始化函數(shù)
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
//打開APB2總線上的GPIOA-D時(shí)鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|
RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE,
ENABLE);
//打開APB2總線上的AFIO時(shí)鐘(IO復(fù)用功能)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
//開啟USART2時(shí)鐘
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
//釋放調(diào)試口為通用IO
GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);
//(BEE)PA13
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_13;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//(JOG)PC10=C_key, PC11=R_key, PC12=ENTER_key
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IPU;
GPIO_Init(GPIOC, &GPIO_InitStructure);
//設(shè)置USART2的Tx腳(PA2)為推挽輸出模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA , &GPIO_InitStructure);
//設(shè)置USART2的Rx腳(PA3)為浮空輸入腳
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA , &GPIO_InitStructure);
}
//串口2初始化函數(shù)
void USART2_Configuration(void)
{
//定義USART初始化結(jié)構(gòu)體 USART_InitStructure
USART_InitTypeDef USART_InitStructure;
/*
* 波特率為9600bps
* 8位數(shù)據(jù)長(zhǎng)度
* 1個(gè)停止位,無(wú)校驗(yàn)
* 禁用硬件流控制
* 禁止USART時(shí)鐘
* 時(shí)鐘極性低
* 在第2個(gè)邊沿捕獲數(shù)據(jù)
* 最后一位數(shù)據(jù)的時(shí)鐘脈沖不從 SCLK 輸出
*/
//如果波特率是9600就用默認(rèn)的值來(lái)初始化串口就行了
USART_StructInit(&USART_InitStructure); //獲取默認(rèn)的初始化值
//如果用其它值則用以下語(yǔ)句
//USART_InitStructure.USART_BaudRate = 9600;
//USART_InitStructure.USART_WordLength = USART_WordLength_8b;
//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;
USART_Init(USART2 , &USART_InitStructure); //初始化串口2
//使能接收中斷,用中斷方式接收數(shù)據(jù)
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); //當(dāng)用查詢方式接收數(shù)據(jù)時(shí)不用此句
USART_Cmd(USART2 , ENABLE); //使能USART2
}
//配置USART2中斷
void NVIC_USART2_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
//
NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x00);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //選擇中斷分組0
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; //選擇串口2中斷
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //搶占式中斷優(yōu)先級(jí)設(shè)置為0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //響應(yīng)式中斷優(yōu)先級(jí)設(shè)置為0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中斷
NVIC_Init(&NVIC_InitStructure);
}
//設(shè)SysTick定時(shí)器重裝時(shí)間
void SysTick_Configuration(void)
{
SysTick_CounterCmd(SysTick_Counter_Disable); //關(guān)閉定時(shí)器
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK); //選擇HCLK為時(shí)鐘源
SysTick_CounterCmd(SysTick_Counter_Clear); //定時(shí)器清0
//主頻為72MHz,配置計(jì)時(shí)值為72000*20可得到20ms的定時(shí)
SysTick_SetReload(72000*20);
SysTick_CounterCmd(SysTick_Counter_Enable); //啟動(dòng)定時(shí)器
}
//
//數(shù)字的ASCII碼
uc8 numberascii[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
//顯示緩沖區(qū)
u8 dispnumber5buf[6];
u8 dispnumber3buf[4];
u8 dispnumber2buf[3];
//MFRC522數(shù)據(jù)區(qū)
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數(shù)據(jù)區(qū)
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文件里定義
//
extern u16 myGBlength; //在漢字庫(kù)C文件里定義
//觸摸屏數(shù)據(jù)區(qū)
extern Coordinate TouchSample[3]; //3組觸摸坐標(biāo)取樣
extern Coordinate DisplaySample[3]; //3組顯示坐標(biāo)取樣
extern Coordinate dispcoordinate; //1組顯示坐標(biāo)
extern Matrix matrix; //坐標(biāo)轉(zhuǎn)換參數(shù)
//16進(jìn)顯示
void GetHexAscii(u8 *buf,u8 dat)
{
u8 i,buffer[3];
//
buffer[0]=numberascii[dat/16];
buffer[1]=numberascii[dat%16];
buffer[2]=0; //結(jié)束標(biāo)志為0
//
for(i=0;i<3;i++)
buf[i]=buffer[i];
}
//百以內(nèi)10進(jìn)顯示
void GetNumberAscii_3(u8 *buf,u8 dat)
{
u8 i,buffer[4];
//
buffer[0]=numberascii[dat/100%10];
buffer[1]=numberascii[dat/10%10];
buffer[2]=numberascii[dat%10];
buffer[3]=0; //結(jié)束標(biāo)志為0
//
for(i=0;i<4;i++)
buf[i]=buffer[i];
}
//萬(wàn)以內(nèi)10進(jìn)顯示
void GetNumberAscii_5(u8 *buf,u16 dat)
{
u8 i,buffer[6];
//
buffer[0]=numberascii[dat/10000%10];
buffer[1]=numberascii[dat/1000%10];
buffer[2]=numberascii[dat/100%10];
buffer[3]=numberascii[dat/10%10];
buffer[4]=numberascii[dat%10];
buffer[5]=0; //結(jié)束標(biāo)志為0
//
for(i=0;i<6;i++)
buf[i]=buffer[i];
}
//MFRC522測(cè)試函數(shù)
void MFRC522Test(void)
{
u8 i,j,status,card_size;
//
status=MFRC522_Request(0x52, card_pydebuf); //尋卡
//
if(status==0) //如果讀到卡
{
status=MFRC522_Anticoll(card_numberbuf); //防撞處理
card_size=MFRC522_SelectTag(card_numberbuf); //選卡
status=MFRC522_Auth(0x60, 4, card_key0Abuf, card_numberbuf); //驗(yàn)卡
status=MFRC522_Write(4, card_writebuf); //寫卡(寫卡要小心,特別是各區(qū)的塊3)
status=MFRC522_Read(4, card_readbuf); //讀卡
//MFRC522_Halt(); //使卡進(jìn)入休眠狀態(tài)
//卡類型顯示
GetHexAscii(dispnumber2buf,card_pydebuf[0]);
GUI_Text( 82,160, White,Blue,dispnumber2buf);
GetHexAscii(dispnumber2buf,card_pydebuf[1]);
GUI_Text(102,160, White,Blue,dispnumber2buf);
//卡序列號(hào)顯,最后一字節(jié)為卡的校驗(yàn)碼
for(i=0;i<5;i++)
{
GetHexAscii(dispnumber2buf,card_numberbuf[i]);
GUI_Text( 82+20*i,144, White,Blue,dispnumber2buf);
if(i==4) //用紅色顯示校驗(yàn)碼
GUI_Text( 82+20*i,144, Red,Blue,dispnumber2buf);
}
//卡容量顯示,單位為Kbits
GetNumberAscii_3(dispnumber3buf,card_size);
GUI_Text( 82,128, White,Blue,dispnumber3buf);
//讀卡狀態(tài)顯示,正常為0
GetHexAscii(dispnumber2buf,status);
GUI_Text(82,112, White,Blue,dispnumber2buf);
//讀一個(gè)塊的數(shù)據(jù)顯示
for(i=0;i<2;i++) //分兩行顯示
{
for(j=0;j<9;j++) //每行顯示8個(gè)
{
GetHexAscii(dispnumber2buf,card_readbuf[j+i*9]); //16進(jìn)顯示
GUI_Text(82+j*20,96-i*16, White,Blue,dispnumber2buf);
}
}
//畫下橫線的數(shù)據(jù)為
LCD_DrawLine(220,80,260,80,Green);
//
SoundBEE();
}
}
//寫SM05的指令函數(shù)
void SM05SendCmd(void)
{
u8 i=0;
//
//清除標(biāo)志位,否則第1位數(shù)據(jù)會(huì)丟失
USART_ClearFlag(USART2,USART_FLAG_TC);
//
for(i=0;i<15;i++)
{
USART_SendData(USART2, sm05cmdbuf[i]);
//等待發(fā)完一個(gè)字節(jié)
while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);
}
}
//顯示接收SM05的數(shù)據(jù)函數(shù)
void DiscSM05ReceiveData(void)
{
u8 i,j;
u16 card_number;
//
for(i=0;i<2;i++) //分兩行顯示
{
for(j=0;j<8;j++) //每行顯示8個(gè)
{
GetNumberAscii_3(dispnumber3buf,sm05receivebuf[j+i*8]);
GUI_Text(82+j*30,32-i*16, White,Blue,dispnumber3buf);
}
}
//畫下線的數(shù)據(jù)為卡代碼
LCD_DrawLine(233,15,286,15,Red);
//讀卡成功
if(sm05_OK==1)
{
sm05_OK=0;
SoundBEE();
//計(jì)算卡代碼并顯示
card_number=sm05receivebuf[13]*256+sm05receivebuf[14];
GetNumberAscii_5(dispnumber5buf,card_number);
GUI_Text(82,0, Green,Blue,dispnumber5buf);
}
}
//飛梭連接定義
#define JOG_A 0x40 //JOG動(dòng)態(tài)值1
#define JOG_B 0x80 //JOG動(dòng)態(tài)值2
#define JOGVAL1 0xc0 //靜態(tài)標(biāo)志1
#define JOGVAL2 0x00 //靜態(tài)標(biāo)志1
#define STATE1 0x55 //動(dòng)態(tài)標(biāo)志1
#define STATE2 0xaa //動(dòng)態(tài)標(biāo)志2
#define COROTATION 0x55 //JOG正轉(zhuǎn)標(biāo)志
#define REVERSE 0xaa //JOG反轉(zhuǎn)標(biāo)志
#define JOGPORT GPIOC //JOG接口
//HEX 正轉(zhuǎn)40 00 80 C0 反轉(zhuǎn)80 00 40 C0
//(PC11)A:0->0->1->1 1->0->0->1
//(PC10)B:1->0->0->1 0->0->1->1
// 0 0 0 0 0 0 0 0
// 0 0 0 0 0 0 0 0
//旋轉(zhuǎn)輪
u8 JOG_Check(void)
{
u8 key,jogmode;
static u8 state_A,state_B,jog_count;
//根據(jù)JOG的硬件連接情況,把讀入的16位數(shù)據(jù)轉(zhuǎn)成8位數(shù)據(jù)以方便處理(8位CPU不用轉(zhuǎn)換)
key=(u8)(GPIO_ReadInputData(JOGPORT)>>4)&JOGVAL1; //讀JOG
//讀到JOG的靜態(tài)值是0xc0或0x00,讀到JOG旋轉(zhuǎn)動(dòng)態(tài)值是0x80或0x40
if(key!=JOGVAL1) //如果JOG旋轉(zhuǎn)
{
//第一狀態(tài)檢測(cè)
if(key==JOG_A) //當(dāng)為0x40時(shí)
state_A=STATE1; //保存動(dòng)態(tài)標(biāo)志值
//第二狀態(tài)檢測(cè)
if(key==JOG_B) //當(dāng)為0x80時(shí)
state_B=STATE2; //保存動(dòng)態(tài)標(biāo)志值
}
//如果是正轉(zhuǎn) 0x80->0xc0 0x40->0x00
if(((state_B==STATE2)&&(key==JOGVAL1))||((state_A==STATE1)&&(key==JOGVAL2)))
{
state_A=0;
state_B=0;
jogmode=COROTATION; //回返正轉(zhuǎn)值
//
jog_count++;
//
GetHexAscii(dispnumber2buf,jog_count);
GUI_Text(32,218, Green,Blue,dispnumber2buf);
//
SoundBEE();
}
//如果是反轉(zhuǎn) 0x40->0xc0 0x80->0x00
if(((state_A==STATE1)&&(key==JOGVAL1))||((state_B==STATE2)&&(key==JOGVAL2)))
{
state_A=0;
state_B=0;
jogmode=REVERSE; //回返反轉(zhuǎn)值
//
jog_count--;
//
GetHexAscii(dispnumber2buf,jog_count);
GUI_Text(32,218, Red,Blue,dispnumber2buf);
//
SoundBEE();
}
//
return jogmode;
}
//中間鍵
void KeyEnterFunctional(void)
{
u8 key;
static u8 keyscan,entercont=0xaa;
//
key=(u8)(GPIO_ReadInputData(JOGPORT)>>8&0x10);
//
if(key!=0x10)
{
if(((key&0x10)==0)&&((keyscan&0x10)!=0))
{
entercont=~entercont;
//
if(entercont==0x55)
{
GUI_Text(2,218, Green,Blue,"開");
}
else
{
GUI_Text(2,218, Red,Blue,"關(guān)");
}
//
SoundBEE();
}
}
//
keyscan=key;
}
//主函數(shù)
int main(void)
{
u8 i,j;
u16 count;
//
GPIO_Configuration(); //初始化端口
//
Delay1(2000);
BEE_Cont(0); //關(guān)BEE
SysTick_Configuration(); //SysTick定時(shí)器屏初化
Touch_Initializtion(); //觸摸屏初化
LCD_Initializtion(); //LCD初始化
MFRC522_Initializtion(); //初始化MFRC522
USART2_Configuration(); //初始化USART2
NVIC_USART2_Configuration(); //USART2中斷配置
//
//TouchPanel_Calibrate(); //觸摸屏校準(zhǔn)
//
LCD_Clear(Blue); //清屏成藍(lán)色
Delay1(20000);
//畫水平線
LCD_DrawLine(0,180,320,180,Green);
//畫垂直線
//LCD_DrawLine(80,0,80,180,Green);
//
GUI_Text(88,218, Red,Blue,"STM32+觸摸屏學(xué)習(xí)板");
……………………
…………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
MFRC522_Pro.rar
(338.01 KB, 下載次數(shù): 87)
2018-4-21 23:57 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
作者:
zhang@#
時(shí)間:
2019-10-27 14:39
請(qǐng)問用的是那個(gè)處理器?
作者:
Jy0607
時(shí)間:
2023-4-3 19:08
用得到學(xué)習(xí)下!謝謝樓主共享資料.
作者:
xiang8000
時(shí)間:
2023-11-2 14:52
這是STM32F幾的CPU?
歡迎光臨 (http://m.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
成年人免费看视频
|
欧美性猛交99久久久久99按摩
|
最新91视频
|
色香蕉网
|
欧美激情在线观看
|
国产999视频
|
亚洲国产成人精品女人
|
国产色自拍
|
亚洲午夜视频在线观看
|
国产成人黄色
|
精品理论片
|
国产精品久久久久久妇女6080
|
黄色一级视频在线观看
|
成人国产网站
|
在线观看国产一区二区
|
91久久国产综合久久91精品网站
|
特级丰满少妇一级aaaa爱毛片
|
可以看的毛片
|
亚洲天堂久久
|
中文字幕第8页
|
毛片av在线
|
51成人做爰www免费看网站
|
超碰国产在线
|
日韩一级免费
|
日韩一区二区在线观看视频
|
在线播放日韩
|
日韩免费看片
|
久久午夜影院
|
成人午夜毛片
|
国产三级在线免费观看
|
久在线观看
|
免费在线看a
|
亚洲网在线
|
日日干夜夜骑
|
青青草国产成人av片免费
|
黄色a一级
|
国产精品免费一区二区三区
|
黄色国产
|
在线视频a
|
久久中文字幕视频
|
成人性生活视频
|