جدول المحتويات:

راسم الذبذبات بأربعة بت: 6 خطوات
راسم الذبذبات بأربعة بت: 6 خطوات

فيديو: راسم الذبذبات بأربعة بت: 6 خطوات

فيديو: راسم الذبذبات بأربعة بت: 6 خطوات
فيديو: تصميم مقياس تردد رقمي بأربعة بت خطوة بخطوة 2024, شهر نوفمبر
Anonim
راسم الذبذبات بأربعة بت
راسم الذبذبات بأربعة بت

إنه مشروع للمتعة فقط لمعرفة مدى السرعات التي يمكنني دفع شاشة مصفوفة نقطية MAX7219. وبدلاً من تشغيلها في "لعبة الحياة" ، قررت إنشاء "نطاق" معها. كما ستفهم من العنوان ، هذا ليس بديلاً عن راسم الذبذبات الحقيقي:-).

نظرًا لأنني لا أخطط لاستخدام هذا بأي طريقة جادة ، فلن أقوم بإنشاء لوحة دوائر مطبوعة لذلك. ربما ، ربما سأضعها على لوحة أداء لكنها الآن ، وستبقى ، على لوح التجارب. أيضًا لا يوجد مضخم / مخفف للإدخال ، يجب عليك توفير إشارة بين 0 و 3.3 فولت ، لا تذهب سالبة أو تزيد عن 3.3 فولت لأنك قد تلحق الضرر بالميكروكونترولر.

الخطوة 1: الأجهزة

المعدات
المعدات
المعدات
المعدات
المعدات
المعدات

إنها رخيصة ورخيصة جدًا عند شراء الأجزاء في الصين عبر موقع ئي باي أو مواقع مماثلة. يستخدم لوحة تطوير STM32F103C8 ، تسمى أحيانًا "الحبة الزرقاء" التي اشتريتها مقابل حوالي 2 يورو (أو الدولار الأمريكي ، هما نفس القيمة تقريبًا ، نهاية 2018) ، شاشتان نقطيتان 8x8x4 مع شرائح MAX7219 ، تم شراؤها مقابل 5 يورو للقطعة وجهاز تشفير دوار يبلغ حوالي 1 يورو.

هناك حاجة بالطبع إلى مصدر طاقة يوفر 3.3 فولت في بضع مئات من المللي أمبير. لا يتم استخدام منظم الجهد على لوحة تطوير STM32F103C8 ، ولا يمكنه توفير تيار كافٍ لشاشات العرض. تحدد ورقة البيانات الخاصة بـ MAX7219 أن جهد إمداد التشغيل يجب أن يكون بين 4.0 و 5.5 فولت ولكنه يعمل بشكل جيد عند 3.3 فولت ، ربما ليس عند استخدامه في بيئة شديدة الحرارة أو البرودة ، ولكن عند 20 درجة مئوية يكون جيدًا. والآن لا يتعين علي استخدام محولات المستوى بين وحدة التحكم الدقيقة ولوحات العرض.

الخطوة الثانية: بناء

يبني
يبني
يبني
يبني
يبني
يبني

عندما تنظر إلى الصورة ، قد ترى أنني أستخدم خطوط الطاقة على ألواح التجارب بطريقة غير تقليدية ، كلا الخطين في الأعلى هما السكة الموجبة وكلاهما في الأسفل هما السكة الأرضية. إنها الطريقة التي اعتدت القيام بها وهي تعمل بشكل جيد ، فهي تجعل الإعداد يبدو أشبه بالمخططات التي أرسمها. أيضًا ، لقد صنعت الكثير من الألواح الصغيرة ذات الأجزاء التي يمكنني توصيلها بلوحة التجارب لتسريع الأشياء وتم تكوينها جميعًا لاستخدام الخطين العلويين كخطوط موجبة وسفلية مثل الأرض. كما قلت ، الدقة هي 4 بت (16 مستوى) ، وبما أن هناك مصابيح 4x8 بجانب بعضها البعض ، فهناك فقط 32 نقطة نموذجية (نقاط). قارن ذلك مع Rigol Rigol DS1054Z (8 بت و 12 Mpts) وستلاحظ أن هذه ليست لعبة. ما هو النطاق الترددي الفعلي ، لا أعرف ، لقد اختبرته حتى 10 كيلو هرتز وهذا يعمل بشكل جيد.

الخطوة الثالثة: البرامج

البرامج
البرامج
البرامج
البرامج
البرامج
البرامج
البرامج
البرامج

IDE الذي أستخدمه هو Atollic TrueStudio والذي تم اعتماده اعتبارًا من بداية هذا العام (2018) بواسطة ST Micro Electronics وهو متاح مجانًا ، بدون حد زمني ، ولا يوجد حد لحجم الكود ، ولا توجد شاشات تذمر. إلى جانب ذلك ، أستخدم STM32CubeMX ، وهو برنامج يمدني برمز البداية ويولد تهيئة جميع الأجهزة الطرفية. ويحتوي على عرض لجميع دبابيس المتحكم الدقيق واستخداماتها. حتى إذا كنت لا تستخدم STM32CubeMX لتوليد الكود ، فهذا مفيد جدًا. أحد الأشياء التي لا أحبها هو ما يسمى HAL وهو الافتراضي لـ STM32CubeMX. أنا أفضل طريقة LowLayer للعمل.

لبرمجة وحدة التحكم الدقيقة ، أستخدم إما مبرمج / مصحح أخطاء ST-Link من ST Micro Electronics أو J-Link المصنوع بواسطة Segger. كلا الجهازين ليسا مجانيين ، على الرغم من أنه يمكنك شراء نسخ صينية منهما مقابل بضعة يورو.

الخطوة 4: حول المدونة

عنوان MAX7219 المصابيح في ما أسميه بطريقة أفقية ، 8 المصابيح بجانب بعضها البعض. بالنسبة إلى راسم الذبذبات ، كان من السهل استخدام 8 مصابيح LED فوق بعضها البعض ، لذلك قمت بإنشاء مخزن مؤقت بسيط للإطار يتم كتابته بالبيانات بطريقة رأسية ، وقراءته بالطريقة الأفقية المطلوبة. يستخدم MAX7219 رمز 16 بت لكل 8 مصابيح LED ، حيث يتم استخدام البايت الأول لمعالجة الخط المحدد. وبما أن هناك أربعة من هذه الوحدات مكدسة بجانب بعضها البعض ، مع مدخلاتهم متصلة بمخرجات الوحدة قبلها ، عليك إرسال تلك 16 بت أربع مرات للوصول إلى الوحدة الأخيرة. (آمل أن أوضح الأمور …) يتم إرسال البيانات إلى MAX7219 باستخدام SPI ، وهو بروتوكول بسيط ولكنه سريع للغاية. هذا ما كنت أقوم بتجربته ، ما مدى السرعة التي يمكنك بها إرسال البيانات إلى MAX7219. في النهاية ، عدت إلى 9 ميجا هرتز أقل بقليل من السرعة القصوى التي تحددها ورقة البيانات.

أستخدم اثنين من العدادات الأربعة المتاحة في STM32F103C8 ، أحدهما لتوليد قاعدة الوقت والآخر لقراءة المشفر الدوار ، الذي يحدد القاعدة الزمنية. ينشئ TIMER3 القاعدة الزمنية ، ويقوم بذلك عن طريق قسمة الساعة على 230 ، وتحديث العداد كل 3.2 دولارًا أمريكيًا. ساحر المشفر الدوار الذي يمكنك تحديده للحصول على عدد العداد من نبضتين على مدار الساعة إلى 2000 نبضة على مدار الساعة. لنفترض أنك اخترت 100. ثم ينشئ TIMER3 حدثًا كل 320 دولارًا أمريكيًا. يؤدي هذا الحدث إلى تشغيل ADC لتسجيل عينة من إشارة الإدخال ، وبما أن هناك 32 عينة لأخذها لشاشة واحدة ، فسيتم إكمال ذلك بعد aprox. 10 مللي ثانية. في 10 مللي ثانية يمكنك ملاءمة طول موجي واحد 100 هرتز ، أو اثنين من 200 هرتز ، وهكذا. ومع ذلك ، فإن تجاوز 3 موجات لكل شاشة يجعل من الصعب التعرف على شكل الموجة.

بالنسبة للباقي ، يمكنني فقط إحالتك إلى الكود ، وليس من الصعب متابعته حتى لو كان لديك فقط بعض الخبرة مع Arduino. في الواقع ، يمكنك صنع الشيء نفسه باستخدام Arduino ، على الرغم من أنني أشك في أنه سيعمل بسرعة "الحبة الزرقاء". STM32F103C8 عبارة عن متحكم 32 بت يعمل بسرعة 72 ميجاهرتز ، وله جهازان طرفيان SPI و ADC سريع جدًا.

الخطوة 5: Main.h

#ifndef _MAIN_H _ # عرّف _MAIN_H_

# تضمين "stm32f1xx_ll_adc.h"

# تضمين "stm32f1xx_ll_rcc.h" #include "stm32f1xx_ll_bus.h" #include "stm32f1xx_ll_system.h" #include "stm32f1xx_ll_exti.h" #include "stm32f1xx_ll_clude_xx" #include " تضمين "stm32f1xx_ll_dma.h" #include "stm32f1xx_ll_spi.h" #include "stm32f1xx_ll_tim.h" #include "stm32f1xx.h" #include "stm32f1xx_ll_gpio.h"

#ifndef NVIC_PRIORITYGROUP_0

#define NVIC_PRIORITYGROUP_0 ((uint32_t) 0x00000007) #define NVIC_PRIORITYGROUP_1 ((uint32_t) 0x00000006) #define NVIC_PRIORITYGROUP_2 ((uint32_t) 0x00000005) #define NVIC_PRIORITY)

#ifdef _cplusplus

خارجي "C" {#endif void _Error_Handler (char *، int)؛

#define Error_Handler () _Error_Handler (_ FILE_، _LINE_)

#ifdef _cplusplus} #endif

#إنهاء إذا

الخطوة 6: Main.c

# تضمين "main.h" الفراغ الثابت LL_Init (باطل) ؛ SystemClock_Config باطل (باطل) ؛ MX_GPIO_Init الفراغ الثابت (باطل) ؛ MX_ADC1_Init الفراغ الثابت (باطل) ؛ MX_SPI1_Init (باطل) ثابت ؛ MX_SPI2_Init (باطل) ثابت ؛ MX_TIM3_Init الفراغ الثابت (باطل) ؛ MX_TIM4_Init (باطل) ثابت ؛

uint16_t SPI1_send64 (uint16_t data3، uint16_t data2، uint16_t data1، uint16_t data0) ؛

uint16_t SPI2_send64 (uint16_t data3، uint16_t data2، uint16_t data1، uint16_t data0) ؛ MAX7219_1_init () باطل ، MAX7219_2_init () باطل ، erase_frame_buffer باطل (باطل) ؛ ملء الفراغ_frame_buffer (باطل) ؛ display_frame_buffer باطلة (باطلة) ؛ set_timebase باطلة (باطلة) ؛

uint8_t upper_display [4] [8] ؛ // vier bytes naast elkaar، acht onder elkaar

uint8_t lower_display [4] [8] ؛ // deze twee samen vormen de frame-buffer

uint8_t sample_buffer [32] ؛ // buffer voor de resultaten van de ADC

int main (باطل)

{LL_Init () ، SystemClock_Config () ، MX_GPIO_Init () ، MX_ADC1_Init () ، MX_SPI1_Init () ، MX_SPI2_Init () ، MX_TIM3_Init () ، MX_TIM4_Init () ،

LL_SPI_Enable (SPI1) ،

LL_SPI_Enable (SPI2) ،

LL_TIM_EnableCounter (TIM3) ،

LL_TIM_EnableCounter (TIM4) ،

LL_ADC_Enable (ADC1) ،

LL_ADC_REG_StartConversionSWStart (ADC1) ، LL_ADC_EnableIT_EOS (ADC1) ،

LL_mDelay (500) ؛ // MAX7219 يحتاج إلى بعض الوقت بعد التشغيل

MAX7219_1_init () ، MAX7219_2_init () ،

// LL_TIM_SetAutoReload (TIM3 ، 9) ؛

بينما (1)

{set_timebase () ؛ erase_frame_buffer () ، fill_frame_buffer () ؛ display_frame_buffer () ، }}

محو باطل

{int8_t x؛ int8_t ذ ؛

لـ (x = 0 ؛ x <4 ؛ x ++) // kolom_bytes {

لـ (y = 0؛ y <8؛ y ++) // lijnen {upper_display [x] [y] = 0 ؛ // all bitjes op nul lower_display [x] [y] = 0 ؛ }}}

ملء الفراغ_frame_buffer (باطل)

{uint8_t y = 0 ؛ // الجهد uint8_t tijd = 0 ؛ // tijd uint8_t display_byte ؛ // steeds 8 bits naast elkaar en dat 4 maal op een lijn uint8_t display_bit؛

لـ (tijd = 0 ؛ tijd <32 ؛ tijd ++) {display_byte = tijd / 8 ؛ display_bit = 7 - (tijd٪ 8) ؛

y = sample_buffer [tijd] ؛

إذا (y> 7) // في العرض العلوي schrijven

{upper_display [display_byte] [15-y] | = (1 << display_bit) ؛ } else // في شاشة العرض السفلية schrijven {lower_display [display_byte] [7-y] | = (1 << display_bit) ؛ }}}

display_frame_buffer باطلة (باطلة)

{

uint8_t ذ ؛ // acht lijnen boven elkaar (لكل عرض) uint16_t yl ؛ // lijnnummer voor de MAX7219

لـ (y = 0 ؛ y <8 ؛ y ++) {yl = (y + 1) << 8 ؛ // MAX7219 heeft lijnnummer في الجزء العلوي من 8 بتات من 16 بت

SPI2_send64 ((yl | upper_display [0] [y])، (yl | upper_display [1] [y])، (yl | upper_display [2] [y])، (yl | upper_display [3] [y])) ؛

SPI1_send64 ((yl | Lower_display [0] [y])، (yl | Lower_display [1] [y])، (yl | Lower_display [2] [y])، (yl | Lower_display [3] [y])) ؛ }

}

set_timebase باطلة (باطلة)

{uint8_t timebase_knop؛

timebase_knop = LL_TIM_GetCounter (TIM4) / 2 ؛

التبديل (timebase_knop)

{الحالة 0: LL_TIM_SetAutoReload (TIM3 ، 1999) ؛ استراحة؛ الحالة 1: LL_TIM_SetAutoReload (TIM3 ، 999) ؛ استراحة؛ الحالة 2: LL_TIM_SetAutoReload (TIM3 ، 499) ؛ استراحة؛ الحالة 3: LL_TIM_SetAutoReload (TIM3 ، 199) ؛ استراحة؛ الحالة 4: LL_TIM_SetAutoReload (TIM3 ، 99) ؛ استراحة؛ الحالة 5: LL_TIM_SetAutoReload (TIM3 ، 49) ؛ استراحة؛ الحالة 6: LL_TIM_SetAutoReload (TIM3 ، 19) ؛ استراحة؛ الحالة 7: LL_TIM_SetAutoReload (TIM3 ، 9) ؛ استراحة؛ الحالة 8: LL_TIM_SetAutoReload (TIM3 ، 4) ؛ استراحة؛ الحالة 9: LL_TIM_SetAutoReload (TIM3 ، 1) ؛ استراحة؛

إفتراضي:

LL_TIM_SetAutoReload (TIM3 ، 99) ، استراحة؛ }}

MAX7219_1_init باطل ()

{SPI1_send64 (0x0000 ، 0x0000 ، 0x0000 ، 0x0000) ؛ // nop SPI1_send64 (0x0C00 ، 0x0C00 ، 0x0C00 ، 0x0C00) ؛ // إيقاف التشغيل على SPI1_send64 (0x0000 ، 0x0000 ، 0x0000 ، 0x0000) ؛ // nop SPI1_send64 (0x0F00 ، 0x0F00 ، 0x0F00 ، 0x0F00) ؛ // testmode off SPI1_send64 (0x0C01 ، 0x0C01 ، 0x0C01 ، 0x0C01) ؛ // إيقاف التشغيل ، العملية العادية SPI1_send64 (0x0900 ، 0x0900 ، 0x0900 ، 0x0900) ؛ // لا يوجد فك شفرة 7seg ، 64 بكسل SPI1_send64 (0x0A07 ، 0x0A07 ، 0x0A07 ، 0x0A07) ؛ // كثافة 50٪ SPI1_send64 (0x0B07 ، 0x0B07 ، 0x0B07 ، 0x0B07) ؛ // كل الصفوف في}

MAX7219_2_init باطل ()

{SPI2_send64 (0x0000 ، 0x0000 ، 0x0000 ، 0x0000) ؛ // nop SPI2_send64 (0x0C00 ، 0x0C00 ، 0x0C00 ، 0x0C00) ؛ // إيقاف التشغيل على SPI2_send64 (0x0000 ، 0x0000 ، 0x0000 ، 0x0000) ؛ // nop SPI2_send64 (0x0F00 ، 0x0F00 ، 0x0F00 ، 0x0F00) ؛ // testmode off SPI2_send64 (0x0C01 ، 0x0C01 ، 0x0C01 ، 0x0C01) ؛ // إيقاف التشغيل ، العملية العادية SPI2_send64 (0x0900 ، 0x0900 ، 0x0900 ، 0x0900) ؛ // لا يوجد فك شفرة 7seg ، 64 بكسل SPI2_send64 (0x0A07 ، 0x0A07 ، 0x0A07 ، 0x0A07) ؛ // كثافة 50٪ SPI2_send64 (0x0B07 ، 0x0B07 ، 0x0B07 ، 0x0B07) ؛ // كل الصفوف في}

uint16_t SPI1_send64 (uint16_t data3، uint16_t data2، uint16_t data1، uint16_t data0)

{LL_GPIO_ResetOutputPin (GPIOA ، LL_GPIO_PIN_4) ،

LL_SPI_TransmitData16 (SPI1 ، بيانات 3) ؛

بينما (LL_SPI_IsActiveFlag_TXE (SPI1) == 0) {}

LL_SPI_TransmitData16 (SPI1 ، بيانات 2) ؛

بينما (LL_SPI_IsActiveFlag_TXE (SPI1) == 0) {}

LL_SPI_TransmitData16 (SPI1 ، بيانات 1) ؛

بينما (LL_SPI_IsActiveFlag_TXE (SPI1) == 0) {}

LL_SPI_TransmitData16 (SPI1، data0) ؛

بينما (LL_SPI_IsActiveFlag_BSY (SPI1) == 1) {}

LL_GPIO_SetOutputPin (GPIOA ، LL_GPIO_PIN_4) ؛

إرجاع LL_SPI_ReceiveData16 (SPI1) ، }

uint16_t SPI2_send64 (uint16_t data3، uint16_t data2، uint16_t data1، uint16_t data0)

{LL_GPIO_ResetOutputPin (GPIOB ، LL_GPIO_PIN_12) ،

LL_SPI_TransmitData16 (SPI2 ، بيانات 3) ؛

بينما (LL_SPI_IsActiveFlag_TXE (SPI2) == 0) {}

LL_SPI_TransmitData16 (SPI2 ، بيانات 2) ؛

بينما (LL_SPI_IsActiveFlag_TXE (SPI2) == 0) {}

LL_SPI_TransmitData16 (SPI2 ، بيانات 1) ؛

بينما (LL_SPI_IsActiveFlag_TXE (SPI2) == 0) {}

LL_SPI_TransmitData16 (SPI2، data0) ؛

بينما (LL_SPI_IsActiveFlag_BSY (SPI2) == 1) {}

LL_GPIO_SetOutputPin (GPIOB ، LL_GPIO_PIN_12) ؛

إرجاع LL_SPI_ReceiveData16 (SPI2) ، }

ADC1_2_IRQHandler باطل (باطل)

{static uint8_t sample_counter؛ الزناد uint8_t ؛ ثابت uint8_t previous_trigger؛

إذا (LL_ADC_IsActiveFlag_EOS (ADC1)! = إعادة تعيين)

{if (sample_counter <32) {sample_buffer [sample_counter] = LL_ADC_REG_ReadConversionData32 (ADC1) / 256 ؛ إذا كان (sample_counter <32) sample_counter ++ ؛ آخر sample_counter = 0 ؛ } else {trigger = LL_ADC_REG_ReadConversionData32 (ADC1) / 256 ؛

if ((trigger == 7) && (previous_trigger <Trigger)) // gaat niet helemaal goed bij blokgolven… {sample_counter = 0 ؛ } previous_trigger = الزناد ؛ }

LL_GPIO_TogglePin (GPIOC ، LL_GPIO_PIN_13) ؛

LL_ADC_ClearFlag_EOS (ADC1) ،

} }

ثابت الفراغ LL_Init (باطل)

{LL_APB2_GRP1_EnableClock (LL_APB2_GRP1_PERIPH_AFIO) ، LL_APB1_GRP1_EnableClock (LL_APB1_GRP1_PERIPH_PWR) ؛

NVIC_SetPriorityGrouping (NVIC_PRIORITYGROUP_4) ؛

NVIC_SetPriority (MemoryManagement_IRQn، NVIC_EncodePriority (NVIC_GetPriorityGrouping ()، 0، 0)) ؛ NVIC_SetPriority (BusFault_IRQn، NVIC_EncodePriority (NVIC_GetPriorityGrouping ()، 0، 0)) ؛ NVIC_SetPriority (UsageFault_IRQn، NVIC_EncodePriority (NVIC_GetPriorityGrouping ()، 0، 0)) ؛ NVIC_SetPriority (SVCall_IRQn، NVIC_EncodePriority (NVIC_GetPriorityGrouping ()، 0، 0)) ؛ NVIC_SetPriority (DebugMonitor_IRQn، NVIC_EncodePriority (NVIC_GetPriorityGrouping ()، 0، 0)) ؛ NVIC_SetPriority (PendSV_IRQn، NVIC_EncodePriority (NVIC_GetPriorityGrouping ()، 0، 0)) ؛ NVIC_SetPriority (SysTick_IRQn، NVIC_EncodePriority (NVIC_GetPriorityGrouping ()، 0، 0)) ؛

LL_GPIO_AF_Remap_SWJ_NOJTAG () ،

}

SystemClock_Config باطل (باطل)

{LL_FLASH_SetLatency (LL_FLASH_LATENCY_2) ، إذا (LL_FLASH_GetLatency ()! = LL_FLASH_LATENCY_2) Error_Handler () ، LL_RCC_HSE_Enable () ، بينما (LL_RCC_HSE_IsReady ()! = 1) ؛ LL_RCC_PLL_ConfigDomain_SYS (LL_RCC_PLLSOURCE_HSE_DIV_1، LL_RCC_PLL_MUL_9) ، LL_RCC_PLL_Enable () ، بينما (LL_RCC_PLL_IsReady ()! = 1) ؛ LL_RCC_SetAHBPrescaler (LL_RCC_SYSCLK_DIV_1) ، LL_RCC_SetAPB1Prescaler (LL_RCC_APB1_DIV_2) ، LL_RCC_SetAPB2Prescaler (LL_RCC_APB2_DIV_1) ، LL_RCC_SetSysClkSource (LL_RCC_SYS_CLKSOURCE_PLL) ، بينما (LL_RCC_GetSysClkSource ()! = LL_RCC_SYS_CLKSOURCE_STATUS_PLL) ، LL_Init1msTick (72000000) ؛ LL_SYSTICK_SetClkSource (LL_SYSTICK_CLKSOURCE_HCLK) ، LL_SetSystemCoreClock (72000000) ، LL_RCC_SetADCClockSource (LL_RCC_ADC_CLKSRC_PCLK2_DIV_6) ،

NVIC_SetPriority (SysTick_IRQn، NVIC_EncodePriority (NVIC_GetPriorityGrouping ()، 0، 0)) ؛

}

MX_ADC1_Init الفراغ الثابت (باطل)

{LL_ADC_InitTypeDef ADC_InitStruct ؛ LL_ADC_CommonInitTypeDef ADC_CommonInitStruct ؛ LL_ADC_REG_InitTypeDef ADC_REG_InitStruct ؛ LL_GPIO_InitTypeDef GPIO_InitStruct ؛

LL_APB2_GRP1_EnableClock (LL_APB2_GRP1_PERIPH_ADC1) ،

GPIO_InitStruct. Pin = LL_GPIO_PIN_0 ،

GPIO_InitStruct. Mode = LL_GPIO_MODE_ANALOG ، LL_GPIO_Init (GPIOA ، و GPIO_InitStruct) ؛

NVIC_SetPriority (ADC1_2_IRQn، NVIC_EncodePriority (NVIC_GetPriorityGrouping ()، 0، 0)) ؛

NVIC_EnableIRQ (ADC1_2_IRQn) ،

ADC_InitStruct. DataAlignment = LL_ADC_DATA_ALIGN_RIGHT ،

ADC_InitStruct. SequencersScanMode = LL_ADC_SEQ_SCAN_DISABLE ، LL_ADC_Init (ADC1، & ADC_InitStruct) ؛

ADC_CommonInitStruct. Multimode = LL_ADC_MULTI_INDEPENDENT ،

LL_ADC_CommonInit (_ LL_ADC_COMMON_INSTANCE (ADC1) ، & ADC_CommonInitStruct) ؛

ADC_REG_InitStruct. TriggerSource = LL_ADC_REG_TRIG_EXT_TIM3_TRGO ،

ADC_REG_InitStruct. SequencerLength = 1 ، ADC_REG_InitStruct. SequencerDiscont = LL_ADC_REG_SEQ_DISCONT_DISABLE ، ADC_REG_InitStruct. ContinuousMode = LL_ADC_REG_CONV_SINGLE ، ADC_REG_InitStruct. DMATransfer = LL_ADC_REG_DMA_TRANSFER_NONE ، LL_ADC_REG_Init (ADC1، & ADC_REG_InitStruct) ؛

LL_ADC_SetChannelSamplingTime (ADC1، LL_ADC_CHANNEL_0، LL_ADC_SAMPLINGTIME_41CYCLES_5) ،

}

MX_SPI1_Init الفراغ الثابت (باطل)

{LL_SPI_InitTypeDef SPI_InitStruct ؛ LL_GPIO_InitTypeDef GPIO_InitStruct ؛

LL_APB2_GRP1_EnableClock (LL_APB2_GRP1_PERIPH_SPI1) ،

GPIO_InitStruct. Pin = LL_GPIO_PIN_5 | LL_GPIO_PIN_7 ،

GPIO_InitStruct. Mode = LL_GPIO_MODE_ALTERNATE ، GPIO_InitStruct. Speed = LL_GPIO_SPEED_FREQ_HIGH ، GPIO_InitStruct. OutputType = LL_GPIO_OUTPUT_PUSHPULL ، LL_GPIO_Init (GPIOA ، و GPIO_InitStruct) ؛

// NVIC_SetPriority (SPI1_IRQn، NVIC_EncodePriority (NVIC_GetPriorityGrouping ()، 0، 0)) ؛

// NVIC_EnableIRQ (SPI1_IRQn) ؛

SPI_InitStruct. TransferDirection = LL_SPI_FULL_DUPLEX ،

SPI_InitStruct. Mode = LL_SPI_MODE_MASTER ، SPI_InitStruct. DataWidth = LL_SPI_DATAWIDTH_16BIT ، SPI_InitStruct. ClockPolarity = LL_SPI_POLARITY_LOW ، SPI_InitStruct. ClockPhase = LL_SPI_PHASE_1EDGE ، SPI_InitStruct. NSS = LL_SPI_NSS_SOFT ، SPI_InitStruct. BaudRate = LL_SPI_BAUDRATEPRESCALER_DIV8 ، SPI_InitStruct. BitOrder = LL_SPI_MSB_FIRST ، SPI_InitStruct. CRCCalculation = LL_SPI_CRCCALCULATION_DISABLE ، SPI_InitStruct. CRCPoly = 10 ؛ LL_SPI_Init (SPI1، & SPI_InitStruct) ؛ }

MX_SPI2_Init الفراغ الثابت (باطل)

{LL_SPI_InitTypeDef SPI_InitStruct ؛ LL_GPIO_InitTypeDef GPIO_InitStruct ؛

LL_APB1_GRP1_EnableClock (LL_APB1_GRP1_PERIPH_SPI2) ؛

GPIO_InitStruct. Pin = LL_GPIO_PIN_13 | LL_GPIO_PIN_15 ،

GPIO_InitStruct. Mode = LL_GPIO_MODE_ALTERNATE ، GPIO_InitStruct. Speed = LL_GPIO_SPEED_FREQ_HIGH ، GPIO_InitStruct. OutputType = LL_GPIO_OUTPUT_PUSHPULL ، LL_GPIO_Init (GPIOB و GPIO_InitStruct) ؛

// NVIC_SetPriority (SPI2_IRQn، NVIC_EncodePriority (NVIC_GetPriorityGrouping ()، 0، 0)) ؛

// NVIC_EnableIRQ (SPI2_IRQn) ؛

SPI_InitStruct. TransferDirection = LL_SPI_FULL_DUPLEX ،

SPI_InitStruct. Mode = LL_SPI_MODE_MASTER ، SPI_InitStruct. DataWidth = LL_SPI_DATAWIDTH_16BIT ، SPI_InitStruct. ClockPolarity = LL_SPI_POLARITY_LOW ، SPI_InitStruct. ClockPhase = LL_SPI_PHASE_1EDGE ، SPI_InitStruct. NSS = LL_SPI_NSS_SOFT ، SPI_InitStruct. BaudRate = LL_SPI_BAUDRATEPRESCALER_DIV4 ، SPI_InitStruct. BitOrder = LL_SPI_MSB_FIRST ، SPI_InitStruct. CRCCalculation = LL_SPI_CRCCALCULATION_DISABLE ، SPI_InitStruct. CRCPoly = 10 ؛ LL_SPI_Init (SPI2، & SPI_InitStruct) ؛ }

MX_TIM3_Init الفراغ الثابت (باطل)

{LL_TIM_InitTypeDef TIM_InitStruct ؛

LL_APB1_GRP1_EnableClock (LL_APB1_GRP1_PERIPH_TIM3) ،

TIM_InitStruct. Prescaler = 229 ؛

TIM_InitStruct. CounterMode = LL_TIM_COUNTERMODE_UP ، TIM_InitStruct. Autoreload = 9 ؛ TIM_InitStruct. ClockDivision = LL_TIM_CLOCKDIVISION_DIV1 ، LL_TIM_Init (TIM3 ، & TIM_InitStruct) ؛

LL_TIM_DisableARRPreload (TIM3) ،

LL_TIM_SetClockSource (TIM3 ، LL_TIM_CLOCKSOURCE_INTERNAL) ، LL_TIM_SetTriggerOutput (TIM3 ، LL_TIM_TRGO_UPDATE) ، LL_TIM_EnableMasterSlaveMode (TIM3) ، }

MX_TIM4_Init الفراغ الثابت (باطل)

{LL_TIM_InitTypeDef TIM_InitStruct ؛ LL_GPIO_InitTypeDef GPIO_InitStruct ؛

LL_APB1_GRP1_EnableClock (LL_APB1_GRP1_PERIPH_TIM4) ،

GPIO_InitStruct. Pin = LL_GPIO_PIN_6 | LL_GPIO_PIN_7 ،

GPIO_InitStruct. Mode = LL_GPIO_MODE_FLOATING ، LL_GPIO_Init (GPIOB و GPIO_InitStruct) ؛

LL_TIM_SetEncoderMode (TIM4 ، LL_TIM_ENCODERMODE_X2_TI1) ؛

LL_TIM_IC_SetActiveInput (TIM4 ، LL_TIM_CHANNEL_CH1 ، LL_TIM_ACTIVEINPUT_DIRECTTI) ، LL_TIM_IC_SetPrescaler (TIM4 ، LL_TIM_CHANNEL_CH1 ، LL_TIM_ICPSC_DIV1) ؛ LL_TIM_IC_SetFilter (TIM4 ، LL_TIM_CHANNEL_CH1 ، LL_TIM_IC_FILTER_FDIV1) ؛ LL_TIM_IC_SetPolarity (TIM4 ، LL_TIM_CHANNEL_CH1 ، LL_TIM_IC_POLARITY_RISING) ؛ LL_TIM_IC_SetActiveInput (TIM4 ، LL_TIM_CHANNEL_CH2 ، LL_TIM_ACTIVEINPUT_DIRECTTI) ، LL_TIM_IC_SetPrescaler (TIM4 ، LL_TIM_CHANNEL_CH2 ، LL_TIM_ICPSC_DIV1) ؛ LL_TIM_IC_SetFilter (TIM4 ، LL_TIM_CHANNEL_CH2 ، LL_TIM_IC_FILTER_FDIV1) ؛ LL_TIM_IC_SetPolarity (TIM4 ، LL_TIM_CHANNEL_CH2 ، LL_TIM_IC_POLARITY_RISING) ؛

TIM_InitStruct. Prescaler = 0 ؛

TIM_InitStruct. CounterMode = LL_TIM_COUNTERMODE_UP ، TIM_InitStruct. Autoreload = 19 ؛ TIM_InitStruct. ClockDivision = LL_TIM_CLOCKDIVISION_DIV1 ، LL_TIM_Init (TIM4، & TIM_InitStruct) ؛

LL_TIM_DisableARRPreload (TIM4) ،

LL_TIM_SetTriggerOutput (TIM4 ، LL_TIM_TRGO_RESET) ؛ LL_TIM_DisableMasterSlaveMode (TIM4) ، }

MX_GPIO_Init الفراغ الثابت (باطل)

{LL_GPIO_InitTypeDef GPIO_InitStruct ؛

LL_APB2_GRP1_EnableClock (LL_APB2_GRP1_PERIPH_GPIOC) ،

LL_APB2_GRP1_EnableClock (LL_APB2_GRP1_PERIPH_GPIOD) ، LL_APB2_GRP1_EnableClock (LL_APB2_GRP1_PERIPH_GPIOA) ، LL_APB2_GRP1_EnableClock (LL_APB2_GRP1_PERIPH_GPIOB) ،

LL_GPIO_SetOutputPin (GPIOC ، LL_GPIO_PIN_13) ؛

LL_GPIO_SetOutputPin (GPIOA ، LL_GPIO_PIN_4) ؛ LL_GPIO_SetOutputPin (GPIOB ، LL_GPIO_PIN_12) ؛

GPIO_InitStruct. Pin = LL_GPIO_PIN_13 ،

GPIO_InitStruct. Mode = LL_GPIO_MODE_OUTPUT ، GPIO_InitStruct. Speed = LL_GPIO_SPEED_FREQ_LOW ، GPIO_InitStruct. OutputType = LL_GPIO_OUTPUT_PUSHPULL ، LL_GPIO_Init (GPIOC ، & GPIO_InitStruct) ؛

GPIO_InitStruct. Pin = LL_GPIO_PIN_4 ،

GPIO_InitStruct. Mode = LL_GPIO_MODE_OUTPUT ، GPIO_InitStruct. Speed = LL_GPIO_SPEED_FREQ_HIGH ، GPIO_InitStruct. OutputType = LL_GPIO_OUTPUT_PUSHPULL ، LL_GPIO_Init (GPIOA ، و GPIO_InitStruct) ؛

GPIO_InitStruct. Pin = LL_GPIO_PIN_12 ،

GPIO_InitStruct. Mode = LL_GPIO_MODE_OUTPUT ، GPIO_InitStruct. Speed = LL_GPIO_SPEED_FREQ_HIGH ، GPIO_InitStruct. OutputType = LL_GPIO_OUTPUT_PUSHPULL ، LL_GPIO_Init (GPIOB و GPIO_InitStruct) ؛ }

باطل _Error_Handler (char * file، int line)

{حين (1) {}}

#ifdef USE_FULL_ASSERT

assert_failed باطل (ملف uint8_t * ، سطر uint32_t)

{ } #إنهاء إذا

موصى به: