5.17 SQRT 使用说明

本章说明 N32G033 标准外设库中 SQRT 驱动的文件组成、8 个公开函数,以及 SQRT_AutoStart 1 个示例。开方器的位宽限制、计算时序与总线保持原理请配合用户手册的“SQRT 开平方根器”章节阅读,芯片已知问题以勘误手册为准。

5.17.1 相关文件

相对路径 作用
firmware/n32g033_std_periph_driver/inc/n32g033_sqrt.h 定义开方数位宽等宏,并把 8 个公开函数按模块配置、数据读写、启动与使能三个声明区段分组
firmware/n32g033_std_periph_driver/src/n32g033_sqrt.c 实现上述 8 个函数:总线保持与自动启动配置、计算状态查询、被开方数与根数的读写、单次启动与模块使能
projects/n32g033_EVAL/examples/SQRT/ SQRT 示例根目录,含 SQRT_AutoStart 1 个示例
projects/n32g033_EVAL/examples/SQRT/SQRT_AutoStart/ 该示例的工程目录组成:MDK-ARM/、EWARM/、inc/、src/、readme.txt
projects/n32g033_EVAL/bsp/inc/、projects/n32g033_EVAL/bsp/src/ 板级公共文件,示例通过 log.h 使用串口日志

5.17.2 API 参考

搜索 API共 8 个函数

以下 8 个公开函数按 n32g033_sqrt.h 的声明顺序分为 3 组;每个条目给出功能摘要与 n32g033_sqrt.c 中该函数正上方的注释原文。

模块配置与状态

SQRT_ConfigBusHold、SQRT_ConfigAutoStart、SQRT_GetFlagStatus

数据读写

SQRT_SetRADICAND_Data、SQRT_GetRADICAND_Data、SQRT_GetROOT_Data

启动与使能

SQRT_ConfigSingleStart、SQRT_Enable

void SQRT_ConfigBusHold(FunctionalState Cmd)使能或关闭 SQRT 模块计算期间读取结果时的总线保持。
源码注释
name    SQRT_ConfigBusHold.
fun     Enable or disable the bus hold if read the result when calculating of SQRT module.
param   Cmd
          - ENABLE
          - DISABLE
return  none
void SQRT_ConfigAutoStart(FunctionalState Cmd)使能或关闭 SQRT 计算的自动启动。
源码注释
name    SQRT_ConfigAutoStart.
fun     Enable or disable the auto start of SQRT calculating.
param   Cmd
          - ENABLE
          - DISABLE
return  none
FlagStatus SQRT_GetFlagStatus(void)检查 SQRT 计算是否完成。
源码注释
name    SQRT_GetFlagStatus.
fun     Check whether the SQRT calculation is finished or not.
param   None
return  The SQRT calculation status (SET or RESET).
void SQRT_SetRADICAND_Data(uint32_t data)设置开方计算的被开方数。
源码注释
name    SQRT_SetRADICAND_Data.
fun     Set the radicand of square root calculation.
param   data
          - 32 bit unsigned interger data
return  none.
uint32_t SQRT_GetRADICAND_Data(void)获取开方计算的被开方数。
源码注释
name    SQRT_GetRADICAND_Data.
fun     Get the radicand of square root calculation.
param   none
return  32 bit unsigned interger data.
uint32_t SQRT_GetROOT_Data(void)获取被开方数的平方根。
源码注释
name    SQRT_GetROOT_Data.
fun     Get the square root of radicand.
param   none
return  32 bit unsigned interger data.
void SQRT_ConfigSingleStart(void)启动一次 SQRT 计算。
源码注释
name    SQRT_Start.
fun     Start the SQRT Calculation.
param   none
return  none.

使用提示: 该函数在 n32g033_sqrt.h 第 71 行声明;源码注释块中的 name 写作 SQRT_Start.,与函数名 SQRT_ConfigSingleStart 不一致,注释原文照抄未改。

void SQRT_Enable(FunctionalState Cmd)使能或关闭 SQRT 模块。
源码注释
name    SQRT_Enable.
fun     Enable or Disable the SQRT module.
param   Cmd
          - ENABLE
          - DISABLE
return  none.

5.17.3 Demo 示例说明

本节说明 SQRT 的 1 个示例:SQRT_AutoStart 使能自动启动后写入被开方数 5,随即读回开方结果并由串口打印。

5.17.3.1 SQRT_AutoStart 自动启动开方

工程目录: projects/n32g033_EVAL/examples/SQRT/SQRT_AutoStart/

使能开方模块的 AHB 时钟→使能计算期间总线保持→使能自动启动并打开模块→写入被开方数触发计算→读回根数并由串口打印

项目 源码解读
功能 打开 SQRT 模块并启用自动启动,写入被开方数 5 后自动完成开方,读回根数 2 并由串口打印。
源码组成 src/main.c 含 main;
inc/main.h 给出外设头文件;
readme.txt 给出配置与测试步骤;
工程文件在 MDK-ARM/ 与 EWARM/。
关键配置 时钟:系统时钟 64 MHz;
总线保持:SQRT_ConfigBusHold(ENABLE);
自动启动:SQRT_ConfigAutoStart(ENABLE);
打印口:PA9,波特率 115200。
程序与数据路径 main → log_init → RCC_EnableAHBPeriphClk 打开 SQRT 时钟 → SQRT_ConfigBusHold 使能总线保持 → SQRT_ConfigAutoStart 使能自动启动 → SQRT_Enable 打开模块 → SQRT_SetRADICAND_Data 写入 5 触发计算 → SQRT_GetROOT_Data 读回根数 → 串口打印。
主要 API SQRT_ConfigBusHold、SQRT_ConfigAutoStart、SQRT_Enable、SQRT_SetRADICAND_Data、SQRT_GetROOT_Data
验证方法 编译下载复位运行后,串口打印 5 square root is equal to 2。
使用提示 开发环境为 KEIL MDK-ARM V5.34.0.0 或 IAR EWARM 8.50.1,硬件基于评估板 N32G033K8Q7-1_STB V1.0;
使能总线保持后可在计算期间直接读根数寄存器,无需查询完成标志。
核心代码解读与移植

示例配置好总线保持与自动启动,打开模块后写入被开方数即触发一次开方,读回根数并打印。

数据路径: RCC_EnableAHBPeriphClk 开 SQRT 时钟 → SQRT_ConfigBusHold 使能总线保持 → SQRT_ConfigAutoStart 使能自动启动 → SQRT_Enable 打开模块 → SQRT_SetRADICAND_Data 写被开方数触发计算 → SQRT_GetROOT_Data 读根数 → log_info 打印

1. 声明被开方数与根数变量。 用 32 位整型存放被开方数与返回的根数。

src/main.csrc/main.c · main
    int32_t radicand = 5;
    int32_t root;

换用其他被开方数时只改初值即可,返回值仍为无符号整数。

2. 打开 SQRT 模块的 AHB 时钟。 SQRT 挂在 AHB 总线上,访问其寄存器前必须先使能该时钟。

src/main.csrc/main.c · main
    /* ENABLE HDIV moudel clock */
    RCC_EnableAHBPeriphClk(RCC_AHB_PERIPH_SQRT,ENABLE);

代码注释写作 HDIV 但实际打开的是 SQRT 时钟,移植时以宏 RCC_AHB_PERIPH_SQRT 为准。

3. 配置总线保持、自动启动并使能模块。 先使能计算期间的总线保持,再使能自动启动,最后打开模块。

src/main.csrc/main.c · main
    /* Hold bus during computation */
    SQRT_ConfigBusHold(ENABLE);
    /* Enable auto start computation */
    SQRT_ConfigAutoStart(ENABLE);
    /* Enable moudel */
    SQRT_Enable(ENABLE);

若要改为单次启动方式,则关闭自动启动并改用单次启动函数触发计算。

4. 写入被开方数并读回根数。 自动启动使能后写入被开方数即开始计算,配合总线保持可直接读根数。

src/main.csrc/main.c · main
    log_info("SQRT test start\r\n");
    SQRT_SetRADICAND_Data(radicand);
    root = SQRT_GetROOT_Data();
    log_info("5 square root is equal to %d\r\n" ,root);

未使能总线保持时,需先查询计算完成标志再读根数;被开方数为 32 位无符号数,结果为 16 位根。

对应源码: src/main.c、firmware/n32g033_std_periph_driver/inc/n32g033_sqrt.h

5.17.4 注意与排障

场景 检查与建议 来源
计算位宽 用户手册 SQRT 章写明模块只支持 32 位操作,输入为 32 位无符号被开方整数,输出为 16 位开方根;
被开方数超出范围时结果无意义。
用户手册
计算时序 用户手册 SQRT 章写明一次无符号整数开方运算需要 8 个时钟周期;
连续运算时要保证上一次结果已读出。
用户手册
首次使用前的空闲检查 用户手册 SQRT 章写明首次使用外的场景应先确认状态寄存器的完成标志为 1,即模块处于空闲状态;
否则不应发起新的计算。
用户手册
总线保持与结果读取 用户手册 SQRT 章写明使能总线保持后无需查询完成标志即可读结果,未使能时需查询完成标志;
结果寄存器可立即读取。
用户手册
自动启动与单次启动 用户手册 SQRT 章写明自动启动使能后每写入一次被开方数即开始一次运算,否则由单次启动位触发;
配置改变需从初始化步骤重新开始,配置不变可直接写被开方数。
用户手册

勘误手册 V1.0.0(2025.9.25)针对 A 版芯片,未列出 SQRT 相关条目。

国民技术开发套件文档中心

按芯片系列在线查阅国民技术 MCU 开发套件的芯片资料、SDK、驱动 API 与 Demo 示例说明。

© 2026 国民技术股份有限公司 版权所有粤ICP备11069485号本站使用不含 Cookie 的匿名访问统计