Пренасяне на FreeModbus rtu с помощта на STM8L като пример

Подготовка на проекта

Подгответе проекта си в любимата си IDE, аз ще използвам IAR и стандартната библиотека с драйвери. Modbus режимът ще бъде само RTU. Изтеглете библиотеката FreeModbus от тук. В момента препоръчителната версия е 1.3, изтеглете я по-добре. В архива се интересуваме от папката Demo / BARE и папката modbus. Първата е зависещата от платформата част, втората е ядрото. Копирайте съдържанието на архива във вашия проект. Копирайте директорията demo/BARE в freemodbus-v1.3.0 и я преименувайте на STM8L. Добавете всички sish файлове от

    директории към вашия проект
  • freemodbus-v1.3.0\modbus\
  • freemodbus-v1.3.0\modbus\rtu\
  • freemodbus-v1.3.0\modbus\функции\
  • freemodbus-v1.3.0\STM8L\
  • freemodbus-v1.3.0\STM8L\порт\
Ето какъв трябва да е крайният резултат
stm8l

В настройките на проекта трябва да посочите пътищата за търсене за включвания Получих следния списък

$PROJ_DIR$\… $PROJ_DIR$\..\STM8L15x_StdPeriph_Driver\inc $PROJ_DIR$\..\freemodbus-v1.3.0\modbus\ $PROJ_DIR$\..\freemodbus-v1.3.0\modbus\rtu\ $PROJ_DIR$\..\freemo dbus-v1. 3.0\modbus\include\ $PROJ_DIR$\..\freemodbus-v1.3.0\STM8L\port\

Във вашия основен файл добавете #include "mb.h" #include "mbport.h"

Започнете пренасянето

Във файла mbconfig.h намерете редовете

Променете на 0 Във файла port.h трябва да дефинирате макроси, за да активирате и деактивирате прекъсвания на целевата платформа. Намерете И добавете дефиниции Освен това изтрийте реда #include там и го заменете с #include "stm8l15x.h".

Сега трябва да внедрите таймер, таймерът трябва да бъде конфигуриран така, че да генерира прекъсване след 50uS, умножено по стойността, която FreeModbus ще му даде. Ще използвам таймер 1.

Във файла porttimer.c заместваме 3 празни функции с наши собствени

Трябва също така да говорим за статичната void функция prvvTIMERExpiredISR( void ) Това е манипулаторът на прекъсване на таймера. Трябва да се модифицира, в този случай се превръща в

Освен това трябва да коментирате подобен манипулатор във файловете "stm8l15x_it.h" и "stm8l15x_it.c"

Сега нека приложим физическия канал. Нека вземем прост UART като пример. Първа инициализация на UART Във файла portserial.c

Моля, имайте предвид, че според първоначалната идея UART номерът, скоростта, паритетът и броят битове се предават на тази функция. За да опростя примерите, пренебрегвам параметрите за паритет и стоп битове и ги записвам тук. Не трябва да го правиш :-)

Следната функция е void vMBPortSerialEnable( BOOL xRxEnable, BOOL xTxEnable). Трябва да активира прекъсване за получаване/предаване.

Сега прекъсването при получаване на байт е статичен void prvvUARTRxISR( void). Подобно на прекъсването на таймера, ние го заместваме с

Прекъсване при празен предавателен буфер static void prvvUARTTxReadyISR( void ) се заменя с

Функцията, която трябва да изпрати байт към UART, изглежда така

И функцията за получаване на байт

Това завършва пренасянето.

Тестване

Съдържанието на главния файл на теста

Можете да изтеглите проекта тук Или чрез торент, файлът е прикачен към статията.

Коментари ( 66 )

В серията stm8 пристигна :)

Не трябва да се прави и така. Дърпам дробна аритметика само за да регулирам скоростта... Твърде съм алчен. По-добра целочислена аритметика катоusTim1Timerout50us * 25 / 4 илиusTim1Timerout50us * 6 + usTim1Timerout50us / 4 няма да препълни при умножение. Освен това

//Настройване на таймера, изисква се той да генерира прекъсване след 50uS * usTim1Timerout50us //изисква се да непрепълнено за секунда

1 сек = 20 000 * 50 µs. Разглеждаме 6,25 * 20 000 = 125 000 > 65535 (MAX_USHORT). Освен това > 255, към който свободно съкращавате (uint8_t). Очевидно е необходимо да се промени преразпределителят в зависимост от предадената стойност.

P.S.: Коментарите „по-добре е да не го правите по този начин“ трябва да бъдат допълнени с реда

никога не знаете колко години по-късно ще страдате „и защо не работи“, като отворите архивен проект.

1 сек = 20 000 * 50 µs. Разглеждаме 6,25 * 20 000 = 125 000 > 65535 (MAX_USHORT). Освен това > 255, към който свободно съкращавате (uint8_t). Очевидно е, че трябва да промените преразпределителя в зависимост от предадената стойност.

P.S.: Коментарите „по-добре е да не го правите по този начин“ трябва да бъдат допълнени с ред #warning TODO: parity & спира & каквото поискаш

никога не знаете колко години по-късно ще страдате „и защо не работи“, като отворите архивен проект.

Тъй като явно въведохте грешка

„Това е пробна версия, ще я поправя утре“

Фактът, че параметрите са написани по-дълбоко в кода, не е грешка.

IMHO това е грешка. Коментарите се пишат с цел.

Вижте как се прави в примерите в стандартната библиотека

Между другото, урокът „Проверете всички данни, идващи отвън“ се преподава добре от уеб програмирането.

И дай Боже да пишеш драйвери за компютри.

IMHO това е грешка. Коментарите се пишат с цел.