pos机实验操作,STM32零基础入门学习

 新闻资讯  |   2023-04-23 12:12  |  投稿人:pos机之家

网上有很多关于pos机实验操作,STM32零基础入门学习的知识,也有很多人为大家解答关于pos机实验操作的问题,今天pos机之家(www.poszjia.com)为大家整理了关于这方面的知识,让我们一起来看下吧!

本文目录一览:

1、pos机实验操作

pos机实验操作

1,myiap.c文件内容:

#include "usart.h"#include "sys.h"#include "stm32flash.h"#include "myiap.h"iapfun jump2app; u16 iapbuf[1024]; /**功能:烧写文件*参数:appxaddr:应用程序的起始地址 appbuf:应用程序代码 appsize:应用程序大小(字节).*返回值:无*/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();}} //设置栈顶地址//addr:栈顶地址__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位数据)* 地址:待读地址(此地址必须为2的倍数!!)*返回值:对应数据.*/u16 STMFLASH_ReadHalfWord(u32 flash_addr){return *(vu16*)flash_addr; }/**功能:从指定地址开始读出指定长度的数据* 参数:WriteAddr:起始地址pBuffer:数据指针 NumToWrite:半字(16位)数 备注:起始地址(此地址必须为2的倍数!!)*返回值:无*/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 /**功能:写数据* 参数:WriteAddr:起始地址pBuffer:数据指针 NumToWrite:半字(16位)数 *返回值:无*/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];/**功能:从指定地址开始写入指定长度的数据* 参数:WriteAddr:起始地址pBuffer:数据指针 NumToWrite:半字(16位)数 备注:起始地址(此地址必须为2的倍数!!)*返回值:无*/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("开始执行FLASH用户代码!!\\");if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.{ iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码}else {printf("非FLASH应用程序,无法执行!\\"); }}} }欢迎关注逗比小憨憨

以上就是关于pos机实验操作,STM32零基础入门学习的知识,后面我们会继续为大家整理关于pos机实验操作的知识,希望能够帮助到大家!

转发请带上网址:http://www.poszjia.com/news/27555.html

你可能会喜欢:

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 babsan@163.com 举报,一经查实,本站将立刻删除。