আমি STM32F303VC আবিষ্কার কিট নিয়ে কাজ করছি এবং এর অভিনয় দেখে আমি কিছুটা হতবাক হয়েছি। সিস্টেমটির সাথে পরিচিত হতে, আমি এই এমসিইউটির বিট-বেংগিং গতিটি পরীক্ষা করার জন্য একটি খুব সহজ প্রোগ্রাম লিখেছি। কোডটি নীচে ভেঙে ফেলা যায়:
- এইচএসআই ঘড়ি (8 মেগাহার্টজ) চালু আছে;
- পিএলএল এইচএসআই / 2 * 16 = 64 মেগাহার্টজ অর্জনের জন্য 16 এর প্রেস্কেলারের সাথে শুরু করা হয়েছিল;
- পিএলএলকে এসওয়াইএসসিএলকে মনোনীত করা হয়েছে;
- এসওয়াইএসসিএলকে এমসিও পিন (PA8) এ পর্যবেক্ষণ করা হয়, এবং একটি পিনের (PE10) অনন্ত লুপে নিয়মিত টগল করা হয়।
এই প্রোগ্রামের উত্স কোডটি নীচে উপস্থাপন করা হয়েছে:
#include "stm32f3xx.h"
int main(void)
{
// Initialize the HSI:
RCC->CR |= RCC_CR_HSION;
while(!(RCC->CR&RCC_CR_HSIRDY));
// Initialize the LSI:
// RCC->CSR |= RCC_CSR_LSION;
// while(!(RCC->CSR & RCC_CSR_LSIRDY));
// PLL configuration:
RCC->CFGR &= ~RCC_CFGR_PLLSRC; // HSI / 2 selected as the PLL input clock.
RCC->CFGR |= RCC_CFGR_PLLMUL16; // HSI / 2 * 16 = 64 MHz
RCC->CR |= RCC_CR_PLLON; // Enable PLL
while(!(RCC->CR&RCC_CR_PLLRDY)); // Wait until PLL is ready
// Flash configuration:
FLASH->ACR |= FLASH_ACR_PRFTBE;
FLASH->ACR |= FLASH_ACR_LATENCY_1;
// Main clock output (MCO):
RCC->AHBENR |= RCC_AHBENR_GPIOAEN;
GPIOA->MODER |= GPIO_MODER_MODER8_1;
GPIOA->OTYPER &= ~GPIO_OTYPER_OT_8;
GPIOA->PUPDR &= ~GPIO_PUPDR_PUPDR8;
GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR8;
GPIOA->AFR[0] &= ~GPIO_AFRL_AFRL0;
// Output on the MCO pin:
//RCC->CFGR |= RCC_CFGR_MCO_HSI;
//RCC->CFGR |= RCC_CFGR_MCO_LSI;
//RCC->CFGR |= RCC_CFGR_MCO_PLL;
RCC->CFGR |= RCC_CFGR_MCO_SYSCLK;
// PLL as the system clock
RCC->CFGR &= ~RCC_CFGR_SW; // Clear the SW bits
RCC->CFGR |= RCC_CFGR_SW_PLL; //Select PLL as the system clock
while ((RCC->CFGR & RCC_CFGR_SWS_PLL) != RCC_CFGR_SWS_PLL); //Wait until PLL is used
// Bit-bang monitoring:
RCC->AHBENR |= RCC_AHBENR_GPIOEEN;
GPIOE->MODER |= GPIO_MODER_MODER10_0;
GPIOE->OTYPER &= ~GPIO_OTYPER_OT_10;
GPIOE->PUPDR &= ~GPIO_PUPDR_PUPDR10;
GPIOE->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR10;
while(1)
{
GPIOE->BSRRL |= GPIO_BSRR_BS_10;
GPIOE->BRR |= GPIO_BRR_BR_10;
}
}
কোডটি CoIDE V2 এর সাথে জিএনইউ এআরএম এমবেডড টুলচেন -O1 অপ্টিমাইজেশন ব্যবহার করে সংকলিত হয়েছিল। পিন পিএ 8 (এমসিও) এবং পিই 10 এর সংকেতগুলি, একটি অসিস্কোস্কোপ দিয়ে পরীক্ষা করা হয়েছে, এটি দেখতে দেখতে:
এসওয়াইএসসিএলকে সঠিকভাবে কনফিগার করা হয়েছে বলে মনে হচ্ছে, এমসিও (কমলা বক্ররেখা) প্রায় M৪ মেগাহার্টজ (অভ্যন্তরীণ ঘড়ির ত্রুটির মার্জিন বিবেচনা করে) এর দোলনা প্রদর্শন করে। আমার কাছে অদ্ভুত অংশটি হল PE10 (নীল বক্ররেখা) এর আচরণ। অসীমের সময় (1) লুপটিতে প্রাথমিক 3-পদক্ষেপের ক্রিয়াকলাপ (যেমন বিট-সেট / বিট-রিসেট / রিটার্ন) করতে 4 + 4 + 5 = 13 ঘড়ির চক্র লাগে। এটি অন্যান্য অপ্টিমাইজেশনের স্তরে আরও খারাপ হয়ে যায় (উদাঃ -O2, -O3, এআর-ওস): সিগন্যালের নীচের অংশে বেশ কয়েকটি অতিরিক্ত ঘড়ির চক্র যুক্ত করা হয়, যেমন পিই 10 এর পতনশীল এবং ক্রমবর্ধমান প্রান্তগুলির মধ্যে (কোনওভাবে এলএসআই সক্ষম করে মনে হচ্ছে) এই পরিস্থিতিতে প্রতিকার করতে)।
এই আচরণটি কি এই এমসিইউ থেকে প্রত্যাশিত? আমি কোনও কাজটি সেট করার মতোই সহজ কাজটি কল্পনা করব এবং কিছুটা পুনরায় সেট করা 2-4 গুণ দ্রুত হওয়া উচিত। জিনিসগুলি দ্রুত করার কোনও উপায় আছে?