当前位置: 首页 > news >正文

关于插画的网站网上建平台怎么建

关于插画的网站,网上建平台怎么建,广州娱乐场所最新通知,wordpress获取token方法一、原理 利用flash存储用户数据需要注意查看#xff0c;用户数据是否会覆盖芯片运行程序。 IAP#xff08;在程序中编程#xff09;利用程序修改程序本身#xff0c;和OTA是一个原理。IAP在程序中编程支持任意一种通信下载。 ICP#xff08;在电路中编程#xff0c;通…一、原理 利用flash存储用户数据需要注意查看用户数据是否会覆盖芯片运行程序。 IAP在程序中编程利用程序修改程序本身和OTA是一个原理。IAP在程序中编程支持任意一种通信下载。 ICP在电路中编程通过外接引脚下载每次下载会将程序完全更新。JTAG和SWD为仿真器下载程序例如JLINK-JTAG和STLNIK-SWD。串口下载手册中系统Bootload硬件有说明使用的时系统存储器的Bootload。 1、STM32的存储器映像 2、个人理解的Bootload原理 3、STM32中容量产品闪存容量分布情况 可以看到的主存储器和信息块属于flash闪存存储器不属于flash相当于单独的外设。闪存存储器相当于上面信息块和主存储器的管理员用于管理擦除和编程读取flash直接进行指针读取即可无需借用存储器。 STM32内部的flash只分成了页起始地址为0x0800 0000直到0x0801 FFFF一共128K每K一页可以看到以000、400、800、C00结尾的都是页起始地址。系统存储区容量为2K起始地址存储系统Bootload内容。容量2K。用户选项字节为16Byte起始地址为0x1FFF F800 容量16Byte用户选项字节和启动程序代码系统存储区也是flash但是不计算在闪存容量中闪存容量一般指程序存储区flash。闪存存储器接口寄存器起始地址为0x4002 2000属于外设在外设存储区内 4、flash基本结构 5、flash擦除和编程详细内容 5.1、flash解锁 通过键寄存器写入指定的键值实现。RDPRT是解除读保护的密钥。将flash_cr重新置lock1可锁住flash_cr。 5.2、使用指针访问存储器 volatile 在c语言中表示易变的数据防止编译器优化编译器自动去除无用的繁杂代码。STM32中有工作组寄存器类似cache工作速度快但是使用的变量可能是程序中变量的映射。若程序为多线程或者中断改变了此变量会造成工作组寄存器和源变量值不一致导致程序异常。通过volatile可以高速编译器变量需要实时注意是否更改。 通过*((__IO uint16_t *)(0x0800 0000))通过程序取出地址0x0800 0000地址的寄存器的数据并通过uint16_t类型可根据具体需求返还。也可通过此形式直接指定指定地址的值。flash安全程度较高需要提前解锁。若写入SRAM则不需要。 5.3、程序存储区编程 写入只能通过地址防止进行半字的写入一次2byte。写入32bit需要分两次写入8bit可以先进行读出在使用读改写的方式写入。 5.4、程序存储区页擦除flash写入前必须全擦除为1只能写入0不能写入1根据手册的擦除最小单位进行。 5.5、全擦除 6、选项字节的组织和用途 可以看到表中有数据和n数据表示写入正常数据时要在对应的n位写入反码这样才能够正常有效写入。 写入反码的过程硬件会自动计算并写入。 WRP配置flash程序存储区写保护每位对应保护4个存储页4*8*4 128页刚好对应中容量的最大字节128K。 6.1 、选项字节编程 解锁flash锁后还需要解锁选项字节的锁也需要先写入Key1再写入Key2之后才能操作选项字节。 6.2、选项字节擦除 7、期间的电子签名 可以通过指定签名运行指定程序来限制程序被盗。  8、手册 在SystemInit已经打开了HSI。 因为flash的原因默认写保护使能为0不使能写保护为1。 9、编程 在库文件.c的头部有说明库中后期增加了XL加大容量的芯片部分函数只能使用于加大容量的芯片。 9.1存储格式 Intel存储格式为小端存储即低字节在低地址高字节在高地址。即L_Byte(低地址) H_Byte高地址 例如0x482A 18594。小端存储为 0x48 0x2A。 intel格式小端存储bitByte10x2AL_Byte7654321020x48H_Byte15141312111098 Motorola存储格式为大端存储即高字节在低地址低字节在高地址。即H_Byte(低地址) L_Byte高地址 例如0x482A 18594。大端存储为 0x2A 0x48。 Motorola格式大端存储bitByte10x48H_Byte1514131211109820x2AL_Byte76543210 字节内部相同高bit在左低bit在右。例如大端存储和小端字节内存储格式相同。 大端小端相同bit位相同15141312111098765432100x48H_Byte0x2AL_Byte 9.2为了区分程序存储空间和使用flash存储用户数据的空间大小限制程序flash。 如果想写一个自定义的Bootload程序在尾部也可以通过此处更改烧写程序的起始位置但是要计算Bootload程序的大小、正式程序的大小防止空间不足 。 右边是片上ram的内存。 9.3 下载配置根据需要配置下载时如何擦除程序。使用IAP选择页擦除STM32为扇区擦除选项 前三个数为程序占用闪存的大小后面两个相加为占用SRAM的大小。 目前可以看到我这个程序占用flash的大小为5.03KB5150.72Bflash地址为0x0800 0000偏移5148B实际存储空间到0x0800 141C左右。 使用软件核实程序的确存储到了0x0800141C左右。 二、程序实例STM32 ST-LINK Utility使用见主页文章 1、测试程序中的Flash基本操作单元的功能flash页写入、flash读取、页擦除、全部擦除。按键1用PB11、按键2用PB10 1.1 测试1  程序中#if (1) 1、程序烧写完成上电查看OLED显示内容是否为flash首地址的32bit、16bit、8bit小端存储低字节在低地址 2、按下按键PB11可以看到和程序中相同flash程序存储区全部擦除注意再次烧写程序时需要关闭STM32 ST-LINK Utility防止冲突 3、重新烧写程序按下按键PB12可以看到程序存储区中flash中0x0800 0400的页被删除直到0x0800 0800每个扇区1K擦除后为FF 1.2、测试2 程序中改#if (0) 可以看到0x0800FC00页地址原来的数据。 按下按键PB11或PB100x0800FC00和0x0800FC10所在地址的数据写为0x0000000032bit和0x0F0F16bit。 程序 main.c #include stm32f10x.h // Device header #include Delay.h #include OLED.h #include Button.h #include MyFlash.h int main(void){OLED_Init();ButtonPB11PB10_Init();//测试程序存储区flash数据读取OLED_ShowString(1,1,Flash:);//OLED_ShowHexNum(2,1,MyFlash_ReadWord(0x08000000),8);OLED_ShowHexNum(3,1,MyFlash_ReadHalfWord(0x08000000),4);OLED_ShowHexNum(4,1,MyFlash_ReadByte(0x08000000),2);while(1){#if (0) //为真运行//测试程序存储区flash全部擦除和页擦除if(GetButtonPB11PB10() 1){MyFlash_EraseAll();}else if(GetButtonPB11PB10() 2){MyFlash_ErasePage(0x08000400);//擦除第二页数据}#else //测试程序存储区flash写入字和半字if((GetButtonPB11PB10() 1) || (GetButtonPB11PB10() 2)){MyFlash_ErasePage(0x0800FC00);MyFlash_ProgramWord(0x0800FC00,0x00000000);//地址0x0800FC00写入半字0x00000000MyFlash_ProgramHalfWord(0x0800FC10,0x0F0F);//地址0x0800FC00写入半字0x0F0FOLED_ShowString(4,4,W);Delay_ms(500);OLED_ShowString(4,4, );}#endif}return 0; }MyFlash.c #include stm32f10x.h // Device header /*选项字节配置可通过外部的STM32 ST-Link Utility用户自行使用选项字节容易出现问题*//*** brief 读取Flash指定地址的字* param Address:32位地址* arg * param * arg * retval None*/ uint32_t MyFlash_ReadWord(uint32_t Address){//对于Address通过(__IO uint32_t *)变为uint32_t类型数据的指针通过*取该地址的值return *((__IO uint32_t *)(Address)) ; }/*** brief 读取Flash指定地址的半字* param Address:32位地址* arg * param * arg * retval None*/ uint16_t MyFlash_ReadHalfWord(uint32_t Address){//对于Address通过(__IO uint16_t *)变为uint16_t类型数据的指针通过*取该地址的值返回return *((__IO uint16_t *)(Address)) ;//uint16_t *表示指向uint16_t数据的指针 }/*** brief 读取Flash指定地址的字* param Address:32位地址* arg * param * arg * retval None*/ uint8_t MyFlash_ReadByte(uint32_t Address){//对于Address通过(__IO uint32_t *)变为uint32_t的指针通过*取该地址的值return *((__IO uint8_t *)(Address)) ; }/*** brief 程序存储区flash全部擦除* param * arg * param * arg * retval None*/ void MyFlash_EraseAll(void){FLASH_Unlock();//程序存储区flash页编程解锁FLASH_EraseAllPages();//全部擦除FLASH_Lock();//程序存储区flash页编程关锁 }/*** brief 程序存储区flash页擦除* param Address需要擦除的页地址* arg * param * arg * retval None*/ void MyFlash_ErasePage(uint32_t PageAddress){FLASH_Unlock();//程序存储区flash页编程解锁FLASH_ErasePage(PageAddress);//全部擦除FLASH_Lock();//程序存储区flash页编程关锁 }/*** brief 程序存储区flash指定地址写字* param * arg * param * arg * retval None*/ void MyFlash_ProgramWord(uint32_t Address,uint32_t WriteWord){FLASH_Unlock();//程序存储区flash页编程解锁FLASH_ProgramWord(Address,WriteWord);//指定地址写字FLASH_Lock();//程序存储区flash页编程关锁 }/*** brief 程序存储区flash指定地址写半字* param * arg * param * arg * retval None*/ void MyFlash_ProgramHalfWord(uint32_t Address,uint16_t WriteWord){FLASH_Unlock();//程序存储区flash页编程解锁FLASH_ProgramHalfWord(Address,WriteWord);//指定地址写半字写入32bit地址的低地址STM32flash小端存储低字节在低位FLASH_Lock();//程序存储区flash页编程关锁 } MyFlash.h #ifndef __MYFLASH_H #define __MYFLASH_H #include stm32f10x.h // Device header uint32_t MyFlash_ReadWord(uint32_t Address); uint16_t MyFlash_ReadHalfWord(uint32_t Address); uint8_t MyFlash_ReadByte(uint32_t Address); void MyFlash_EraseAll(void); void MyFlash_ErasePage(uint32_t PageAddress); void MyFlash_ProgramWord(uint32_t Address,uint32_t WriteWord); void MyFlash_ProgramHalfWord(uint32_t Address,uint16_t WriteWord);#endif Button.c /*** brief 初始化引脚PB11地开信号接收Button,用于辅助测试看门狗* param * arg * param * arg * retval None*/ void ButtonPB11PB10_Init(void){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin GPIO_Pin_11 | GPIO_Pin_10;GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;GPIO_Init(GPIOB,GPIO_InitStructure); }/*** brief 获取PB11的Button是否按下* param * arg * param * arg * retval None*/ uint8_t GetButtonPB11PB10(void){if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11) RESET){Delay_ms(10);while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11) RESET);Delay_ms(10);return 1;}if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10) RESET){Delay_ms(10);while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10) RESET);Delay_ms(10);return 2;}return 0; } Button.h #ifndef __BUTTON_H #define __BUTTON_H #include stm32f10x.h // Device headeruint8_t GetButtonPB11PB10(void); void ButtonPB11PB10_Init(void); #endif 2、 读写内部Flash通过Flash最后一页内存进行数据存储上电读取内容、按键更新并写入内容按键1用PB11、按键2用PB10 测试方法 1、烧写程序后可以看到程序持续运行此时、OLED显示程序存储区flash的最后一页存储的8Byte数据第一次使用为0x00000000可以看到指定的flash第一次读写标志位0xA5A5和0x00等数据已写入。 2、按键PB10可以看到程序存储区flash最后一页存储的前5字节当前数据变为0x1111;0x2222;0x3333;0x4444;按键PB11可以看到数据会自增。 程序 main.c #include stm32f10x.h // Device header #include Delay.h #include OLED.h #include Button.h #include Store.h int main(void){OLED_Init();ButtonPB11PB10_Init();Store_Init();//显示当前Flash最后一页的数据OLED_ShowString(1,1,Flash:);//while(1){uint8_t Key_Num GetButtonPB11PB10();//测试按键控制Flash数据更新if(Key_Num 1){//PB11for(uint8_t i1;i5;i){Store_Data[i];}Store_Write();Store_Read();OLED_ShowString(4,1,PB11);}else if(Key_Num 2){//PB10Store_Data[1] 0x1111;Store_Data[2] 0x2222;Store_Data[3] 0x3333;Store_Data[4] 0x4444;Store_Write();Store_Read();OLED_ShowString(4,1,PB10);}//显示Flash数据OLED_ShowHexNum(2,1,Store_Data[1],4);OLED_ShowHexNum(2,6,Store_Data[2],4);OLED_ShowHexNum(3,1,Store_Data[3],4);OLED_ShowHexNum(3,6,Store_Data[4],4);}return 0; }Store.c #include stm32f10x.h // Device header #include MyFlash.h#define STORE_START_ADDRESS 0x0800FC00 //写入页的起始地址 #define STORE_COUNT 512 #define STORE_FLAG 0xA5A5 uint16_t Store_Data[STORE_COUNT] {STORE_FLAG,0};//用RAM对应存储Flash最后一页的数据/*** brief flash最后一页数据初始化第一次使用的话默认为0x00* param * arg * param * arg * retval None*/ void Store_Init(void){//对于存储过数据的Flash我们默认使用最后一页的起始地址16bit作为标志if(MyFlash_ReadHalfWord(STORE_START_ADDRESS) STORE_FLAG){//若不是第一次使用读出数据for(uint16_t i0;iSTORE_COUNT;i){Store_Data[i] MyFlash_ReadHalfWord(STORE_START_ADDRESSi*2);}}else{//若是第一次使用写入0xA5A5标志位和剩余的0x00MyFlash_ErasePage(STORE_START_ADDRESS);//擦除最后一页for(uint16_t i0;iSTORE_COUNT;i){MyFlash_ProgramHalfWord(STORE_START_ADDRESSi*2,Store_Data[i]);//写入}} }/*** brief 将SAM的数据Store_Data写入flash最后一页* param * arg * param * arg * retval None*/ void Store_Write(void){MyFlash_ErasePage(STORE_START_ADDRESS);//擦除最后一页for(uint16_t i0;iSTORE_COUNT;i){MyFlash_ProgramHalfWord(STORE_START_ADDRESSi*2,Store_Data[i]);//写入} }/*** brief 将Flash的数据读出到将SAM的数据Store_Data* param * arg * param * arg * retval None*/ void Store_Read(void){for(uint16_t i0;iSTORE_COUNT;i){Store_Data[i] MyFlash_ReadHalfWord(STORE_START_ADDRESSi*2);} } Store.h #ifndef __STORE_H #define __STORE_H #include stm32f10x.h // Device headerextern uint16_t Store_Data[]; void Store_Init(void); void Store_Write(void); void Store_Read(void);#endif Button.c /*** brief 初始化引脚PB11地开信号接收Button,用于辅助测试看门狗* param * arg * param * arg * retval None*/ void ButtonPB11PB10_Init(void){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin GPIO_Pin_11 | GPIO_Pin_10;GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;GPIO_Init(GPIOB,GPIO_InitStructure); }/*** brief 获取PB11的Button是否按下* param * arg * param * arg * retval None*/ uint8_t GetButtonPB11PB10(void){if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11) RESET){Delay_ms(10);while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11) RESET);Delay_ms(10);return 1;}if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10) RESET){Delay_ms(10);while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10) RESET);Delay_ms(10);return 2;}return 0; } Button.h #ifndef __BUTTON_H #define __BUTTON_H #include stm32f10x.h // Device headeruint8_t GetButtonPB11PB10(void); void ButtonPB11PB10_Init(void); #endif MyFlash.c #include stm32f10x.h // Device header /*选项字节配置可通过外部的STM32 ST-Link Utility用户自行使用选项字节容易出现问题*//*** brief 读取Flash指定地址的字* param Address:32位地址* arg * param * arg * retval None*/ uint32_t MyFlash_ReadWord(uint32_t Address){//对于Address通过(__IO uint32_t *)变为uint32_t类型数据的指针通过*取该地址的值return *((__IO uint32_t *)(Address)) ; }/*** brief 读取Flash指定地址的半字* param Address:32位地址* arg * param * arg * retval None*/ uint16_t MyFlash_ReadHalfWord(uint32_t Address){//对于Address通过(__IO uint16_t *)变为uint16_t类型数据的指针通过*取该地址的值返回return *((__IO uint16_t *)(Address)) ;//uint16_t *表示指向uint16_t数据的指针 }/*** brief 读取Flash指定地址的字* param Address:32位地址* arg * param * arg * retval None*/ uint8_t MyFlash_ReadByte(uint32_t Address){//对于Address通过(__IO uint32_t *)变为uint32_t的指针通过*取该地址的值return *((__IO uint8_t *)(Address)) ; }/*** brief 程序存储区flash全部擦除* param * arg * param * arg * retval None*/ void MyFlash_EraseAll(void){FLASH_Unlock();//程序存储区flash页编程解锁FLASH_EraseAllPages();//全部擦除FLASH_Lock();//程序存储区flash页编程关锁 }/*** brief 程序存储区flash页擦除* param Address需要擦除的页地址* arg * param * arg * retval None*/ void MyFlash_ErasePage(uint32_t PageAddress){FLASH_Unlock();//程序存储区flash页编程解锁FLASH_ErasePage(PageAddress);//全部擦除FLASH_Lock();//程序存储区flash页编程关锁 }/*** brief 程序存储区flash指定地址写字* param * arg * param * arg * retval None*/ void MyFlash_ProgramWord(uint32_t Address,uint32_t WriteWord){FLASH_Unlock();//程序存储区flash页编程解锁FLASH_ProgramWord(Address,WriteWord);//指定地址写字FLASH_Lock();//程序存储区flash页编程关锁 }/*** brief 程序存储区flash指定地址写半字* param * arg * param * arg * retval None*/ void MyFlash_ProgramHalfWord(uint32_t Address,uint16_t WriteWord){FLASH_Unlock();//程序存储区flash页编程解锁FLASH_ProgramHalfWord(Address,WriteWord);//指定地址写半字写入32bit地址的低地址STM32flash小端存储低字节在低位FLASH_Lock();//程序存储区flash页编程关锁 } MyFlash.h #ifndef __MYFLASH_H #define __MYFLASH_H #include stm32f10x.h // Device header uint32_t MyFlash_ReadWord(uint32_t Address); uint16_t MyFlash_ReadHalfWord(uint32_t Address); uint8_t MyFlash_ReadByte(uint32_t Address); void MyFlash_EraseAll(void); void MyFlash_ErasePage(uint32_t PageAddress); void MyFlash_ProgramWord(uint32_t Address,uint32_t WriteWord); void MyFlash_ProgramHalfWord(uint32_t Address,uint16_t WriteWord);#endif 3、读写芯片ID 读取STM32指定地址下的原厂id号和容量。 #include stm32f10x.h // Device header #include Delay.h #include OLED.h int main(void){OLED_Init();//显示当前Flash最后一页的数据OLED_ShowString(1,1,F_Size:);//OLED_ShowHexNum(1,8,*((__IO uint16_t *)(0x1FFFF7E0)),4);//我的芯片显示0x80-Flash容量128kBOLED_ShowString(2,1,UID:);//OLED_ShowHexNum(2,5,*((__IO uint16_t *)(0x1FFFF7E80x02)),4);OLED_ShowHexNum(2,9,*((__IO uint16_t *)(0x1FFFF7E8)),4);OLED_ShowHexNum(3,1,*((__IO uint32_t *)(0x1FFFF7E80x04)),8);OLED_ShowHexNum(4,1,*((__IO uint32_t *)(0x1FFFF7E80x08)),8);while(1){}return 0; }感谢江协科技
http://www.dnsts.com.cn/news/87054.html

相关文章:

  • 恢复最近删除的网站php采集wordpress文章
  • 小学校园网站建设专业营销型网站建设费用
  • 玉溪市城乡建设局网站网站架构制作
  • 互联网网站样式互联网公司有哪些部门
  • 云南建设厅查证网站wordpress编辑我
  • 上饶网站建设企业全能浏览器app下载
  • 织梦音乐网站程序腾讯云域名查询
  • 公司网站建设知乎关于做暧暧的网站
  • 有哪些比较好的外贸网站烟台网站的优化
  • 专业做二手房的网站wordpress和dedecms
  • 建站技术论坛延吉网站建设多少钱
  • 域名历史记录查询网站皇马logo做网站
  • 租车网站制作方案东营人力资源招聘信息网官网
  • 在哪修改网站关键词wordpress 百度经验主题
  • 渭南市住房和城乡建设局网站腾讯新闻发布平台
  • 外贸公司网站建设 重点是什么中国星子网
  • 自己这么做网站房地产网站制作公司
  • 雄安智能网站建设公司成品短视频app源码的下载方法
  • 苏州建网网站优化软件排名器
  • 制作网站开发多少钱vue做的网站域名汇总
  • 一个成功的网站必须具备个人网站做音乐网要备文化
  • 湖北省节能建设网站石排网站仿做
  • 网站站长统计代码免费用搭建网站
  • 做的网站为什么图片看不了怎么办东营seo网站建设费用
  • 武隆集团网站建设品牌建设思维导图
  • 网站建设需要怎么选合作机构公司网站服务器租用
  • 皋兰县城乡和住房建设局网站杭州企业做网站
  • 建设网站的目的和功能龙岩网络营销平台
  • 网站建设策略书wordpress 目录页
  • 设计网站登录框ps怎么做长春网络哪家好