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 参考
以下 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 位整型存放被开方数与返回的根数。
int32_t radicand = 5;
int32_t root;
换用其他被开方数时只改初值即可,返回值仍为无符号整数。
2. 打开 SQRT 模块的 AHB 时钟。 SQRT 挂在 AHB 总线上,访问其寄存器前必须先使能该时钟。
/* ENABLE HDIV moudel clock */
RCC_EnableAHBPeriphClk(RCC_AHB_PERIPH_SQRT,ENABLE);
代码注释写作 HDIV 但实际打开的是 SQRT 时钟,移植时以宏 RCC_AHB_PERIPH_SQRT 为准。
3. 配置总线保持、自动启动并使能模块。 先使能计算期间的总线保持,再使能自动启动,最后打开模块。
/* Hold bus during computation */
SQRT_ConfigBusHold(ENABLE);
/* Enable auto start computation */
SQRT_ConfigAutoStart(ENABLE);
/* Enable moudel */
SQRT_Enable(ENABLE);
若要改为单次启动方式,则关闭自动启动并改用单次启动函数触发计算。
4. 写入被开方数并读回根数。 自动启动使能后写入被开方数即开始计算,配合总线保持可直接读根数。
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 相关条目。