国民技术N32G430开发笔记(12)- IAP升级 Settings区域数据初始化

news2024/12/24 2:21:46

IAP升级 Settings区域数据初始化

1、假如,有两个产品,A产品跟B产品,硬件都一样,要求一个软件里的board_name为N32G430C8L7_STB_A,另一个软件里的board_name为N32G430C8L7_STB_B。
那我们如何在不改boot程序跟App程序的基础上,快速的使两个软件看上去不同呢?
这里我们将setting区域的数据提前初始化,通过c语言的文件流的操作方法,创建一个setting.bin文件,然后将setting区域存储的结构体初始化后写入setting.bin文件,然后通过pyocd烧录到0x08004000地址即可。

2、根目录创建Settings目录,并创建setting_init.c Makefile文件

在这里插入图片描述

3、Makefile文件,编译setting_init.c的脚本文件,主要作用是用gcc编译出setting可执行文件,然后执行生成setting.bin
Makefile

CC = gcc
SRC = $(wildcard *.c)
OBJ = $(addprefix $(BUILD_DIR)/,$(notdir $(SRC:.c=.o)))
#OBJ = $(patsubst %.c, %.o, $(SRC))

TRAGET = settings
BUILD_DIR = build

ifeq ($(PRODUCT_A), y)
APPLICATION_FLAGS += \
	-DUSER_PRODUCT_A
endif

ifeq ($(PRODUCT_B), y)
APPLICATION_FLAGS += \
	-DUSER_PRODUCT_B
endif

C_INCLUDES +=  \
	-I../Common/Flash \
	-I../Common/Settings \
	-I../Common

C_FLAG += -Wall -MD -MP -MF"$(@:%.o=%.d)"

C_FLAG += -DUSER_SETTING_IN_HOST
C_FLAG += $(APPLICATION_FLAGS)
 
all: $(BUILD_DIR) $(BUILD_DIR)/$(TRAGET)

$(BUILD_DIR)/$(TRAGET):$(OBJ) Makefile | $(BUILD_DIR) 
	$(CC)  $< -o $@

$(OBJ): $(SRC)  Makefile | $(BUILD_DIR) 
	$(CC) -c $(C_FLAG) $(C_INCLUDES) $< -o $@

$(BUILD_DIR):
	@-mkdir $@

clean:
	@rm -rf $(TRAGET)
	@rm -rf $(OBJ)
	@rm -rf $(BUILD_DIR)

-include $(wildcard $(BUILD_DIR)/*.d)

# *** EOF ***

4、setting_init.c文件

之前讲过system_info的结构体,这里只写了四个变量,当然你也可以添加更多。在setting_init.c文件里,初始化了version跟board_name 变量。

#include <stdio.h>
#include <time.h>
#include <string.h>
#include <assert.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include "settings.h"
#include "flash.h"

MI_S32 get_current_times(MI_CHAR *c_time)
{
    time_t timep;
    struct tm *p;
    time(&timep);
    p = gmtime(&timep);

    sprintf(c_time,"%04d%02d%02d %02d%02d%02d",p->tm_year + 1900,p->tm_mon + 1,p->tm_mday,
                                            p->tm_hour + 8,p->tm_min,p->tm_sec);

    return 0;
}

MI_S32 main(int argc,char *argv[])
{
    system_info s_info;
    FILE *file;
    size_t w_size;

#ifdef USER_PRODUCT_A
    MI_CHAR *board_name = "N32G430C8L7_STB_A";
#endif

#ifdef USER_PRODUCT_B
    MI_CHAR *board_name = "N32G430C8L7_STB_B";
#endif

    memset(&s_info,0,sizeof(s_info));
    get_current_times(s_info.version);
    memcpy(s_info.board_name,board_name,strlen(board_name));

    printf(FONT_COLOR_BLUE"get current time %s\n"COLOR_NONE,s_info.version);
    printf(FONT_COLOR_BLUE"get board name %s\n"COLOR_NONE,s_info.board_name);

    file = fopen("./build/Settings.bin","wb");

    if (file == NULL)
    {
        printf(FONT_COLOR_YELLOW" open settings.bin error\n"COLOR_NONE);
        return -1;
    }
    w_size = fwrite((MI_U8 *)&s_info,1,sizeof(s_info),file);
    if (w_size == sizeof(system_info))
    {
        printf(FONT_COLOR_YELLOW" creat settings.bin Success!\n"COLOR_NONE);
    }
    fclose(file);
    return 0;
}

5、顶层的makefile修改

Top = ${shell pwd}
App = ${Top}/Application
BootLoader = ${Top}/Bootloader
Settings = ${Top}/Settings
#Bin = ${Top}/Bin

# A B版本的编译选项,在setting_init.c中使用
# 编译B版本setting.bin时,使用
# PRODUCT_A = n
# PRODUCT_B = y
export PRODUCT_A = y
export PRODUCT_B = n

all:  gd32 setting

# 编译setting_init.c 并执行编译出来的settings
setting:
	make -C ${Settings}
	cd ${Settings} && ./build/settings

gd32:
	make -C ${App}
	make -C ${BootLoader}

# cp ${BootLoader}/build/BootLoader.bin ${Top}/BinFiles/
# cp ${App}/build/Application.bin ${Top}/BinFiles/
	
# amp:
# 	cd ${Amp} && ./ampcreater
# 	cd ${AllBin} && ./allinone

clean:
	rm -rf ${App}/build/*
	rm -rf ${BootLoader}/build/*
	make clean -C ${Settings}
# rm -rf ${BinCreater}/*

gdboot:
	${info "start flash boot "}
	pyocd flash --erase auto --target N32G430C8L7 --base-address 0x8000000 --pack=./Nations.N32G430_DFP.1.0.0.pack ./Bootloader/build/Bootloader.bin

gdapp:
	${info "start flash Application "}
	pyocd flash --erase auto --target N32G430C8L7 --base-address 0x8006000 --pack=./Nations.N32G430_DFP.1.0.0.pack ./Application/build/Application.bin 

# 烧录settings.bin到flash的命令
gdsetting:
	${info "start flash settings "}
	pyocd flash --erase auto --target N32G430C8L7 --base-address 0x8004000 --pack=./Nations.N32G430_DFP.1.0.0.pack ./Settings/build/Settings.bin 

6、根目录执行make后,
A、
在这里插入图片描述
B、

在这里插入图片描述

执行make gdsetting 烧录两个setting.bin后分别验证,
结果如下:
B 、在这里插入图片描述
A、
在这里插入图片描述

注意,编译尽量先make clean;make

7、单片机读取version board_name的代码:

#include <string.h>
#include "settings.h"
#include "flash.h"

MI_BOOL system_info_get_version(MI_CHAR *version)
{
    system_info info;

    memset(&info,0,sizeof(info));
    n32_flash_read(SETTINGS_START_ADDRESS,(uint8_t *)&info,sizeof(info));
    memcpy(version,info.version,sizeof(info.version));

    return MI_TRUE;
}

MI_BOOL system_info_get_broad_name(MI_CHAR *name)
{
    system_info info;

    memset(&info,0,sizeof(info));
    n32_flash_read(SETTINGS_START_ADDRESS,(uint8_t *)&info,sizeof(info));
    memcpy(name,info.board_name,sizeof(info.board_name));

    return MI_TRUE;
}

MI_BOOL system_info_get_update_flag(MI_U8 *flag)
{
    system_info info;

    memset(&info,0,sizeof(info));
    n32_flash_read(SETTINGS_START_ADDRESS,(uint8_t *)&info,sizeof(info));
    *flag = info.update_flag;

    return MI_TRUE;
}

/**
 * 设置升级标志位的函数
*/
MI_BOOL system_info_set_update_flag(MI_U8 flag)
{
    system_info info;

    memset(&info,0,sizeof(info));
    n32_flash_read(SETTINGS_START_ADDRESS,(uint8_t *)&info,sizeof(info));
    info.update_flag = flag;

    //先清除system info 区域
    n32_flash_erase(SETTINGS_START_ADDRESS,SETTINGS_END_ADDRESS);
    n32_flash_write(SETTINGS_START_ADDRESS,(uint8_t *)&info,sizeof(info));

    return MI_TRUE;
}

main.c

#include <string.h>
#include "main.h"
#include "bsp_led.h"
#include "bsp_delay.h"
#include "usart.h"
#include "timer.h"
#include "pwm.h"
#include "key_input.h"
#include "flash.h"
#include "settings.h"
/**
 *\*\name   main.
 *\*\fun    main function.
 *\*\param  none.
 *\*\return none.
**/
int main(void)
{
	led_init();

	usart1_init();

	usart2_init();

	timer6_init();

	tim2_pwm_init();

	key_input_init();
	/* Delay 1s */
	SysTick_Delay_Ms(1000);

	MI_CHAR name[24] = {0};
	MI_CHAR version[48] = {0};

	system_info_get_broad_name(name);
	system_info_get_version(version);

	printf(FONT_COLOR_BLUE"from settings area read name  == %s\r\n"COLOR_NONE,name);
	printf(FONT_COLOR_BLUE"from settings area read version  == %s\r\n"COLOR_NONE,version);

	while(1)
	{
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/472938.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Matlab App Designer制作一个UART的GUI总结

目录 前言 读取串口数据速度慢 Axes响应慢 总结 前言 最近尝试了一下用Matlab App Designer制作一个上位机通信软件&#xff0c;专门用于读取电机控制里面的相电流&#xff0c;角度等高实时性的数据&#xff0c;已经在VOFA里面实现了。STM32 VOFA串口调试助手提升电机控制调试…

拷贝构造函数和运算符重载

文章目录 拷贝构造函数特点分析拷贝构造函数情景 赋值运算符重载运算符重载operator<运算符重载 赋值运算符前置和后置重载 拷贝构造函数 在创建对象的时候&#xff0c;是不是存在一种函数&#xff0c;使得能创建一个于已经存在的对象一模一样的新对象&#xff0c;那么接下…

Kotlin注解

文章参考 1、概念 注解可以对 类、函数、函数参数、属性等 做标注 注解信息可用于 源码级、编译期、运行时 示例 Retention(AnnotationRetention.RUNTIME) //作用于运行时 Target(AnnotationTarget.CLASS) //限定作用于类 annotation class Api(val url: String)/*** Rete…

Nachos系统的上下文切换

Fork调用创建进程 在实验1中通过gdb调试初步熟悉了Nahcos上下文切换的基本流程&#xff0c;但这个过程还不够清晰&#xff0c;通过源码阅读进一步了解这个过程。 在实验1中通过执行Threadtest&#xff0c;Fork创建子进程&#xff0c;并传入SimpleThread执行currentThread->…

vulnhub靶场之Wayne Manor

1.信息收集 探测存活主机&#xff0c;发现192.168.239.174存活 对主机进行端口扫描&#xff0c;发现存在端口21、22、80&#xff1b;且21端口状态是filtered。 打开浏览器访问http://192.168.239.174&#xff0c;未发现可疑&#xff0c;进行目录扫描只发现robots.txt。 什…

集合详解之(七)泛型

文章目录 &#x1f412;个人主页&#x1f3c5;JavaSE系列专栏&#x1f4d6;前言&#xff1a;&#x1f380;泛型的由来--参数化类型&#x1fa80;元组的介绍 ( int...数组名x )&#x1fa84;类型通配符&#x1f387;使用泛型的注意事项&#x1f3c5;子类继承泛型类【两种情况】 …

Transformers 发展一览

动动发财的小手&#xff0c;点个赞吧&#xff01; Transformers 研究概览 1. 介绍 近年来&#xff0c;深度学习的研究步伐显着加快&#xff0c;因此越来越难以跟上所有最新发展。尽管如此&#xff0c;有一个特定的研究方向因其在自然语言处理、计算机视觉和音频处理等多个领域取…

CLion开发工具 | 04 - CLion内置工具和插件

专栏介绍 一、CLion内置工具 1. SSH终端工具 填写ssh远程连接信息&#xff1a; 连接后在Terminal栏即可使用&#xff1a; 2. HTTP请求 填写http请求内容&#xff0c;并发起请求&#xff0c;方便的一批&#xff1a; 二、插件 1. 管理已安装的插件 2. 简体中文插件 3. 主题…

React 环境搭建,并打包到服务器

一. 安装node.js brew install node 二. 创建react app npx create-react-app my-app cd my-app npm start 默认使用3000端口&#xff0c;本地3000端口被占用&#xff0c;修改/node_modules/react-scripts/scripts/start.js中的端口号 // 这是start.js部分源码 const DEFAU…

【前端客栈】使用CSS实现畅销书排行榜页面

&#x1f4ec;&#x1f4eb;hello&#xff0c;各位小伙伴们&#xff0c;我是小浪。大家都知道&#xff0c;我最近是在更新各大厂的软件测试开发的面试真题&#xff0c;也是得到了很大的反馈和好评&#xff0c;几位小伙伴也是成功找到了测开的实习&#xff0c;非常不错。如果能前…

移除链表元素

☃️个人主页&#xff1a;fighting小泽 &#x1f338;作者简介&#xff1a;目前正在学习C语言和数据结构 &#x1f33c;博客专栏&#xff1a;leetcode练习题 &#x1f3f5;️欢迎关注&#xff1a;评论&#x1f44a;&#x1f3fb;点赞&#x1f44d;&#x1f3fb;留言&#x1f4a…

ChatGPT 和 Elasticsearch:OpenAI 遇见私有数据(二)

在之前的文章 “ChatGPT 和 Elasticsearch&#xff1a;OpenAI 遇见私有数据&#xff08;二&#xff09;” 中&#xff0c;我们详细描述了如何结合 ChatGPT 及 Elasticsearch 来进行搜索。它使用了如下的架构&#xff1a; 在今天的文章中&#xff0c;我们来详细描述实现这个的详…

BatchNormalization 介绍

1 为何要用BatchNormalization 为了让深层网络更容易训练&#xff0c;有两种方法&#xff1a; 使用更好的优化器&#xff1a;如 SDGMomentun等&#xff1b; 改变网络结构&#xff0c;比如加入BN层&#xff0c;处理网络数据&#xff0c;让网络数据服从标准的高斯分布&#xff0…

人群计数传统方法:object detection, regression-based

数据标注方式&#xff1a; &#xff08;1&#xff09;人很少、人很大的时候用bounding box&#xff0c;把人从头到脚都框进长方形方框内&#xff0c;这个方框只用记录三个点的坐标&#xff0c;左下、左上、右下&#xff1b;测试集预测的时候&#xff0c;除了点的坐标还要输出这…

1. 安装Open vSwitch环境

1. 安装Open vSwitch环境 1 配置基础环境。 在VMware Workstation软件中创建一个虚拟机VM1&#xff0c;配置2张网卡&#xff0c;虚拟机VM1配置如图4-3所示。将网卡ens33地址配置为192.168.1.131/24&#xff0c;网卡ens34地址配置为192.168.2.131/24。 图4-3 VM1虚拟机配置 2…

(有假币,因子个数)笔试强训

博主简介&#xff1a;想进大厂的打工人博主主页&#xff1a;xyk:所属专栏: JavaEE初阶 目录 文章目录 一、选择1 二、选择2 二、[编程题]有假币 三、[编程题]因子个数 一、选择1 在使用锁保证线程安全时&#xff0c;可能会出现活跃度失败的情况&#xff0c;活跃度失败主要…

【DataGrip】手把手教你使用可视化数据库管理工具DataGrip(附数据库驱动无法下载解决办法)

博主简介&#xff1a;努力学习的大一在校计算机专业学生&#xff0c;热爱学习和创作。目前在学习和分享&#xff1a;数据结构、Go&#xff0c;Java等相关知识。博主主页&#xff1a; 是瑶瑶子啦所属专栏: Mysql从入门到精通近期目标&#xff1a;写好专栏的每一篇文章 目录 一、…

Android 面试笔记总结,建议吸收一下灵气~

android消息机制 消息机制指Handler、Looper、MessageQueue、Message之间如何工作的。 handler是用来处理消息和接收消息的中间者&#xff0c;handler的创建会伴随着handler中产生looper和MessageQueue&#xff0c;handler依赖于looper&#xff0c;looper依赖于MessageQueue&a…

大学生体质测试管理系统~java

摘要 大学生体质测试管理系统提供给用户一个简单方便体质测试管理信息&#xff0c;通过留言区互动更方便。本系统采用了B/S体系的结构&#xff0c;使用了java技术以及MYSQL作为后台数据库进行开发。系统主要分为系统管理员、教师和用户三个部分&#xff0c;系统管理员主要功能…

[论文笔记]C^3F,MCNN:图片人群计数模型

(万能代码)CommissarMa/Crowd_counting_from_scratch 代码&#xff1a;https://github.com/CommissarMa/Crowd_counting_from_scratch (万能代码)C^3 Framework开源人群计数框架 科普中文博文&#xff1a;https://zhuanlan.zhihu.com/p/65650998 框架网址&#xff1a;https…