【官方原创】LAT1703 STM32C5 LL Cordic例程

1. 背景

STM32C5已发布,受到客户普遍关注。由于产品刚刚上市不久,生态较其他系列欠完善,有些例程在STM32CubeC5中还不可用,譬如LL cordic。


2. LL cordic例程移植

这里以STM32CubeG4里的例程为源,移植到NUCLEO-C5A3ZG平台。

2.1. 测试环境

1、硬件平台:NUCLEO-C5A3ZG

2、IDE : IAR 9.70.4

3、例程:STM32Cube_FW_G4_V1.5.0\Projects\NUCLEOG474RE\Examples_LL\CORDIC\CORDIC_CosSin\Src

2.2. 移植步骤

1、以STM32Cube_SW_Package_C5_2.0.0-alpha.4.0\examples\ll\gpio工程为基础,复制并重新命名为为STM32Cube_SW_Package_C5_2.0.0-alpha.4.0\examples\ll\gpio-cordic,使用IAR打开工程GPIO。
2、拷贝stm32cubeg4 ll cordic例程中的源文件main.c相关宏定义至当前工程main.c中,即下面代码:

复制代码
/* Pass/Fail Status */ #define PASS 0 #define FAIL 1 
/* Reference values in Q1.31 format */ #define ANGLE_CORDIC (int32_t)0x10000000 /* pi/8 in CORDIC input angle mapping */ #define ANGLE_LIB (int32_t)0x08000000 /* pi/8 in arm math lib input angle mapping */ #define MODULUS (int32_t)0x7FFFFFFF /* 1 */ #define COS_REF (int32_t)0x7641AF3C /* cos(pi/8) reference value */ #define SIN_REF (int32_t)0x30FBC54D /* sin(pi/8) reference value */ #define DELTA (int32_t)0x00001000 /* Max residual error for cos and sin, with 6 cycle precision: 2^-19 max residual error, ie 31-19=12 LSB, ie <0x1000 */ 

3、复制计算结果变量

复制代码
/* cos and sin results */ int32_t cosOutput = 0; int32_t sinOutput = 0; 

4、实现cordic功能

​​​​​uint32_t Check_Residual_Error(int32_t VarA, int32_t VarB, uint32_t MaxError);

复制代码
{ uint32_t status = PASS;   if ((VarA - VarB) >= 0)  {  if ((VarA - VarB) > MaxError)   {   status = FAIL;   }} else {  if ((VarB - VarA) > MaxError)  {  status = FAIL;  }  }   return status;  }  static void LL_cordic_calculate(void) { LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_CORDIC); 
/* Configure CORDIC peripheral */
LL_CORDIC_Config(CORDIC, LL_CORDIC_FUNCTION_COSINE, /* cosine function */ 
        LL_CORDIC_PRECISION_6_CYCLE, /* max precision for q1.31 cosine */ 
        LL_CORDIC_SCALING_FACTOR_0, /* no scale */ 
        LL_CORDIC_NBWRITE_1, /* One input data: angle. Second input data (modulus) is 1 after cordic reset */ 
        LL_CORDIC_NBREAD_2, /* Two output data: cosine, then sine */ 
        LL_CORDIC_INWIDTH_32_BIT, /* q1.31 format for input data */ 
        LL_CORDIC_OUTWIDTH_32_BIT); /* q1.31 format for output data */ 

/* Write angle */ 
LL_CORDIC_WriteData(CORDIC, ANGLE_CORDIC); 

/* Read cosine */ 
cosOutput = (int32_t)LL_CORDIC_ReadData(CORDIC);
/* Read sine */ 
sinOutput = (int32_t)LL_CORDIC_ReadData(CORDIC); 

/* Check residual error on cosine and sine results */ 
if ((Check_Residual_Error(cosOutput, COS_REF, DELTA) == FAIL) || 
(Check_Residual_Error(sinOutput, SIN_REF, DELTA) == FAIL)) 
{
 error_handler();
 } 
} 

3. 测试结果

在main函数里调用LL_cordic_calculate,并监视cosOutput和sinOutput,并与参考值进行比较,结果符合预期。


4. 小结

本文基于STM32C5平台实现了LL cordic例程。

点击按钮下载《STM32C5 LL Cordic例程》原文档。


重要通知 - 请仔细阅读

意法半导体公司及其子公司 ("ST")保留随时对 ST 产品和 / 或本文档进行变更的权利,恕不另行通知。买方在订货之前应获取关于 ST 产 品的最新信息。 ST 产品的销售依照订单确认时的相关 ST销售条款。 买方自行负责对 ST 产品的选择和使用, ST 概不承担与应用协助或买方产品设计相关的任何责任。 ST 不对任何知识产权进行任何明示或默示的授权或许可。 转售的 ST 产品如有不同于此处提供的信息的规定,将导致 ST 针对该产品授予的任何保证失效。 ST 和 ST 徽标是 ST 的商标。若需 ST 商标的更多信息,请参考 www.st.com/trademarks。所有其他产品或服务名称均为其 各自所有者的财产。 本文档是ST中国本地团队的技术性文章,旨在交流与分享,并期望借此给予客户产品应用上足够的帮助或提醒。若文中内容存有局限或与ST 官网资料不一致,请以实际应用验证结果和ST官网最新发布的内容为准。您拥有完全自主权是否采纳本文档(包括代码,电路图等)信息, 我们也不承担因使用或采纳本文档内容而导致的任何风险。 本文档中的信息取代本文档所有早期版本中提供的信息。 © 2020 STMicroelectronics - 保留所有权利

相关推荐
FPGA小徐1 小时前
电子工程师面试真题:LM7805 扩流 + 过流保护电路原理分析
单片机·嵌入式硬件
霖霖7141 小时前
【ESP32笔记】RGB灯WS2812实验
笔记·单片机·mcu·物联网
西城微科方案开发2 小时前
激光测距仪模组选择——M01还是M03?
单片机·嵌入式硬件
zjxtxdy2 小时前
STM32hal库开发-中断与串口和通信协议
stm32·单片机·嵌入式硬件
霖霖7142 小时前
【ESP32笔记】开发环境的搭建
单片机·mcu·物联网
wuyk5552 小时前
27.LeetCode 2265. 统计值等于子树平均值的节点数 —— 后序遍历实战
stm32·单片机·嵌入式硬件·算法
糖糖单片机设计2 小时前
基于 STM32 的配网变压器涌流抑制器设计与实现
人工智能·stm32·嵌入式硬件·51单片机·语音识别
威嵌神州2 小时前
10.1 寸带扩展坞维保加固平板|分体式维保终端硬件基线选型评估
嵌入式硬件·平板
沐欣工作室_lvyiyi3 小时前
基于单片机的智能窗帘控制设计(论文+源码)
单片机·嵌入式硬件·单片机设计·江苏理工学院·伊犁师范大学·延安大学·兰州城市学院