網(wǎng)上有很多關于pos機芯片卡復位錯,機智云程序移植到合泰單片機HT32F52352上的知識,也有很多人為大家解答關于pos機芯片卡復位錯的問題,今天pos機之家(m.afbey.com)為大家整理了關于這方面的知識,讓我們一起來看下吧!
本文目錄一覽:
pos機芯片卡復位錯
一、 WiFi模塊燒錄機智云的固件
WiFi模塊用的是正點原子的ATK-ESP-01,F(xiàn)lash的大小是8Mbit,機智云對應的固件可在此下載。
如點擊資源下載沒有反應,則在資源下載處右鍵,選擇這三個中的任意一個都可下載。
WiFi模塊的連接如下,
解壓剛剛下載的固件包,用ESPFlashDownloadTool直接下載GAgent_00ESP826_04020034_8MbitUser1_combine_201806091441.bin文件即可,下載地址0x0000,F(xiàn)lash大小選擇8Mbit,選擇對應的COM口。
之后點擊START即可開始下載,若一直處于等待上電同步,則將RST引腳接地再斷開即可解決。
二、下載系統(tǒng)的代碼包
1、創(chuàng)建新產(chǎn)品
產(chǎn)品分類隨意,技術方案選擇WiFi/移動網(wǎng)絡方案
2、創(chuàng)建數(shù)據(jù)點
產(chǎn)品信息——>數(shù)據(jù)點
3、下載與之匹配的代碼包
服務——>MCU開發(fā)——>硬件方案:獨立MCU方案——>硬件平臺:其他平臺——>填入Product Secret——>生成代碼包
之后下載即可!
三、新建一個USART文件和一個TIMER文件
1、我們需要用一個USART口與wifi模塊通信從而將 wifi 串口接收到數(shù)據(jù)寫入到緩沖區(qū)中,同時將數(shù)據(jù)上傳到云端。
合泰的HT32F52352有4個串口,2個USART(通用同步異步收發(fā)器)和2個UART(通用異步收發(fā)器);我選的是USART1,串口的波特率必須是9600.
(以下是移植好后的usart.c文件)
#include "usart.h"#include"delay.h"#include "ht32f52352_sk.h"#include"ht32_board_config.h"#include "gizwits_protocol.h"//C庫#include<stdarg.h>/* Global variables----------------------------------------------------------------------------------------*/uc8 *gURTx_Ptr;vu32 gURTx_Length = 0;u8 *gURRx_Ptr;vu32 gURRx_Length = 0;vu32gURRx_RElength=0;vu32 gIsTxFinished = FALSE;/* Private variables---------------------------------------------------------------------------------------*/uc8gHelloString[] = "Hello, this is USART Tx/Rx FIFO example. Please enter 5characters...\\";u8 gTx_Buffer[128];u8 gRx_Buffer[128];//USART0初始化void USART0_Configuration(void){ gURRx_Ptr = gRx_Buffer; #if 0 CKCU_SetPeripPrescaler(CKCU_PCLK_UxARTn, CKCU_APBCLKPRE_DIV2); #endif { CKCU_PeripClockConfig_TypeDef CKCUClock= {{0}}; CKCUClock.Bit.AFIO = 1; CKCUClock.Bit.PA=1; CKCUClock.Bit.USART0=1; CKCU_PeripClockConfig(CKCUClock,ENABLE); } GPIO_PullResistorConfig(HT_GPIOA,GPIO_PIN_3, GPIO_PR_UP); AFIO_GPxConfig(USART_GPIO_GROUP,USART_TX_PIN, AFIO_FUN_USART_UART); AFIO_GPxConfig(USART_GPIO_GROUP, USART_RX_PIN, AFIO_FUN_USART_UART); USART_InitTypeDefUSART_InitStructure={0}; USART_InitStructure.USART_BaudRate =115200; USART_InitStructure.USART_WordLength = USART_WORDLENGTH_8B; USART_InitStructure.USART_StopBits =USART_STOPBITS_1; USART_InitStructure.USART_Parity = USART_PARITY_NO; USART_InitStructure.USART_Mode =USART_MODE_NORMAL; USART_Init(COM0_PORT,&USART_InitStructure); NVIC_EnableIRQ(COM0_IRQn); //Enable 中斷設置 USART_IntConfig(COM0_PORT,USART_INT_RXDR , ENABLE);// Enable UxART Tx and Rx interrupt USART_TxCmd(COM0_PORT, ENABLE); // 使能 COM1_PORT 發(fā)送和接收 USART_RxCmd(COM0_PORT,ENABLE); }//USART0中斷函數(shù)void USART0_IRQHandler(void){ if(USART_GetFlagStatus(COM0_PORT ,USART_FLAG_RXDR) != RESET) //接收中斷 { if(gURRx_Length >= sizeof(gRx_Buffer)) gURRx_Length = 0; //防止串口被刷爆 gRx_Buffer[gURRx_Length++]= COM0_PORT->DR; USART_ClearFlag(COM0_PORT,USART_FLAG_RSADD); }}//USART1初始化void USART1_Configuration(void){ CKCU_PeripClockConfig_TypeDef CKCUClock={{0}}; CKCUClock.Bit.AFIO = 1; CKCUClock.Bit.PA=1; COM1_CLK(CKCUClock) = 1; //開啟COM0 時鐘 CKCU_PeripClockConfig(CKCUClock, ENABLE); GPIO_PullResistorConfig(HT_GPIOA,GPIO_PIN_5, GPIO_PR_UP); AFIO_GPxConfig(USART1_GPIO_GROUP,USART1_TX_PIN, AFIO_FUN_USART_UART); AFIO_GPxConfig(USART1_GPIO_GROUP, USART1_RX_PIN, AFIO_FUN_USART_UART); USART_InitTypeDefUSART_InitStructure={0}; USART_InitStructure.USART_BaudRate =9600; //波特率必須是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_Mode =USART_MODE_NORMAL; USART_Init(COM1_PORT,&USART_InitStructure); NVIC_EnableIRQ(COM1_IRQn); //Enable 中斷設置 USART_IntConfig(COM1_PORT, USART_INT_RXDR, ENABLE);// Enable UxART Tx and Rx interrupt USART_TxCmd(COM1_PORT, ENABLE); // 使能 COM1_PORT 發(fā)送和接收 USART_RxCmd(COM1_PORT,ENABLE);}//USART1中斷服務函數(shù)void USART1_IRQHandler(void){ uint8_t res; if(USART_GetFlagStatus(COM1_PORT , USART_FLAG_RXDR) != RESET) //接收中斷 { res =USART_ReceiveData(COM1_PORT); gizPutData(&res, 1);//數(shù)據(jù)寫入到緩沖區(qū) USART_ClearFlag(COM1_PORT,USART_FLAG_RSADD); }}//UsartPrintf函數(shù),相當于printfvoidUsartprintf(HT_USART_TypeDef* USARTx, char *fmt,...){ unsigned char UsartPrintfBuf[296]; va_list ap; unsigned char *pStr = UsartPrintfBuf; va_start(ap, fmt); vsnprintf((char *)UsartPrintfBuf,sizeof(UsartPrintfBuf), fmt, ap); //格式化 va_end(ap); while(*pStr != 0) { USART_SendData(USARTx, *pStr++); while(USART_GetFlagStatus(USARTx, USART_FLAG_TXDE) == RESET); }}
2、協(xié)議層的運行需要一個系統(tǒng)時間,事件單位為毫秒,所以我們需要用用定時器來實現(xiàn)1ms的精準定時。
HT32F52352有5個定時器,他們是MCTM(馬達控制定時器)、GPTM(PWM產(chǎn)生和捕捉定時器)、SCTM(單通道產(chǎn)生與捕捉定時器 )、BFTM(基本功能定時器)、 WDT(看門狗定時器),實現(xiàn)1ms的精準定時我們選用BFTM即可。
(以下是移植好后的TIMER.c文件)
#include "TIMER.h"#include"ht32f5xxxx_bftm.h"#include "gizwits_product.h"void Timer_Init(void){ CKCU_PeripClockConfig_TypeDef CKCUClock= {{0}}; CKCUClock.Bit.BFTM1 = 1; //開啟中斷時鐘 CKCU_PeripClockConfig(CKCUClock, ENABLE); NVIC_EnableIRQ(BFTM1_IRQn); BFTM_SetCounter(HT_BFTM1, 0);// BFTM_SetCompare(HT_BFTM1, SystemCoreClock);//定時1s產(chǎn)生中斷 BFTM_SetCompare(HT_BFTM1, SystemCoreClock*1000);//定時1ms產(chǎn)生中斷 BFTM_IntConfig(HT_BFTM1, ENABLE);//使能中斷 BFTM_EnaCmd(HT_BFTM1, ENABLE);//使能BFTM}void BFTM1_IRQHandler(void){if(BFTM_GetFlagStatus(HT_BFTM1)!=RESET) { BFTM_ClearFlag(HT_BFTM1);//清除中斷標志 gizTimerMs(); } }
四、開始移植
product.c文件中:
1、將Timer、usart、Gizwits、Utils四個文件夾加到工程里去
2、由于我們把定時中斷服務函數(shù)和串口接收中斷函數(shù)都放到對應的文件里面了,所以要刪除product.c文件里的:
TIMER_IRQ_FUN函數(shù)
UART_IRQ_FUN函數(shù)
3、UartWrite函數(shù)里添加串口發(fā)送函數(shù)
(需要自行添加上頭文件ht32f5xxxx_usart.h)
int32_tuartWrite(uint8_t *buf, uint32_t len){ uint32_t i = 0; if(NULL == buf) { return -1; } #ifdef PROTOCOL_DEBUG GIZWITS_LOG(COM0_PORT,"MCU2WiFi[M:M]: ",gizGetTimerCount(), len); for(i=0;i<len; i++) { GIZWITS_LOG(COM0_PORT,"x", buf); } GIZWITS_LOG(COM0_PORT,"\"); #endif for(i=0; i<len; i++) { USART_SendData(COM1_PORT, buf);//使用USART1進行數(shù)據(jù)的讀寫 while(USART_GetFlagStatus(COM1_PORT,USART_FLAG_TXDE)==RESET); //Serial port to achieve thefunction, the buf sent to the module if(i >=2 && buf == 0xFF) { //Serial port to achieve thefunction, the 0x55 sent to the module USART_SendData(COM1_PORT, 0x55);//使用USART1進行數(shù)據(jù)的讀寫 while(USART_GetFlagStatus(COM1_PORT,USART_FLAG_TXDE)==RESET); } } return len;}
4、mcuReset中添加軟件復位函數(shù)
void mcuRestart(void){ NVIC_SystemReset(); }
PS:
合泰的這款M0單片機實現(xiàn)軟件復位的方法就是把SCB_AIRCR寄存器的SYSRESETREQ位置1.并且軟件復位和硬件復位不一樣,軟件復位不需要進行FPGA、DSP等的加載,只是一些配置芯片的初始化。軟件復位一般是一些塊結構,硬件復位的作用區(qū)域一般是全局的。
void software_reset(void) { __DSB(); //防止數(shù)據(jù)丟失 SCB->AIRCR = ((0x5FA <<SCB_AIRCR_VECTKEY_Pos) | //用0x5FA這個密碼開啟這個寄存器的鎖 SCB_AIRCR_SYSRESETREQ_Msk); //SYSRESETREQ置1實現(xiàn)復位 __DSB(); //防止數(shù)據(jù)丟失 while(1); }
5、UserInit函數(shù)里寫初始化
void userInit(void){ memset((uint8_t*)¤tDataPoint, 0, sizeof(dataPoint_t));//設備結構體初始化 gizwitsInit();//緩沖區(qū)初始化 gizwitsSetMode(WIFI_AIRLINK_MODE); //AirLink方式接入}
6、UserHandle里寫入數(shù)據(jù)上報處理語句
(數(shù)據(jù)上行,單片機上報數(shù)據(jù))
void userHandle(void){ if(wifi_sta) { currentDataPoint.valuelight_wave_1=200; }}
7、GizwitsEventProcess函數(shù)里寫入控制語句
(數(shù)據(jù)下行,手機下發(fā)控制指令)
int8_t gizwitsEventProcess(eventInfo_t *info, uint8_t*gizdata, uint32_t len){ uint8_t i =0; dataPoint_t *dataPointPtr =(dataPoint_t *)gizdata; moduleStatusInfo_t *wifiData = (moduleStatusInfo_t *)gizdata; protocolTime_t *ptime = (protocolTime_t *)gizdata;//#if MODULE_TYPE// gprsInfo_t*gprsInfoData = (gprsInfo_t *)gizdata;//#else// moduleInfo_t *ptModuleInfo = (moduleInfo_t *)gizdata;//#endif if((NULL == info) || (NULL ==gizdata)) { return -1; } for(i=0; i<info->num; i++) { switch(info->event) { case EVENT_func_1: currentDataPoint.valuefunc_1 =dataPointPtr->valuefunc_1; GIZWITS_LOG(COM0_PORT,"Evt: EVENT_func_1 %d \",currentDataPoint.valuefunc_1); if(0x01 == currentDataPoint.valuefunc_1) { led_on(LED1_GPIO_PIN); //點亮LED1 } else { led_off(LED1_GPIO_PIN); //關閉LED1 } break; ......
common.h文件中
由于我的usatrt.c文件里用的是UsartPrintf函數(shù)而不是printf函數(shù),因此需要將common.h文件中的
#define GIZWITS_LOG printf
修改為:
#define GIZWITS_LOG UsartPrintf
并修改product.c和protocol.c文件里對應的語句
五、修改main.c文件
1、添加usart、timer、Gizwits的初始化
2、while函數(shù)里進行數(shù)據(jù)處理并上報
#include "ht32.h"
#include "usart.h"
#include "Delay.h"
#include "led.h"
#include "TIMER.h"
#include "gizwits_product.h"
dataPoint_t currentDataPoint;
uint8_t wifi_sta=0;
static void delay(u32 nCount)
{
vu32 i;
for (i = 0; i < 10000 * nCount; i++){}
}
int main(void)
{
LED_Init(); //LED初始化
led_off(LED1_GPIO_PIN); //關閉LED1
USART0_Configuration(); //USART0初始化
USART1_Configuration(); //USART1初始化
Timer_Init(); //MS定時初始化
userInit(); //Gizwits初始化
while(1)
{
userHandle();
gizwitsHandle((dataPoint_t *)¤tDataPoint); //上報數(shù)據(jù)
}
}
到此程序的移植就完成了,可以下載機智云的APP看一看效果!
————————————————
版權**:本文為CSDN博主「劉一五」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權協(xié)議,轉載請附上原文出處鏈接及本**。
原文鏈接:https://blog.csdn.net/Jessaly/article/details/113817938
以上就是關于pos機芯片卡復位錯,機智云程序移植到合泰單片機HT32F52352上的知識,后面我們會繼續(xù)為大家整理關于pos機芯片卡復位錯的知識,希望能夠幫助到大家!
