Mcu StudioMcu Studio
指南
扩展
开发者
API
更新
  • 简体中文
  • English
指南
扩展
开发者
API
更新
  • 简体中文
  • English
    • 概述
    • 芯片描述
    • 新建芯片
    • 导入芯片
    • 导出芯片
    • 引脚配置
    • 外设配置
    • 扩展
    • 工程
    • 开发常见问题
    • 高效开发

外设配置

配置芯片外设树

芯片外设配置是芯片开发过程中的关键环节。在 McuStudio 中,通过直观的界面和简单的操作,您可以快速完成外设的配置工作。

  1. 打开外设配置界面
  • 在芯片配置操作页面,芯片视图的左侧,就是我们的 外设配置 区域了

  • 右键点击 外设配置 ,可以选择 添加新的组或外设节点

    根节点添加外设

  1. 管理外设节点
  • 添加的组或外设节点默认名称为 node ,您可以右键进行 重命名、 删除 或 添加子节点

  • 如果是外设节点,还支持 复制 功能,方便您快速创建相似的外设配置

    外设的操作

配置芯片外设属性

  1. 配置外设属性
  • 配置节点属性

    1. 在外设树中选中需要配置的外设节点
    2. 页面右侧将自动展示该外设的节点属性配置选项

    外设节点属性

    • 节点属性
      • 名称 : 外设节点的名称
      • 默认使能 : 设置外设默认使能状态
      • 帮助文档 : 该外设的在线帮助文档名称
      • 文件名 : 该外设生成的文件名(文件名不能为空)

    外设节点编辑界面

    • 函数属性 在该面板下,可以添加函数,主要有两个函数
      • init : 外设初始化函数,用来生成外设初始化代码(该函数必须实现)
      • enable : 外设使能函数,当外设使能状态发生变化时,会调用该函数(该函数可选)

    外设节点-函数属性

    • 扩展文件

    • 自定义面板

    自定义面板用来编辑用户添加的外设面板

    外设节点-自定义面板

  • 创建并配置外设面板

    1. 选中外设节点后,开启 使能,点击页面上的 + 图标,添加新的配置面板
    2. 右击面板可 重命名 或 删除 ,支持根据功能需求添加多个面板,并通过拖动调整位置

    外设面板的基本操作

  • 编辑面板内容

    1. 添加外设面板后,在 节点属性 后会自动新增一个 自定义面板 tab。选中面板后,切换至 自定义面板 tab,在右侧的自定义区域中点击 新增 ,添加所需的配置组件

    自定义面板新增

    1. 根据外设功能填写详细信息,例如USART的波特率设置等
    2. 重复此步骤,直至完成所有必要的配置

    自定义面板新增完成

    1. 配置NVIC中断(示例)

    选中相应的NVIC节点,在配置面板中添加并设置中断优先级、使能状态等参数。

    NVIC面板

  1. 配置外设属性

    配置完成后,您的外设将按照设定的参数工作。通过 McuStudio 的直观界面(选择、输入等操作),您可以轻松管理和调整外设设置,提高开发效率

    快速配置外设案例

模板使用

McuStudio 提供了丰富的外设模板,您可以根据需要选择合适的模板进行快速配置。

点击 外设模板图标

外设模板图标

在弹出的外设模板列表中,选择合适的模板,点击 确定

外设模板选择

模板添加完成,也可以在模板的基础上修改

外设模板添加完成

编写外设初始化脚本

外设初始化脚本是实现外设功能的核心部分,McuStudio脚本采用javaScript编写,支持丰富的API,可以轻松实现外设的初始化、配置、中断处理等功能。

初始化脚本编写的好坏,将直接决定生成工程代码质量的高低。

提示

脚本编辑器增加了AI智能补全功能,可以大大提高脚本编写效率。

点击 函数属性 ,点击 init 函数 的 编辑 按钮。

如果没init函数,则点击 新增 按钮,创建 init 函数。

外设初始化编辑按键

点击后会打开 脚本编辑界面

外设初始化脚本编辑界面

脚本会根据外设面板的界面自动生成部分相关的代码,主要是获取界面中参数的属性。

外设初始化脚本接口

McuStudio 提供了丰富的外设初始化脚本接口,可以轻松实现外设的初始化、配置、中断处理等功能。

getTabItemObject

获取外设面表格中元素

元素是个对象,一般会包含label和value两个属性。

label是元素的标签,在界面中真实显示的内容,可以生成代码的注释

value是元素的值,在界面中不展示,用来生成代码的值

示例

获取 Param 表格中 波特率 的属性

通过脚本接口获取波特率

const _波特率 = getTabItemObject(that,"Param","波特率");

getTabItemValue

获取外设面表格中元素的值

示例

获取 Param 表格中 波特率 的值(和getTabItemObject的区别在于,getTabItemValue只获取value值)

const _波特率 = getTabItemValue(that,"Param","波特率");

addHeadInclude

在头文件中添加 include

示例

在外设的头文件中添加 #include "device.h"

peripheralFile.addHeadInclude(`#include "device.h"`);

addDefaultInclude

在源文件中添加 include

示例

在外设的源文件中添加 #include <stdint.h>

peripheralFile.addDefaultInclude(`#include <stdint.h>`);

addExternFunction

在头文件中添加 函数声明

示例

在外设的头文件中添加 void Studio_UART1_Init(void); 函数声明

peripheralFile.addExternFunction('void Studio_UART1_Init(void);');

addPeripheralInit

在main函数中调用外设初始化函数

示例

在main函数中调用 Studio_UART1_Init();

peripheralFile.addPeripheralInit(`Studio_UART1_Init();`);

addFunction

在外设源文件中添加函数

peripheralFile.addFunction(函数名,函数返回类型,[函数参数列表],函数体);

示例

在外设源文件中添加函数 Studio_UART1_Init

let code_list = [];

code_list.push(UART_InitStructure.BaudRate = ${_波特率.value};//${_波特率.label});
code_list.push(UART_InitStructure.WordLength = ${_数据位.value};//${_数据位.label});
code_list.push(UART_InitStructure.StopBits = ${_停止位.value};//${_停止位.label});
code_list.push(UART_InitStructure.Parity = ${_校验位.value};//${_校验位.label});
code_list.push(UART_InitStructure.HWFlowControl = ${_硬件流.value};//${_硬件流.label});
code_list.push(UART_InitStructure.Mode = ${_模式.value};//${_模式.label});
code_list.push(UART_Init(UART1, &UART_InitStructure););
code_list.push(UART_Cmd(UART1, ENABLE););
code_list.push(``);

peripheralFile.addFunction('Studio_UART1_Init','void',['void'],code_list);

以上代码会在源文件中生成下面的代码

void Studio_UART1_Init(void)
{
   UART_InitStructure.BaudRate = ${_波特率.value};//${_波特率.label}
   UART_InitStructure.WordLength = ${_数据位.value};//${_数据位.label}
   UART_InitStructure.StopBits = ${_停止位.value};//${_停止位.label}
   UART_InitStructure.Parity = ${_校验位.value};//${_校验位.label}
   UART_InitStructure.HWFlowControl = ${_硬件流.value};//${_硬件流.label}
   UART_InitStructure.Mode = ${_模式.value};//${_模式.label}
   UART_Init(UART1, &UART_InitStructure);
   UART_Cmd(UART1, ENABLE);
}

其中的 ${xxx.value} 会替换为对应的值,${xxx.label} 会替换为对应的label

delFunction

删除函数

peripheralFile.delFunction(函数名);

示例

删除 Studio_UART1_Init 函数

peripheralFile.delFunction(`Studio_UART1_Init`);

initFunctionAnnotaion

添加函数注释

peripheralFile.initFunctionAnnotaion(函数名,注释);

示例

给 Studio_UART1_Init 函数添加注释

let code_list = [];

code_list.push(/*)
code_list.push( *****************************************************)
code_list.push( * @brief 串口1 初始化函数)
code_list.push( *****************************************************)
code_list.push( */)

peripheralFile.initFunctionAnnotaion('Studio_UART1_Init',code_list);

以上代码会在Studio_UART1_Init函数上方生成注释

/*
*****************************************************
*@brief 串口1 初始化函数
*****************************************************
*/
void Studio_UART1_Init(void)
{
   UART_InitStructure.BaudRate = ${_波特率.value};//${_波特率.label}
   UART_InitStructure.WordLength = ${_数据位.value};//${_数据位.label}
   UART_InitStructure.StopBits = ${_停止位.value};//${_停止位.label}
   UART_InitStructure.Parity = ${_校验位.value};//${_校验位.label}
   UART_InitStructure.HWFlowControl = ${_硬件流.value};//${_硬件流.label}
   UART_InitStructure.Mode = ${_模式.value};//${_模式.label}
   UART_Init(UART1, &UART_InitStructure);
   UART_Cmd(UART1, ENABLE);
}

addVariable

添加变量

peripheralFile.addVariable(变量)

示例

在外设源文件中添加 uint8_t 类型的变量 val

peripheralFile.addVariable(`uint8_t val;`)

delVariable

删除变量

peripheralFile.delVariable(变量)

addPrivateTypedef

在外设源文件中添加类型定义

peripheralFile.addPrivateTypedef(类型定义)

示例

let type_def = ` typedef struct { uint8_t val; } my_struct_t; `

peripheralFile.addPrivateTypedef(type_def)

以上代码生成如下结构体

typedef struct {
  uint8_t val;
} my_struct_t;

delPrivateTypedef

删除类型定义

peripheralFile.delPrivateTypedef(类型定义)

addPrivateDefine

添加宏定义

peripheralFile.addPrivateDefine(宏)

示例

在外设源文件中添加 #define PI 3.14

peripheralFile.addPrivateDefine(`#define PI 3.14`)

delPrivateDefine

删除宏定义

peripheralFile.delPrivateDefine(宏)

ShowNotification

消息提示

ShowNotification({title:"标题",message:"消息内容",type:"类型"})

示例

ShowNotification({title:"警告", message:"Hello World", type:"warning"})

警告

ShowNotification({title:"信息", message:"Hello World", type:"info"})

信息

ShowNotification({title:"错误", message:"Hello World", type:"error"})

错误

ShowNotification({title:"成功", message:"Hello World", type:"success"})

成功

proxyEvent.emit_custom

发送自定义事件

proxyEvent.emit_custom(事件ID,{参数})

Prev
引脚配置
Next
扩展