91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

CW32L012與STM32G431的CORDIC三角函數(shù)運算性能對比

jf_09510355 ? 來源:jf_09510355 ? 作者:jf_09510355 ? 2025-12-29 15:55 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

本文對比均為作者實測,結(jié)果僅供參考,可附代碼供有意者評估~

STM32G431是STM32家族中較新的產(chǎn)品。CW32L012也是武漢芯源半導(dǎo)體最新推出的混合信號MCU,讓我們深入分析基于各自芯片CORDIC協(xié)處理器的三角運算性能對比。對比結(jié)果出乎意料。

一、硬件架構(gòu)

wKgZO2lSMoWACLs6AACFW1xwJ3k646.png


二、運算100W次SIN30度與COS30度的代碼實現(xiàn)


1.CW32L012


CW32L012的CORDIC提供某些數(shù)學(xué)函數(shù)的硬件加速,特別是三角函數(shù)9,通常用于電機控制、計量、信號處理和許多其他應(yīng)用。與軟件實現(xiàn)相比,它加快了這些功能的計算速度,允許較低的工作頻率,或釋放處理器周期以執(zhí)行其他任務(wù)。

CW32L012的CORDIC支持余弦 cos、正弦 sin、相位角 atan2、模 hypot、反正切 atan、雙曲余弦 cosh、雙曲正弦 sinh、雙曲反正切 atanh 函數(shù)運算。

CW32L012使用CORDIC運算100W次SIN30度與COS30度的代碼實現(xiàn)如下:

 
int32_t angle; 
 
void RCC_Configuration(void)
{
   SYSCTRL_HSI_Enable(SYSCTRL_HSIOSC_DIV1);
    SYSCTRL_HCLKPRS_Config(SYSCTRL_HCLK_DIV1);
    SYSCTRL_PCLKPRS_Config(SYSCTRL_PCLK_DIV1);
    SYSCTRL_SystemCoreClockUpdate(96000000);
}
void performance_test1(unsigned long iterations)
{
 unsigned long i=0;
  int32_t  y1,y2;
  float  y11,y22;  
 for(i=1;i<=iterations;i++)
 {       
  while (CORDIC_GetStatus().busy);  
    CW_CORDIC-?>Z =angle; // 寫入Z寄存器啟動運算    
    // 等待運算完成
    while (!CORDIC_GetStatus().eoc); //運算完成標(biāo)志硬件置1,讀取運算結(jié)果硬件清0
    // 讀取結(jié)果  
//y1=CW_CORDIC->Y;//sin(PI/6);  // 正弦結(jié)果在Y寄存器 Q1.31格式 根據(jù)需要使用
//y2=CW_CORDIC->X;//cos(PI/6); // 余弦結(jié)果在X寄存器 Q1.31格式 根據(jù)需要使用
  //y11=q1_31_to_float(y1);   //正弦結(jié)果轉(zhuǎn)浮點數(shù) 根據(jù)需要使用
  //y22=q1_31_to_float(y2);   //余弦結(jié)果轉(zhuǎn)浮點數(shù) 根據(jù)需要使用
 }
}
void BTIM1_Configuration(void)     //1ms進一次中斷
{
 BTIM_TimeBaseInitTypeDef BTIM_TimeBaseInitStruct = {0}; 
 __SYSCTRL_BTIM123_CLK_ENABLE();
  __disable_irq();
  NVIC_EnableIRQ(BTIM1_IRQn);
  __enable_irq(); 
 BTIM_TimeBaseInitStruct.BTIM_Mode = BTIM_MODE_TIMER; 
  BTIM_TimeBaseInitStruct.BTIM_Period = 1000 - 1;
  BTIM_TimeBaseInitStruct.BTIM_Prescaler = 96 - 1;    // 8
  BTIM_TimeBaseInit(CW_BTIM1, &BTIM_TimeBaseInitStruct); 
  BTIM_ITConfig(CW_BTIM1, BTIM_IT_UPDATE, ENABLE);
  BTIM_Cmd(CW_BTIM1, ENABLE);
}
unsigned int timecount=0;
unsigned int lastcmputetime=0;
int main(void)
{ 
    GPIO_InitTypeDef GPIO_InitStruct;
    char temp_buff1[4]; 
    RCC_Configuration();//時釧配置 
  cordic_init_t init = {
        .func = CORDIC_FUNC_COS,  // 選擇余弦函數(shù)
        .scale = 0,              // 不使用擴展范圍
        .format = CORDIC_FORMAT_Q1_31, // 使用q1.31格式
        .iter = CORDIC_ITER_20,  // 迭代次數(shù)
        .comp = 1,               // 硬件補償伸縮因子
        .ie = 0,                 // 禁用中斷
        .dmaeoc = 0,             // 禁用DMA
        .dmaidle = 0             // 禁用DMA空閑
    };  
  CORDIC_Init(&init);  //sin cos運算初始化    
    EAU_Init();// 初始化EAU    
   EAU_SetMode(EAU_MODE_UNSIGNED_DIV);// 設(shè)置為無符號除法模式       
  __SYSCTRL_GPIOC_CLK_ENABLE();    //GPIOC LED
    GPIO_InitStruct.Pins = GPIO_PIN_13;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_Init( CW_GPIOC, &GPIO_InitStruct);
    GPIO_WritePin(CW_GPIOC,GPIO_PIN_13,GPIO_Pin_RESET);
  BTIM1_Configuration(); //1MS    
     OLED_Init();               //清屏
      OLED_Printf(0,0,OLED_6X8," SIN/COS COMPUTE Test ");
   OLED_Printf(0,16,OLED_6X8,"  For 1000000 Times ");   
   OLED_Update();     
   angle = float_to_q1_31(0.167);//float_to_q1_15   // 0.25=1/4,即:運算45度=PI/4,換算為Q1.31格式,   //0.167=1/6 PI/6=30度
  while (1)
    {   
   sprintf(temp_buff1, " CW32L012 start......      ");
      OLED_Printf(0, 32, OLED_6X8, temp_buff1);
      OLED_Printf(0, 48, OLED_8X16, "                 ");
   OLED_Update();   
   timecount=0;
   performance_test1(1000000);
   lastcmputetime=timecount;      
   sprintf(temp_buff1, " CW32L012 used time:    ");
      OLED_Printf(0, 32, OLED_6X8, temp_buff1);
   sprintf(temp_buff1, "     %d mS    ", lastcmputetime);
      OLED_Printf(0, 48, OLED_8X16, temp_buff1);OLED_Update();   
   timecount=0;
   while(timecount

運算結(jié)果:

wKgZPGlSLYuAUBxWAATqA6rR21E445.png

2.STM32G431



/* Private variables ---------------------------------------------------------*/
CORDIC_HandleTypeDef hcordic;
DMA_HandleTypeDef hdma_cordic_read;
DMA_HandleTypeDef hdma_cordic_write;
 
TIM_HandleTypeDef htim2;
 
/* USER CODE BEGIN PV */
 
/* Array of calculated sines in Q1.31 format */
static int32_t aCalculatedSin[2];
/* USER CODE END PV */
 
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_DMA_Init(void);
static void MX_TIM2_Init(void);
static void MX_CORDIC_Init(void);
/* USER CODE BEGIN PFP */
CORDIC_ConfigTypeDef sCordicConfig;
 
int32_t angle; 
float anglef;
/* USER CODE END PFP */
 
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
 
unsigned int timecount=0;
unsigned int lastcmputetime=0;
void performance_test3(unsigned long iterations) //使用cordic功能運算
{
 unsigned long i=0;
 int32_t y1,y2;
 float result;
  float  y11,y22;
 for(i=1;i<=iterations;i++)
 {
  while (HAL_CORDIC_GetState(&hcordic) != HAL_CORDIC_STATE_READY)
  {
  } 
  if (HAL_CORDIC_Calculate_DMA(&hcordic, &angle, aCalculatedSin,1, CORDIC_DMA_DIR_IN_OUT) != HAL_OK)
  {
   Error_Handler();
  }    
 
//  y1=aCalculatedSin[0]; //SIN運算結(jié)果Q1.31格式
//  y2=aCalculatedSin[1]; //COS運算結(jié)果Q1.31格式
//   y11=(float)y1 / 2147483648.0; // 2^31  換算成符點數(shù) 正弦結(jié)果轉(zhuǎn)浮點數(shù) 根據(jù)需要使用
//   y22=(float)y2 / 2147483648.0; // 2^31  換算成符點數(shù) 余弦結(jié)果轉(zhuǎn)浮點數(shù) 根據(jù)需要使用
 }
} 
 
/* USER CODE END 0 */
 
/**
@brief  The application entry point.
@retval int
*/
int main(void)
{
  /* USER CODE BEGIN 1 */
  char temp_buff1[50];
  /* USER CODE END 1 */
  /* MCU Configuration--------------------------------------------------------*/
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();
  /* USER CODE BEGIN Init */
  /* USER CODE END Init */
  /* Configure the system clock */
  SystemClock_Config();
  /* USER CODE BEGIN SysInit */
  /* USER CODE END SysInit */
  /* Initialize all configured peripherals /
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_TIM2_Init();
  MX_CORDIC_Init();
  / USER CODE BEGIN 2 */
 sCordicConfig.Function         = CORDIC_FUNCTION_SINE;     /* sine function /
  sCordicConfig.Precision        = CORDIC_PRECISION_6CYCLES; / max precision for q1.31 sine /
  sCordicConfig.Scale            = CORDIC_SCALE_0;           / no scale /
  sCordicConfig.NbWrite          = CORDIC_NBWRITE_1;         / One input data: angle. Second input data (modulus) is 1 after cordic reset /
  sCordicConfig.NbRead           = CORDIC_NBREAD_2;          / One output data: sine /
  sCordicConfig.InSize           = CORDIC_INSIZE_32BITS;     / q1.31 format for input data /
  sCordicConfig.OutSize          = CORDIC_OUTSIZE_32BITS;    / q1.31 format for output data */
  if (HAL_CORDIC_Configure(&hcordic, &sCordicConfig) != HAL_OK)
  {
    /* Configuration Error */
    Error_Handler();
  }  
  HAL_TIM_Base_Start_IT(&htim2);
  OLED_Init();
  OLED_Printf(0,0,OLED_6X8," SIN/COS COMPUTE Test ");
  OLED_Printf(0,16,OLED_6X8,"  For 1000000 Times ");
 OLED_Update();
 angle=(int32_t)round(0.167 * 2147483648.0); // 2^31 // 0.25=1/4,即:運算45度=PI/4,換算為Q1.31格式,   //0.167=1/6 PI/6=30度
 anglef=0.523; //0.785(45度弧度制)=45度/180度*3.14  0.523(30度弧度制)=30/180*3.14
  /* USER CODE END 2 */
  /* Infinite loop /
  / USER CODE BEGIN WHILE /
  while (1)
  {
    / USER CODE END WHILE */
    /* USER CODE BEGIN 3 */
    sprintf(temp_buff1, " STM32G431 start......      ");
      OLED_Printf(0, 32, OLED_6X8, temp_buff1);
      OLED_Printf(0, 48, OLED_8X16, "                 ");
   OLED_Update();
   timecount=0;
   performance_test3(1000000);
   lastcmputetime=timecount;  
   sprintf(temp_buff1, " STM32G431 used time:    ");
      OLED_Printf(0, 32, OLED_6X8, temp_buff1);
   sprintf(temp_buff1, "     %d mS    ", lastcmputetime);
      OLED_Printf(0, 48, OLED_8X16, temp_buff1);
    OLED_Update();  
     timecount=0;
   while(timecountInstance==TIM2)
 {
  timecount++;
//  if(timecount>=500) 
//  {timecount=0;
//   flag=1-flag;
//   HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
//  }
 }

運算結(jié)果:

wKgZO2lSM46AVrH4AATz6k7S6Sg451.png

計算100W次SIN30度 與COS30度。其中運算結(jié)果數(shù)據(jù)表示為:CORDIC運算結(jié)果均為Q1.31格式表示 。

時間對比參考如下:

wKgZPGlSM5-AVSL6AABeqB2ryvE682.png

結(jié)果確實出乎意料,沒想到同樣的CORDIC協(xié)處理器運算,M4F內(nèi)核的G4芯片表現(xiàn)竟不如M0+內(nèi)核的CW32L012芯片!

為什么STM32G431會慢于CW32L012?我在瀏覽論壇時,也發(fā)現(xiàn)有人反饋G4的CORDIC表現(xiàn)差強人意。

作者猜想,STM32基于CUBE軟件生成的HALL庫文件中規(guī)則性判斷語句較多,可能會引起一定時間的延遲。

另外應(yīng)該還有其它原因?!

下表是兩款芯片在不同條件下,計算100W次SIN30度與COS30度的時間快慢表現(xiàn)。

wKgZPGlSM8OAchK1AACFa2c1EiE104.png

最后溫馨提示:STM32G431帶有DSP功能,DSP運算比CORDIC要快。 對比測試作為性能評估參考。大家根據(jù)自己項目定位和預(yù)算,選擇合適性能的芯片就可以了。

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • CORDIC
    +關(guān)注

    關(guān)注

    0

    文章

    41

    瀏覽量

    20540
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    FOC控制中如何利用芯片內(nèi)部的運放設(shè)計電流采樣電路?

    最近開發(fā)電機控制的項目,我開始使用最新的CW32L012做主控,CW32L012作為混合信號MCU,相比于傳統(tǒng)MCU控制,集成度較高,性能當(dāng)然也更好,加之又是48Pin的芯片,因此我開始做的關(guān)于
    的頭像 發(fā)表于 01-05 16:50 ?2727次閱讀
    FOC控制中如何利用芯片內(nèi)部的運放設(shè)計電流采樣電路?

    CW32L012STM32F103的三角運算性能對比

    ? ?CW32L012STM32F103在定位和性能上差異顯著,在三角函數(shù)運算性能上的
    的頭像 發(fā)表于 12-29 15:32 ?2324次閱讀
    <b class='flag-5'>CW32L012</b>與<b class='flag-5'>STM32</b>F103的<b class='flag-5'>三角</b><b class='flag-5'>運算</b><b class='flag-5'>性能對比</b>

    CW32L012小型機器人控制評估板活動 四足機器人+智能小車 開箱評測

    。 CW32L012活動相關(guān)資料鏈接:https://dwi41yhz703.feishu.cn/wiki/B1Ihw31ebiX0vkkhQr2cINnkn1g 小型機器人+智能小車 主控板簡介
    發(fā)表于 11-24 23:44

    **CW32L012****開發(fā)評估板的第一個程序**

    CW32L012****開發(fā)評估板的第一個程序 最近以15.99在CW32生態(tài)社區(qū)入手了這塊CW32L012開發(fā)評估板,我迫不及待的燒錄進電燈程序,看看這塊板子是否是正常的,能否滿足我后面的學(xué)習(xí)
    發(fā)表于 11-22 00:09

    CW32L012小機器人的電機控制

    線的大功率調(diào)速,電機的控制性能直接決定了系統(tǒng)的響應(yīng)速度、運行精度、能耗效率與穩(wěn)定性。這里分享CW32L012小機器人的正反轉(zhuǎn)、調(diào)速的電機控制 電機的正反轉(zhuǎn) 從配套的開發(fā)板資料介紹中可以知道,這是電機的驅(qū)動芯片RZ7899 從立創(chuàng)商城下載該芯片的數(shù)據(jù)
    的頭像 發(fā)表于 11-21 13:18 ?2392次閱讀
    <b class='flag-5'>CW32L012</b>小機器人的電機控制

    使用芯源CW32的CW32L012開發(fā)評估板做了spi屏幕驅(qū)動

    CW32生態(tài)社區(qū)以極高的性價比入手了這塊CW32L012開發(fā)評估板,開發(fā)板以底板、核心板、1.77寸TFT顯示屏構(gòu)成,所有的IO口都引出了排針,這點好評,使用杜邦線可以非常方便的連接其他模塊。引腳
    的頭像 發(fā)表于 11-21 11:34 ?612次閱讀
    使用芯源<b class='flag-5'>CW</b>32的<b class='flag-5'>CW32L012</b>開發(fā)評估板做了spi屏幕驅(qū)動

    三角函數(shù)的查表法

    在單片機運算中,以整數(shù)形式或說定點數(shù)形式進行運算會比以浮點數(shù)形式運算快。電機控制中,經(jīng)常需要用到三角函數(shù),正弦,余弦,或者正切,求解這一類函數(shù)
    發(fā)表于 11-19 08:06

    堅持繼續(xù)布局32位MCU,進一步完善產(chǎn)品陣容,96Mhz主頻CW32L012新品發(fā)布!

    CW32L012基于ARM? Cortex-M0+內(nèi)核,主頻高達96MHz,同時集成了CORDIC硬件單元、擴展算術(shù)運算單元(EAU),可以提供部分數(shù)學(xué)函數(shù)、算術(shù)
    的頭像 發(fā)表于 07-16 16:34 ?1341次閱讀
    堅持繼續(xù)布局32位MCU,進一步完善產(chǎn)品陣容,96Mhz主頻<b class='flag-5'>CW32L012</b>新品發(fā)布!

    堅持繼續(xù)布局32位MCU,進一步完善產(chǎn)品陣容,96Mhz主頻CW32L012新品發(fā)布!

    基于CW32L01x系列低功耗微控制器家族的全新成員:CW32L012系列產(chǎn)品。 CW32L012基于ARM? Cortex-M0+內(nèi)核,主頻高達96MHz,同時集成了CORDIC硬件
    發(fā)表于 07-16 16:32

    請問STM32G431內(nèi)部運放1和2輸出連接的ADC為什么不是OPAMP?

    請問下大家,STM32G431 芯片UVW相的電流檢測,配置使用內(nèi)部運放PGA,看到G431-ESCdemo板對應(yīng)motor workbench配置,為什么UV相的運放輸出分別是ADC1 3通道
    發(fā)表于 06-10 07:39

    請問STM32G431內(nèi)部運放1和2輸出連接的ADC為什么不是OPAMP?

    請問下大家,STM32G431 芯片UVW相的電流檢測,配置使用內(nèi)部運放PGA,看到G431-ESCdemo板對應(yīng)motor workbench配置,為什么UV相的運放輸出分別是ADC1 3通道
    發(fā)表于 05-14 08:12

    請問STM32G431內(nèi)部運放1和2輸出連接的ADC為什么不是OPAMP?

    請問下大家,STM32G431 芯片UVW相的電流檢測,配置使用內(nèi)部運放PGA,看到G431-ESCdemo板對應(yīng)motor workbench配置,為什么UV相的運放輸出分別是ADC1 3通道
    發(fā)表于 04-27 07:08

    STM32G431移植FreeModbus

    STM32G431移植FreeModbus 的代碼已通過驗證,在WeActStudio的STM32G431CoreBoard上進行多次測試,均可正常讀取寄存器數(shù)值。STM32G431CoreBoard可在我上傳的相關(guān)文件下載。
    發(fā)表于 04-19 16:50 ?2次下載

    馬達控制上必要的知識 三角函數(shù)

    為了理解馬達控制技術(shù),必須理解如下基礎(chǔ)學(xué)問。 (1) 數(shù)學(xué):三角函數(shù),指數(shù)函數(shù),復(fù)數(shù)函數(shù),微分,積分,矩陣,坐標(biāo)(直交,極) (2) 電氣電路:交流理論(3 相交流, 歪交流),過渡現(xiàn)象 (3
    發(fā)表于 03-18 12:23

    請問STM32G431 flash和can為什么沒有LL庫?

    STM32G431 flash和can為什么沒有LL庫?
    發(fā)表于 03-07 06:48