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

这篇具有很好参考价值的文章主要介绍了国民技术N32G430开发笔记(12)- IAP升级 Settings区域数据初始化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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文件

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

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、
国民技术N32G430开发笔记(12)- IAP升级 Settings区域数据初始化
B、

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

执行make gdsetting 烧录两个setting.bin后分别验证,
结果如下:
B 、国民技术N32G430开发笔记(12)- IAP升级 Settings区域数据初始化
A、
国民技术N32G430开发笔记(12)- IAP升级 Settings区域数据初始化

注意,编译尽量先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文章来源地址https://www.toymoban.com/news/detail-428800.html

#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)
	{
	}
}

到了这里,关于国民技术N32G430开发笔记(12)- IAP升级 Settings区域数据初始化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 国民技术 MCU N32单片机所有系列---JLink添加芯片,方便使用Keil和JFlash

    1.将下图JLink tool adds Nations chip V1.0.12文件中选中的文件复制到自己电脑的JLINK的目录下(JLINK默认的下载路径是C:Program FilesSEGGERJLink   或者  C:Program Files(x86)SEGGERJLink) 2.然后直接把JLink tool adds Nations chip V1.0.12文件中的JLinkDevices.xml复制替换到自己电脑的JLINK的目录下的JLin

    2024年02月03日
    浏览(52)
  • 【国名技术】N32G401单片机驱动配置(STM32系列适用)

    N32G401总体上和STM32F4系列差不多,无论是从芯片资源,还是各种寄存器,都有相通之处,所以N32G401的所有驱动,如果使用smt32的话也可以借鉴使用(修改函数名) 文章代码仅限于参考,如果直接CV是肯定用不了的,源代码链接在最后 PS:所有驱动基于N32G401F7S8-1,一共20个引脚,

    2024年01月19日
    浏览(41)
  • 【N32G457】 基于RT-Thread和N32G457的迷你键盘

    此文为参加RT-Thread与国民技术联手推出N32G457 RT-Thread设计大赛期间作品。 由于疫情影响加上其他各种原因,本应在3月25日结束的比赛在今日终于完成了一个比较完整的作品,无论是否可以参赛,还是希望对大家有所帮助。 先放个图。 机械键盘在最近几年发展迅猛,功能也逐

    2024年02月09日
    浏览(40)
  • 单片机移植freemodbus主机(STM32、GD32、瑞萨、国民技术等)

    从github下载:https://github.com/armink/FreeModbus_Slave-Master-RTT-STM32 无法下载或者下载太慢可以用资源下载,无需积分。freeModbus主机源码下载 示例代码 参考从机代码创建 将FreeModbus主机源代码拷贝到工程中间件-第三方库-freemodbus源码库:即MiddlewaresThird_PartyFreeModbusMaster文件夹中。

    2024年02月11日
    浏览(47)
  • 国民技术N32_MCU ADC如何获取高精度采样数据

    国民技 术 微控制器内置最多四个高级 12 位 ADC    (取决于产品系列) ,具有校准功能,用于提高环境条件   变 化时的 ADC   精度。 在涉及模数转 换的应用中,   ADC   精度会影响整体的系统质量和效率。为了提高此精度,必须了解与 ADC 相 关 的误差以及影响它们的参数。

    2024年02月09日
    浏览(64)
  • 【N32L40X】学习笔记10-外部触发方式计数

    也就是外部时钟源模式2 此模式由 TIMx_SMCTRL .EXCEN 选择等于 1。计数器可以在外部触发输入 ETR 的每个上升沿或下降沿 计数。 极性选择 分频选择 过滤选择 选择外部时钟ETR模式 bsp_time_counter_ETR.h

    2024年02月16日
    浏览(31)
  • STM32G071开发笔记:使用定时器(TRGO功能)触发ADC规则采样以避免低侧电流采样所带来的PWM开关噪声

    目录 背景阐述: 导致问题的原因: 解决方案: 实验方案: 实验验证: 可改进的地方 结尾 RT:笔者在做一个项目的时候遇到了一个因为PWM开关噪声干扰导致ADC采样波动大的问题,经过2天的研究终于想到了一个比较好的办法,这个方法不一定适合所有项目,但和我当前项目

    2024年01月25日
    浏览(59)
  • 【N32L40X】学习笔记08-定时器的基本定时功能-超时功能

    该函数库的目的就是在统一的地方配置,将配置的不同项放置在一个结构体内部 使用一个枚举来定义一个的别名 该库就是基本定时产生超时中断 bsp_time_base.h

    2024年02月16日
    浏览(42)
  • 【N32L40X】学习笔记11-ADC规则通道采集+dma数据传输

    支持 1 个 ADC,支持单端输入和差分输入,最多可测量 16 个外部和 3 个内部源。 支持 12 位、10 位、8 位、6 位分辨率。 ADC 时钟源分为 工作时钟源、采样时钟源和计时时钟源 仅可配置 AHB_CLK 作为 工作时钟源 。 可配置 PLL 作为 采样时钟源 ,最高可到 64MHz,支持分频 1,2,4,6,8,

    2024年02月15日
    浏览(47)
  • 【STC32G12K128开发板】——搭建开发环境

    版权声明:本文为博主原创文章,转载请附上原文出处链接。 今天介绍下STC32G12K128开发板如何搭建开发环境。 表1:需要的工具软件 Keil C251 v5.60安装文件:“…第2部分:开发软件工具 1 - KEIL C251安装软件”目录下的“c251v560”。 ch341ser驱动:“…第2部分:开发软件工具

    2024年01月15日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包