外设配置
配置芯片外设树
芯片外设配置是芯片开发过程中的关键环节。在 McuStudio 中,通过直观的界面和简单的操作,您可以快速完成外设的配置工作。
- 打开外设配置界面
在芯片配置操作页面,芯片视图的左侧,就是我们的
外设配置
区域了右键点击
外设配置
,可以选择 添加新的组或外设节点
- 管理外设节点
添加的组或外设节点默认名称为
node
,您可以右键进行 重命名、 删除 或 添加子节点如果是外设节点,还支持 复制 功能,方便您快速创建相似的外设配置
配置芯片外设属性
- 配置外设属性
配置节点属性
- 在外设树中选中需要配置的外设节点
- 页面右侧将自动展示该外设的节点属性配置选项
- 节点属性
- 名称 : 外设节点的名称
- 默认使能 : 设置外设默认使能状态
- 帮助文档 : 该外设的在线帮助文档名称
- 文件名 : 该外设生成的文件名(文件名不能为空)
- 函数属性 在该面板下,可以添加函数,主要有两个函数
- init : 外设初始化函数,用来生成外设初始化代码(该函数必须实现)
- enable : 外设使能函数,当外设使能状态发生变化时,会调用该函数(该函数可选)
扩展文件
自定义面板
自定义面板用来编辑用户添加的外设面板
创建并配置外设面板
- 选中外设节点后,开启
使能
,点击页面上的+
图标,添加新的配置面板 - 右击面板可 重命名 或 删除 ,支持根据功能需求添加多个面板,并通过拖动调整位置
- 选中外设节点后,开启
编辑面板内容
- 添加外设面板后,在
节点属性
后会自动新增一个自定义面板
tab。选中面板后,切换至自定义面板
tab,在右侧的自定义区域中点击新增
,添加所需的配置组件
- 根据外设功能填写详细信息,例如USART的波特率设置等
- 重复此步骤,直至完成所有必要的配置
- 配置NVIC中断(示例)
选中相应的NVIC节点,在配置面板中添加并设置中断优先级、使能状态等参数。
- 添加外设面板后,在
配置外设属性
配置完成后,您的外设将按照设定的参数工作。通过 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,{参数})