从SeekFree的Gitee开源库建立通用MM32开发模板_seekfree_dl1b.c-程序员宅基地

技术标签: SeekFree  全国大学生智能车竞赛  MM32F3277  MM32-Link  科学-技术-探究  

简 介: 为了便于便捷开发基于MM32的单片机程序,本文从SeekFree的Gitee开源库中构造了初始化模板库。利用Python编写了一键生成工程文件以及一键下载程序。基于该基础可以完成基于MM32-Link的MM32程序的开发。

关键词 MM32F3277MM32-LinkSeekFree

建立模板
目 录
Contents
背景介绍
文件准备
一键生成工程
初始条件
建立工程Python程序
自动下载执行
实验总结

 

§01 立模板


一、背景介绍

1、基础条件

  在 基于IAR上搭建开发MM32的环境 之后,搭建基于MM32-Link的开发环境,这种开发模式好处:

▲ 图1.1.1 测试电路板

▲ 图1.1.1 测试电路板

2、为什么建立通用模板?

  之所以将建立通用模板,是为了:

  • 对于来自于FreeSeek的开发库进行逐一验证、改进;
  • 建立更加符合自己编程习惯的接口单元;
  • 去除其中的SeekFree相关繁琐的注释以及版权声明,形成精简的无版权通用文件;
  • 合并相关的目录,形成相对比较集中的少数目录。

二、文件准备

1、下载链接

  从 SeekFree Gitee的开源库 下载开源库文件;解压缩之后形成IAR可以编程的环境。

  下载之后的对应的目录。

├─Example
│  ├─01-ADC_Demo
│  ├─02-LED_Demo
│  ├─03-PIT_Demo
│  ├─04-Encoder_Demo
│  ├─05-Counter_Demo
│  ├─06-UART_Demo
│  ├─07-Printf_Demo
│  ├─08-GPIO_Interrupt_Demo
│  ├─09-Flash_Demo
│  ├─10-PWM_Demo
│  ├─11-Systick_Demo
│  ├─12-Interrupt_Priority_Set_Demo
│  └─Libraries
│      ├─Device
│      ├─doc
│      ├─seekfree_libraries
│      └─seekfree_peripheral
├─Seekfree_MM32F3277_Opensource_Library
│  ├─Libraries
│  └─Project
│      ├─CODE
│      ├─IAR
│      ├─MDK
│      └─USER
│          ├─inc
│          └─src
├─【封装】核心板整体原理图封装+PCB封装
└─【文档】说明书 芯片手册等
    ├─DAP 下载器使用说明
    └─IAR软件及MDK软件 初学必备知识
        ├─IAR MDK 软件在线调试简介
        └─IAR MDK 软件安装包及安装教程

2、从示例进行改造

  选择其中Examples02-DEMO开始进行模板改造。

(1)原来工程文件要件

  打开原来的Example-LED,观察原来公众的文件夹以及相关的文件。

▲ 图1.2.1 原来工程文件目录及其中的内容

▲ 图1.2.1 原来工程文件目录及其中的内容

(2)建立新的工程文件
Ⅰ.拷贝LED例程

  将原来的示例LED程序拷贝到测试买水色,组成如下目录。

  测试目录:

D:\zhuoqing\window\ARM\IAR\MM32\Test\TestCode

  目录结构:

├─IAR
│  └─program
│      └─settings
├─Libraries
│  ├─Device
│  ├─seekfree_libraries
│  └─seekfree_peripheral
└─USER
    ├─inc
    └─src
Ⅱ.删除原来文件中的各个文件夹

  打开IAR中的MM32F3277,将原来的各个文件夹删除。然后逐步增加所需要的文件。

  通过IAR IDE中的Project/Add Exists Projects。

D:\zhuoqing\window\ARM\IAR\MM32\Test\TestCode\IAR\program\MM32F3277.ewp

(3)增加必要文件夹以及文件
(4)修改工程头文件路径

  设置工程C编译对应的头文件目录。

▲ 图1.2.2 设置工程C编译对应的头文件目录

▲ 图1.2.2 设置工程C编译对应的头文件目录

Ⅰ.原来头文件目录

  原来文件中的头文件的目录为:

$PROJ_DIR$\..\..\CODE
$PROJ_DIR$\..\..\USER\inc
$PROJ_DIR$\..\..\USER\src
$PROJ_DIR$\..\..\..\Libraries\Device\CMSIS\IAR_Core
$PROJ_DIR$\..\..\..\Libraries\Device\MM32F327x\Include
$PROJ_DIR$\..\..\..\Libraries\Device\MM32F327x\HAL_Lib\Inc
$PROJ_DIR$\..\..\..\Libraries\seekfree_libraries
$PROJ_DIR$\..\..\..\Libraries\seekfree_libraries\board
$PROJ_DIR$\..\..\..\Libraries\seekfree_libraries\common
$PROJ_DIR$\..\..\..\Libraries\seekfree_peripheral
Ⅱ.修改后头文件目录
$PROJ_DIR$\..\..\USER\src
$PROJ_DIR$\..\..\Libraries\Device\CMSIS\IAR_Core
$PROJ_DIR$\..\..\Libraries\Device\MM32F327x\Include
$PROJ_DIR$\..\..\Libraries\Device\MM32F327x\HAL_Lib\Inc
$PROJ_DIR$\..\..\Libraries\seekfree_libraries
$PROJ_DIR$\..\..\Libraries\seekfree_libraries\board
$PROJ_DIR$\..\..\Libraries\seekfree_libraries\common
$PROJ_DIR$\..\..\Libraries\seekfree_peripheral
(5)增加输出格式

  在工程文件的配置中,“Output Converter”增加输出文件格式: Intel Extened HEX。

▲ 图1.2.3 增加输出文件格式

▲ 图1.2.3 增加输出文件格式

3、改造后模板

(1)工程目录
├─IAR
│  └─program
│      ├─Debug
│      │  ├─Exe
│      │  ├─List
│      │  └─Obj
│      └─settings
├─Libraries
│  ├─Device
│  │  ├─CMSIS
│  │  │  └─IAR_Core
│  │  └─MM32F327x
│  │      ├─HAL_Lib
│  │      │  ├─Inc
│  │      │  └─Src
│  │      ├─Include
│  │      └─Source
│  │          └─IAR_StartAsm
│  ├─seekfree_libraries
│  │  ├─board
│  │  └─common
│  └─seekfree_peripheral
└─USER
    └─src
(2)工程结构

▲ 图1.2.4 改造工程模板的结构

▲ 图1.2.4 改造工程模板的结构

(3)测试程序
#define MAIN_GLOBALS        1              // Define the global variables
#include "MAIN.H"

#include "headfile.h"

#define LED1                B2

int main(void) {
    
    unsigned int nCount;
    
    board_init(true); 

    OUT(LED1);
    
    nCount = 1;
    while(1) {
    
        if(++nCount & 0x100) ON(LED1);
        else OFF(LED1);
        
        systick_delay_ms(1);
    }
}
(4)运行效果

▲ 图1.2.5  运行效果

▲ 图1.2.5 运行效果

 

§02 键生成工程


一、初始条件

  建立的MM32F3277 的初始化的工程文件存储在:

D:\zhuoqing\window\ARM\IAR\MM32\UserCode\MM32F3277

  准备建立的工程文件所在目录 Clipboard:

比如:

D:\zhuoqing\window\ARM\IAR\MM32\Test\Test1

二、建立工程Python程序

1、一键生成工程命令

(1)拷贝工程目录

  在建立工程所在的目录中,将目录copy到Windows的Clipboard。

(2)运行MM32PRG程序
#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# MM32PRG.PY                   -- by Dr. ZhuoQing 2021-11-03
#
#   Usage: MM32PRG filename         # Program filename.HEX. Default filename=MM32F3277.HEX
#                  >project MM32F3277   # Make the project of MM32F3277
#                                   M MM32F3277 can be replace by other type of MM32
#
# Note:
#============================================================
from head import *
import shutil
import pyautogui
#------------------------------------------------------------
WRITE_TIME  = 1
POWER_RELAY = 2                     # 1:relay1, relay2
#------------------------------------------------------------
MM32_TITLE = 'MM32-LINK'
offset_x = 803
offset_y = 175
#------------------------------------------------------------
filename = 'MM32F3277.HEX'
dirstr = clipboard.paste()
MM32UserDir =r'D:\zhuoqing\window\ARM\IAR\MM32\UserCode'
MM32Project = "MM32F3277"
if len(sys.argv) > 1:
    if sys.argv[1][0] == '>':
        printf(dirstr)
        if not os.path.isdir(dirstr):
            printf("Error project directory. \a")
            exit()
        newdir = dirstr + '\\' + sys.argv[1][1:]
        printf("Make the project directory:%s"%newdir)
        if os.path.isdir(newdir):
            printf("ERROR:%s has already been existed!\a"%newdir)
            exit()
        if len(sys.argv) > 2:
            MM32Project = sys.argv[2]
        copydir = MM32UserDir + '\\' + MM32Project
        if not os.path.isdir(copydir):
            printf("ERROR:Source dir is not existed !\a")
            exit()
#        os.mkdir(newdir)
        shutil.copytree(copydir, newdir)
        printf("Create the %s project : %s .\a"%(MM32Project, os.path.basename(newdir)))
        exit()
    #--------------------------------------------------------
    filename = sys.argv[1]
    if filename.find('.HEX') < 0:
        filename = filename + '.HEX'
#------------------------------------------------------------
printf(filename)
from tsmodule.tshardware    import *
#------------------------------------------------------------
#if not os.path.isfile(filename):
#    printf("ERROR:Can not find file :%s\a"%filename)
#    exit()
#------------------------------------------------------------
windowrect = tspgetwindowrect(MM32_TITLE)
click_x = windowrect[0] + offset_x
click_y = windowrect[1] + offset_y
#------------------------------------------------------------
def mm32connect():
    global windowrect
    pyautogui.click(windowrect[0] + 202, windowrect[1] + 34)
    time.sleep(.2)
    pyautogui.click(windowrect[0] + 180, windowrect[1] + 50)
    time.sleep(.2)
mm32connect()
#------------------------------------------------------------
LOAD_FILE = 'Load form file'
pyautogui.click(click_x, click_y)
for _ in range(20):
    time.sleep(.1)
    rect = tspgetwindowrect(LOAD_FILE)
    if sum(rect) != 0:
        break
#------------------------------------------------------------
if sum(rect) == 0:
    printf("No load file dialog open !\a")
    exit()
#------------------------------------------------------------
clipboard.copy(filename)
tspsendwindowkey(LOAD_FILE, "n", alt=1, noreturn=1)
tspsendwindowkey(LOAD_FILE, "v", control=1, noreturn=1)
tspsendwindowkey(LOAD_FILE, "o", alt=1, noreturn=1)
time.sleep(.5)
#------------------------------------------------------------
tspsendwindowkey(MM32_TITLE, "c", alt=1, noreturn=1)
time.sleep(.5)
wm_offsetx = 430
wm_offsety = 503
click_x = windowrect[0] + wm_offsetx
click_y = windowrect[1] + wm_offsety
pyautogui.click(click_x, click_y)
time.sleep(WRITE_TIME)
#------------------------------------------------------------
mm32connect()
time.sleep(.2)
if POWER_RELAY == 1:
    relay1on()
    relay1on()
    time.sleep(.5)
    relay1off()
    relay1off()
else:
    relay2on()
    relay2on()
    time.sleep(.5)
    relay2off()
    relay2off()
#------------------------------------------------------------
tspfocuswindow("TEASOFT:1")
#------------------------------------------------------------
#        END OF FILE : MM32PRG.PY
#============================================================
(3)编译运行

▲ 图2.2.1  编译生成最终程序

▲ 图2.2.1 编译生成最终程序

二、自动下载执行

▲ 图2.3.1  自动下载执行

▲ 图2.3.1 自动下载执行

 

验总结 ※


  了便于便捷开发基于MM32的单片机程序,本文从SeekFree的Gitee开源库中构造了初始化模板库。利用Python编写了一键生成工程文件以及一键下载程序。基于该基础可以完成基于MM32-Link的MM32程序的开发。


■ 相关文献链接:

● 相关图表链接:

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zhuoqingjoking97298/article/details/121330682

智能推荐

Ceph运维手册!免费下载_ceph 维护命令 pdf下载-程序员宅基地

文章浏览阅读198次。Ceph是当前非常流行的开源分布式存储系统,具有高扩展性、高性能、高可靠性等优点,作为主流的分布式存储技术之一,ceph越来越成为运维工程师技能树的必备要件。今天分享的ceph运维手册可谓含金量十足,汇总了Ceph在使用中常见的运维和操作问题,主要用于指导运维人员的相关工作。存储方面的新手,在对Ceph有了基础了解之后,也可以通过本手册进一步深入Ceph 的使用和运维。【领取方式戳这里】由于内容过多,在此只以截图展示部分内容,详细完整版的文档免费领取方式请见文末。目录详情:资料整理自网络_ceph 维护命令 pdf下载

GitHub 标星 11000+,阿里开源微服务如何连续 10 年扛住双十一大促_github 标星 11000 ,阿里开源的微服务组件如何连续 10 年扛住双十一大促?-程序员宅基地

文章浏览阅读1.7k次。云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来!作者 | 宿何,阿里云高级开发工程师责编 | 唐小引封图 | CSDN 下载自东方 IC出品 | CSDN(ID:CSDNnews)疫情期间,“卡”成了很多人线上体验的关键词。线上预约购买口罩时,突然不能付款了;在线选课,被提示请求过多,系统无法响应;在线办公/教学时,图像或声音..._github 标星 11000 ,阿里开源的微服务组件如何连续 10 年扛住双十一大促?

深源恒际上线二代个人信用报告OCR识别服务-程序员宅基地

文章浏览阅读1.1k次。1月中旬,央行征信中心启动了二代征信系统切换上线工作,开始面向社会公众和金融机构开放二代格式信用报告查询服务。随后,深源恒际及时跟进信用报告OCR识别产品的升级工作。目前产品迭代已完成,深源恒际将于本周内上线二代个人信用报告OCR识别服务。信用报告OCR识别产品主要面向信贷服务机构,提供基于个人信用报告的信息自动化识别与提取服务。基于OCR识别技术结合专项训练方法构建的信用报告识别专用模型,自...

(程序员必备技能)Markdown语法_markdown语法 程序员-程序员宅基地

文章浏览阅读3k次。斜体和粗体输入:*斜体*或_斜体_**粗体*****加粗斜体***~~删除线~~显示效果:斜体或_斜体_粗体加粗斜体删除线分级标题输入: 这是一个一级标题 ============================ 这是一个二级标题 -------------------------------------------------- #..._markdown语法 程序员

SVG 中的基础图形(rect , line ,circle 等)以及在 D3.js 中的应用_cor-rect直线对应-程序员宅基地

文章浏览阅读4.1k次。SVG 中的基础图形(rect , line ,circle 等)以及在 D3.js 中的应用文章目录SVG 中的基础图形(rect , line ,circle 等)以及在 D3.js 中的应用矩形 - rect直线 - line圆形 - circle椭圆 - ellipse在 D3.js 中,根据要展示的数据,我们挑选合适的 svg 中的基础图形,然后进行一系列的设置等,使其达到我们的要求..._cor-rect直线对应

栈的运用(中缀表达式转换为后缀表达式,并对后缀表达式求值。)_利用栈,把中缀表达式转化未后缀表达式,对后缀表达式求值-程序员宅基地

文章浏览阅读3k次,点赞3次,收藏7次。中缀表达式转换成后缀表达式的基本思想: 顺序扫描中缀表达式: 若读入的是一个运算分量,则输出; 若读入的是一个左括号,则入栈,栈中左括号的优先级被视为比任何操作符都低。 若读入的是一个操作符(如 + 或 -),其级别比栈顶元素级别高,则入栈,否则,栈顶元素出栈,输出。 若读入的是右括号,栈中元素出栈,输出,直到碰到左括号,左括号出栈,但不输_利用栈,把中缀表达式转化未后缀表达式,对后缀表达式求值

随便推点

如何生成ROM的coe文件_rom存coe-程序员宅基地

文章浏览阅读2.8k次,点赞4次,收藏15次。在生成ROM时需要提供coe文件,如下图所示。这个coe文件本质上就是Memory的初始化文件,Xilinx对其有具体的格式要求。coe文件格式coe文件格式要求如下图所示,其中前两行是固定的。其中第一行定义了Radix,可以是2、10或16,意味着第2行定义的数据向量内容可以是二进制、十进制或十六进制。这里需要说明的是定义的数据向量各个数据之间可以是空格,也可以是逗号(但此时最后一个数据要以分号结尾)或者回车换行符。生成coe文件Matlab作为主流的算法开..._rom存coe

oca认证_OCA第2部分中的Java难题-程序员宅基地

文章浏览阅读145次。oca认证 欢迎使用OCA的Java Puzzlers的第二部分。 在这一部分中,我们将看到一个有趣的案例,涉及Java 7附带的数字文字中的下划线分隔符。 在下面的类中,您可以在十进制文字中看到分隔符下划线。 还请注意,该类现在可以正常编译。 八进制是八进制表示形式,二进制是二进制,我敢肯定你不会猜十六进制。 public class Puzzler { public stati..._java认证oca

华为鸿蒙家电物联网,华为“鸿蒙”来了:本身是为了做物联网,将比安卓速度快60%...-程序员宅基地

文章浏览阅读70次。8月9日,华为2019年开发者大会将于开幕。今年的华为开发者大会,共分为主题演讲、技术论坛和Codelabs。其中8月9日为主题演讲、10日和11日则是开发者活动。目前官方也正式放出了本次开发者大会的邀请函,据悉这次华为会将重点集中在5G落地、物联网、AI等领域,预计有200+专题分享、1500位合作伙伴、5000名全球开发者。“最快今年秋天,最晚明年春天,华为自研操作系统即将面世”,一个月前,面..._华为电视物联网

华为 1+X 网络系统运维与建设中级实操模拟题_华为1+x网络系统建设与运维中级模拟题在哪做-程序员宅基地

文章浏览阅读6.1k次,点赞16次,收藏85次。华为 1+X 网络系统运维与建设中级实操模拟题实验报告_华为1+x网络系统建设与运维中级模拟题在哪做

阿里云云盾 · 云防火墙获WitAwards2017年度创新产品大奖,领奖词太燃!_阿里云 云防火墙 正式上线 2017-程序员宅基地

文章浏览阅读521次。点击有惊喜12月14日,在Freebuf 互联网安全创新大会上,阿里云云盾· 云防火墙捧得WitAwards2017互联网安全评选“年度创新产品”大奖。这已是阿里云安全团队及云盾产品,连续三年获得WitAwards奖项。阿里云云盾· 云防火墙是国内首款基于可视化的微隔离产品。评选委员会认为:阿里云云盾 · 云防火墙可以让企业在零配置的情况下,自动实现业务_阿里云 云防火墙 正式上线 2017

linux主机下扩展xp虚拟机的磁盘空间_如何给linux中的winxp增加存储空间-程序员宅基地

文章浏览阅读647次。1.使用VBoxManage modifyhd命令设置vdi文件的大小,例如,设置vdi文件大小为32G VBoxManage modifyhd /home/yunxian_19/VirtualBox\ VMs/winXP/winXP.vdi --resize 32768命令行输出 0%...10%...20%...30%...40%...50%...60%...70%...80%..._如何给linux中的winxp增加存储空间

推荐文章

热门文章

相关标签