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

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

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

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

CW32L012與STM32F103的三角運(yùn)算性能對(duì)比

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

掃碼添加小助手

加入工程師交流群

?

CW32L012和STM32F103在定位和性能上差異顯著,在三角函數(shù)的運(yùn)算性能上的對(duì)比亦非常直觀。

一、 硬件架構(gòu)對(duì)比(性能基礎(chǔ))

芯片型號(hào) CW32L012C8 STM32F103C8
內(nèi)核 ARM Cortex-M0+ ARM Cortex-M3
主頻 最高 96 MHz 最高 72 MHz
硬件CORDIC 支持 無(wú)
DSP 無(wú) 無(wú)
立創(chuàng)樣片價(jià)格 3.69元 7.55元

兩者都沒(méi)有硬件浮點(diǎn)運(yùn)算單元。 但在運(yùn)算三角函數(shù)時(shí),CW32L012支持CORDIC算法

二、 三角運(yùn)算性能具體分析

1:標(biāo)準(zhǔn)庫(kù)浮點(diǎn)運(yùn)算(如 math.h 的 sinf, cosf)

這是最常用但也是最慢的方式。

STM32F103C8:Cortex-M3內(nèi)核的整體性能,使其在運(yùn)行相同的軟件浮點(diǎn)庫(kù)時(shí),性能優(yōu)于CW32L012的Cortex-M0+。

CW32L012C8:Cortex-M0+內(nèi)核設(shè)計(jì)更簡(jiǎn)單,但用軟件浮點(diǎn)運(yùn)算效率較低,耗時(shí)會(huì)更長(zhǎng)。

以下是使用STM32F103C8T6和CW32L012C8T6兩種芯片。使用math.h運(yùn)算SIN和COS的代碼實(shí)現(xiàn)。

STM32F103使用math.h運(yùn)算SIN30度與COS30度 :


float angle; 
void performance_test(unsigned long iterations)
{
 unsigned long i=0;
 float y1,y2;

 for(i=1;i<=iterations;i++)
 {  
  y1=sin(angle);  
  y2=cos(angle);
 }
}
void LED_Init(void)
{
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 GPIO_Init(GPIOC, &GPIO_InitStructure);
}
void TIM1_Init(void)
{
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
 TIM_InternalClockConfig(TIM1); 
 TIM_TimeBaseInitTypeDef TIM1_Initstructure;
 TIM1_Initstructure.TIM_ClockDivision=TIM_CKD_DIV1;
 TIM1_Initstructure.TIM_CounterMode=TIM_CounterMode_Up;
 TIM1_Initstructure.TIM_Period=1000-1;  //定時(shí)時(shí)長(zhǎng)=72000000/(Prescaler-1)/(Period-1)
 TIM1_Initstructure.TIM_Prescaler=72-1;
 TIM1_Initstructure.TIM_RepetitionCounter=0;
  TIM_TimeBaseInit(TIM1,&TIM1_Initstructure);
 TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE);
 TIM_ClearFlag(TIM1,TIM_IT_Update); 
 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 
 NVIC_InitTypeDef NVIC_Initstructure;
 NVIC_Initstructure.NVIC_IRQChannel=TIM1_UP_IRQn;
 NVIC_Initstructure.NVIC_IRQChannelCmd=ENABLE;
 NVIC_Initstructure.NVIC_IRQChannelPreemptionPriority=1;
 NVIC_Initstructure.NVIC_IRQChannelSubPriority=1;
 NVIC_Init(&NVIC_Initstructure); 
 TIM_Cmd(TIM1,ENABLE);
}
unsigned int timecount=0;
unsigned int lastcmputetime=0;
int main(void)
{
  char temp_buff1[40];
  LED_Init(); 
 TIM1_Init();
   OLED_Init();               //清屏
  OLED_Printf(0,0,OLED_6X8," SIN/COS COMPUTE Test ");
  OLED_Printf(0,16,OLED_6X8,"  For 1000000 Times ");   
 OLED_Update();  
 angle=0.523; //0.785(45度弧度制)=45度/180度*3.14  0.523(30度弧度制)=30/180*3.14
 while (1)
 {
       sprintf(temp_buff1, " STM32F103 start......      ");
           OLED_Printf(0, 32, OLED_6X8, temp_buff1);
           OLED_Printf(0, 48, OLED_8X16, "                 ");
   OLED_Update();   
   timecount=0;
   performance_test(1000000);
   lastcmputetime=timecount;       
   sprintf(temp_buff1, " STM32F103 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();
          while(1); //由于結(jié)果太慢,不進(jìn)行二次運(yùn)算,停在這里方便查看時(shí)間. 如果需要二次運(yùn)算,則屏蔽該條語(yǔ)句
       timecount=0;
    while(timecount=500) //以下用于檢查時(shí)間配置是否準(zhǔn)確
//  {timecount=0;
//   flag=1-flag;
//   if(flag==1)
//   GPIO_SetBits(GPIOC,GPIO_Pin_13);
//   else 
//   GPIO_ResetBits(GPIOC,GPIO_Pin_13);
//  }
 }
}
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

使用MATH.H執(zhí)行結(jié)果:運(yùn)算100W次SIN30度與COS30度時(shí)間顯示內(nèi)容如下:

wKgZO2lSLUiAXbd3AANcKDr94dM606.png

CW32L012使用math.h運(yùn)算SIN30度與COS30度:

核心代碼:


void performance_test(unsigned long iterations)
{
 unsigned long i=0;
 float y1,y2;

 CW_FLASH->CR2 = 0x5a5a001B;
 for(i=1;i<=iterations;i++)
 {  
  y1=sin(anglef);  
  y2=cos(anglef);
 }
 CW_FLASH-?>CR2 = 0x5a5a0003;
}
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

使用MATH.H執(zhí)行結(jié)果:運(yùn)算100W次SIN30度與COS30度時(shí)間顯示內(nèi)容如下:

wKgZPGlSLTaAVcooAAN9a2eIYNg543.png

2:使用硬件CORDIC

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

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


CW32L012使用CORDIC運(yùn)算100W次SIN30度與COS30度的代碼實(shí)現(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; // 寫(xiě)入Z寄存器啟動(dòng)運(yùn)算

    // 等待運(yùn)算完成
  while (!CORDIC_GetStatus().eoc);  //運(yùn)算完成標(biāo)志硬件置1,讀取運(yùn)算結(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)浮點(diǎn)數(shù) 根據(jù)需要使用
  //y22=q1_31_to_float(y2);   //余弦結(jié)果轉(zhuǎn)浮點(diǎn)數(shù) 根據(jù)需要使用
 }
}
void BTIM1_Configuration(void)     //1ms進(jìn)一次中斷
{
 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();//時(shí)鐘配置
  cordic_init_t init = {
        .func = CORDIC_FUNC_COS,  // 選擇余弦函數(shù)
        .scale = 0,              // 不使用擴(kuò)展范圍
        .format = CORDIC_FORMAT_Q1_31, // 使用q1.31格式
        .iter = CORDIC_ITER_20,  // 迭代次數(shù)
        .comp = 1,               // 硬件補(bǔ)償伸縮因子
        .ie = 0,                 // 禁用中斷
        .dmaeoc = 0,             // 禁用DMA
        .dmaidle = 0             // 禁用DMA空閑
    };  
  CORDIC_Init(&init);  //sin cos運(yùn)算初始化

    EAU_Init();// 初始化EAU    
    EAU_SetMode(EAU_MODE_UNSIGNED_DIV);// 設(shè)置為無(wú)符號(hào)除法模式

 __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,即:運(yùn)算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
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

運(yùn)算結(jié)果:

wKgZPGlSLYuAUBxWAATqA6rR21E445.png

計(jì)算100W次SIN30度 與COS30度。其中運(yùn)算結(jié)果數(shù)據(jù)表示為:CORDIC運(yùn)算結(jié)果為Q1.31格式表示;math.h:運(yùn)算結(jié)果為浮點(diǎn)數(shù)表示。

時(shí)間對(duì)比參考如下:

wKgZPGlSLZ-ABqZBAABqH8jSn5Q687.png

?
審核編輯 黃宇

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

    關(guān)注

    34

    文章

    495

    瀏覽量

    67682
  • CW32
    +關(guān)注

    關(guān)注

    1

    文章

    299

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    基于STM32F103驅(qū)動(dòng)DAC1220 20位/16位DAC數(shù)模轉(zhuǎn)換模塊輸出可調(diào)±10V基準(zhǔn)和三角波信號(hào)

    小等特點(diǎn)。工作電壓5V,20位模式下建立時(shí)間15ms,16位模式僅需2ms。本文將用STM32F103驅(qū)動(dòng)DAC1220,實(shí)現(xiàn)生成三角波信號(hào)輸出。模塊可用于工業(yè)控制、傳感器激勵(lì)等高精度場(chǎng)景。
    的頭像 發(fā)表于 01-10 10:31 ?2574次閱讀
    基于<b class='flag-5'>STM32F103</b>驅(qū)動(dòng)DAC1220 20位/16位DAC數(shù)模轉(zhuǎn)換模塊輸出可調(diào)±10V基準(zhǔn)和<b class='flag-5'>三角</b>波信號(hào)

    基于STM32F103驅(qū)動(dòng)AD9833模塊 DDS信號(hào)發(fā)生器輸出正弦波/三角波/方波可編程信號(hào)

    。輸出阻抗200Ω,正弦波最大幅值600mVpp,方波5Vpp。使用時(shí)需注意輸出信號(hào)帶有直流分量,射頻設(shè)備需加隔直器。本文將通過(guò)STM32F103的SPI接口控制AD9833,配合OLED屏和EC11編碼器實(shí)現(xiàn)波形參數(shù)調(diào)節(jié)。
    的頭像 發(fā)表于 01-10 10:30 ?2062次閱讀
    基于<b class='flag-5'>STM32F103</b>驅(qū)動(dòng)AD9833模塊 DDS信號(hào)發(fā)生器輸出正弦波/<b class='flag-5'>三角</b>波/方波可編程信號(hào)

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

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

    CW32L012STM32G431的CORDIC三角函數(shù)運(yùn)算性能對(duì)比

    CORDIC協(xié)處理器的三角運(yùn)算性能對(duì)比。對(duì)比結(jié)果出乎意料。 一、硬件架構(gòu) 二、運(yùn)算100W次SIN30度與COS30度的代碼實(shí)現(xiàn) 1.
    的頭像 發(fā)表于 12-29 15:55 ?2472次閱讀
    <b class='flag-5'>CW32L012</b>與<b class='flag-5'>STM32</b>G431的CORDIC<b class='flag-5'>三角</b>函數(shù)<b class='flag-5'>運(yùn)算</b><b class='flag-5'>性能對(duì)比</b>

    CW32L012小型機(jī)器人控制評(píng)估板活動(dòng) 四足機(jī)器人+智能小車(chē) 開(kāi)箱評(píng)測(cè)

    。 這次CW32L012的評(píng)測(cè)活動(dòng),CW32生態(tài)社區(qū)將開(kāi)發(fā)板、以及各類(lèi)套件與相關(guān)資料(技術(shù)資料、例程代碼、視頻教程等)準(zhǔn)備得非常豐富,對(duì)初學(xué)者非常地有好,可以說(shuō)是手把手帶你入門(mén),新手小白可以趁機(jī)入手
    發(fā)表于 11-24 23:44

    **CW32L012****開(kāi)發(fā)評(píng)估板的第一個(gè)程序**

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

    CW32L012小機(jī)器人的電機(jī)控制

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

    使用芯源CW32的CW32L012開(kāi)發(fā)評(píng)估板做了spi屏幕驅(qū)動(dòng)

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

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

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

    MH32F103A系列單片機(jī)的功能特性

    MH32F103A是一款硬件完美兼容ST32的國(guó)產(chǎn)32位單片機(jī),使用高性能的ARM Cortex-M3 內(nèi)核,最高工作頻率216 MHz。內(nèi)置最大512K Flash,96K Sram存儲(chǔ)器。MH32F103A 軟硬件兼容
    的頭像 發(fā)表于 09-12 10:58 ?1115次閱讀
    MH32<b class='flag-5'>F103</b>A系列單片機(jī)的功能特性

    STM32F103c8上做DLQR最優(yōu)控制算法的C編程資料

    這是我近期做的一個(gè)項(xiàng)目--基于STM32F103c8的DLQR控制算法的C編程,涉及DLQR最優(yōu)控制算法、嵌入式STM32F103編程、CMSIS-DSP庫(kù)使用。? ??附有完整的程序。
    發(fā)表于 07-23 15:30 ?0次下載

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

    CW32L012基于ARM? Cortex-M0+內(nèi)核,主頻高達(dá)96MHz,同時(shí)集成了CORDIC硬件單元、擴(kuò)展算術(shù)運(yùn)算單元(EAU),可以提供部分?jǐn)?shù)學(xué)函數(shù)、算術(shù)運(yùn)算的硬件加速,特別適用于電機(jī)控制、電源、計(jì)量、信號(hào)處理等應(yīng)用。
    的頭像 發(fā)表于 07-16 16:34 ?1339次閱讀
    堅(jiān)持繼續(xù)布局32位MCU,進(jìn)一步完善產(chǎn)品陣容,96Mhz主頻<b class='flag-5'>CW32L012</b>新品發(fā)布!

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

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

    STM32F103x8 STM32F103xB單片機(jī)數(shù)據(jù)手冊(cè)

    STM32F103x8STM32F103xB單片機(jī)數(shù)據(jù)手冊(cè)
    發(fā)表于 04-14 14:55 ?8次下載

    STM32F103×8/STM32F103×B MCU手冊(cè)

    本文提供了STM32F103x8和STM32F103xB中密度高性能系列微控制器的訂購(gòu)信息和機(jī)械器件特性。有關(guān)整個(gè)STMicroelectronics STM32F103xx系列的更
    發(fā)表于 03-18 16:37 ?0次下載