pos機實驗操作,STM32零基礎入門學習

 新聞資訊  |   2023-04-23 12:12  |  投稿人:pos機之家

網上有很多關于pos機實驗操作,STM32零基礎入門學習的知識,也有很多人為大家解答關于pos機實驗操作的問題,今天pos機之家(www.tjfsxbj.com)為大家整理了關于這方面的知識,讓我們一起來看下吧!

本文目錄一覽:

1、pos機實驗操作

pos機實驗操作

1,myiap.c文件內容:

#include "usart.h"#include "sys.h"#include "stm32flash.h"#include "myiap.h"iapfun jump2app; u16 iapbuf[1024]; /**功能:燒寫文件*參數(shù):appxaddr:應用程序的起始地址 appbuf:應用程序代碼 appsize:應用程序大小(字節(jié)).*返回值:無*/void iap_write_appbin(u32 appxaddr,u8 *appbuf,u32 appsize) {u16 t;u16 i = 0;u16 temp;u32 fwaddr = appxaddr;u8 *dfu = appbuf; for(t=0;t < appsize;t += 2){ temp = (u16)dfu[1]<<8;temp += (u16)dfu[0]; dfu += 2;iapbuf[i++] = temp;if(i == 1024){i=0;STMFLASH_Write(fwaddr,iapbuf,1024);fwaddr += 2048;}}if(i)STMFLASH_Write(fwaddr,iapbuf,i);}/**功能:跳轉到應用程序段*appxaddr:用戶代碼起始地址.*返回值:無*/void iap_load_app(u32 appxaddr){printf("1\");if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000){ printf("2\");jump2app=(iapfun)*(vu32*)(appxaddr+4);MSR_MSP(*(vu32*)appxaddr);jump2app();}} //設置棧頂?shù)刂?/addr:棧頂?shù)刂穇_asm void MSR_MSP(u32 addr) { MSR MSP, r0 //set Main Stack value BX r14}

2,myiap.h文件內容:

#ifndef __MYIAP_H#define __MYIAP_H#include "stm32f10x.h" typedef void (*iapfun)(void);#define FLASH_APP1_ADDR0x08004000 void MSR_MSP(u32 addr);void iap_load_app(u32 appxaddr);void iap_load_appsram(u32 appxaddr);void iap_write_appbin(u32 appxaddr,u8 *appbuf,u32 applen);#endif

3,stm32flash.h文件內容:

#ifndef __stm32flash_H#define __stm32flash_H#include "stm32f10x.h" #define FLASH_WRITE_EN 1#define FLASH_READ_EN 1#define STM32_FLASH_SIZE 64 #if FLASH_READ_ENu16 STMFLASH_ReadHalfWord(u32 faddr); void STMFLASH_Read(u32 ReadAddr,u16 *pBuffer,u16 NumToRead); #endif#if FLASH_WRITE_ENvoid STMFLASH_WriteLenByte(u32 WriteAddr,u32 DataToWrite,u16 Len);void STMFLASH_Write(u32 WriteAddr,u16 *pBuffer,u16 NumToWrite);#endif #endif

4,stm32flash.c文件內容:

#include "stm32flash.h"#include "delay.h"#if FLASH_READ_EN /**功能:讀取指定地址的半字(16位數(shù)據(jù))* 地址:待讀地址(此地址必須為2的倍數(shù)!!)*返回值:對應數(shù)據(jù).*/u16 STMFLASH_ReadHalfWord(u32 flash_addr){return *(vu16*)flash_addr; }/**功能:從指定地址開始讀出指定長度的數(shù)據(jù)* 參數(shù):WriteAddr:起始地址pBuffer:數(shù)據(jù)指針 NumToWrite:半字(16位)數(shù) 備注:起始地址(此地址必須為2的倍數(shù)!!)*返回值:無*/void STMFLASH_Read(u32 ReadAddr,u16 *pBuffer,u16 NumToRead) {u16 i;for(i=0;i<NumToRead;i++){pBuffer[i]=STMFLASH_ReadHalfWord(ReadAddr);ReadAddr+=2;}}#endif#if FLASH_WRITE_EN /**功能:寫數(shù)據(jù)* 參數(shù):WriteAddr:起始地址pBuffer:數(shù)據(jù)指針 NumToWrite:半字(16位)數(shù) *返回值:無*/void STMFLASH_Write_NoCheck(u32 WriteAddr,u16 *pBuffer,u16 NumToWrite) { u16 i;for(i=0;i<NumToWrite;i++){FLASH_ProgramHalfWord(WriteAddr,pBuffer[i]); WriteAddr += 2;} }#if STM32_FLASH_SIZE<256#define STM_SECTOR_SIZE 1024 #else #define STM_SECTOR_SIZE2048#endifu16 STMFLASH_BUF[STM_SECTOR_SIZE / 2];/**功能:從指定地址開始寫入指定長度的數(shù)據(jù)* 參數(shù):WriteAddr:起始地址pBuffer:數(shù)據(jù)指針 NumToWrite:半字(16位)數(shù) 備注:起始地址(此地址必須為2的倍數(shù)!!)*返回值:無*/void STMFLASH_Write(u32 WriteAddr,u16 *pBuffer,u16 NumToWrite){u32 secpos; u16 secoff; u16 secremain; u16 i; u32 offaddr; if(WriteAddr < NVIC_VectTab_FLASH||(WriteAddr >= (NVIC_VectTab_FLASH + 1024 * STM32_FLASH_SIZE)))return;FLASH_Unlock();offaddr = WriteAddr - NVIC_VectTab_FLASH;secpos = offaddr / STM_SECTOR_SIZE;secoff = (offaddr % STM_SECTOR_SIZE) / 2;secremain = STM_SECTOR_SIZE / 2 - secoff;if(NumToWrite <= secremain)secremain = NumToWrite;while(1) {STMFLASH_Read(secpos * STM_SECTOR_SIZE + NVIC_VectTab_FLASH, STMFLASH_BUF, STM_SECTOR_SIZE / 2);for(i = 0; i < secremain; i++){if(STMFLASH_BUF[secoff + i] != 0XFFFF)break; }if(i < secremain){FLASH_ErasePage(secpos * STM_SECTOR_SIZE + NVIC_VectTab_FLASH);for(i = 0;i < secremain; i++){STMFLASH_BUF[ i + secoff] = pBuffer[i]; }STMFLASH_Write_NoCheck(secpos*STM_SECTOR_SIZE+NVIC_VectTab_FLASH,STMFLASH_BUF,STM_SECTOR_SIZE/2);}else STMFLASH_Write_NoCheck(WriteAddr, pBuffer, secremain); if(NumToWrite == secremain)break;else{secpos++;secoff = 0; pBuffer += secremain; WriteAddr += secremain; NumToWrite -= secremain;if(NumToWrite > (STM_SECTOR_SIZE / 2))secremain = STM_SECTOR_SIZE / 2;else secremain = NumToWrite;} };FLASH_Lock();}#endif

5,main.c文件內容:

#include "delay.h"#include "usart.h"#include "stm32flash.h"#include "myiap.h"int main(void){u8 flag = 0;u16 oldcount=0;u16 applenth=0; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); uart_init(115200);delay_init();printf("連接成功,等待燒寫bin文件\\\\");while(1){if(usart1_count){if(oldcount == usart1_count){flag = 1;applenth=usart1_count;oldcount=0;usart1_count=0;printf("用戶程序接收完成!\\");printf("代碼長度:?ytes\\",applenth);}else oldcount = usart1_count;}delay_ms(1000);if(flag == 1){if(applenth){printf("開始更新固件...\\");if(((*(vu32*)(0X20001000+4))&0xFF000000)==0x08000000){ iap_write_appbin(FLASH_APP1_ADDR,usart1_rx_buf,applenth);flag = 2;printf("固件更新完成!\\");}else { printf("非FLASH應用程序!\\");}}else {printf("沒有可以更新的固件!\\");}}if(flag == 2){printf("開始執(zhí)行FLASH用戶代碼!!\\");if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//判斷是否為0X08XXXXXX.{ iap_load_app(FLASH_APP1_ADDR);//執(zhí)行FLASH APP代碼}else {printf("非FLASH應用程序,無法執(zhí)行!\\"); }}} }歡迎關注逗比小憨憨

以上就是關于pos機實驗操作,STM32零基礎入門學習的知識,后面我們會繼續(xù)為大家整理關于pos機實驗操作的知識,希望能夠幫助到大家!

轉發(fā)請帶上網址:http://www.tjfsxbj.com/news/27555.html

你可能會喜歡:

版權聲明:本文內容由互聯(lián)網用戶自發(fā)貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權/違法違規(guī)的內容, 請發(fā)送郵件至 babsan@163.com 舉報,一經查實,本站將立刻刪除。