Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабораторная 5

.docx
Скачиваний:
0
Добавлен:
15.12.2025
Размер:
556.99 Кб
Скачать

Министерство науки и высшего образования Российской Федерации

Федеральное государственное автономное образовательное учреждение высшего образования

ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОННИКИ (ТУСУР)

Кафедра комплексной информационной безопасности электронно-вычислительных систем (КИБЭВС)

ОСНОВЫ OCPB FREERTOS, ЗНАКОМСТВО С CMSIS

Отчет по лабораторной работе №5

по дисциплине «Основы программирования микроконтроллеров»

Студенты гр. 712-2: ___________ Л.С. Болтушкин

___________ Н.А. Рыбин

___________ Д.В. Шабанова __________

Руководитель Старший преподаватель кафедры КИБЭВС

_______ __________ Д.С. Беляков

__________

Томск 2025

Введение

Целью данной лабораторной работы является углубленное изучение архитектуры ARM на примере микроконтроллера STM32F103RBT6, знакомство с основами работы в OCPB FreeRTOS и освоение навыков работы с CMSIS.

1 ХОД РАБОТЫ

На рисунке 1.1 представлены все файлы, которые были использованы в процессе выполнения лабораторной работы.

«inc» и «src» для файлов заголовков и исходных кодов соответственно. Также необходимо создать в каталоге «src» файл «main.c» и в этом каталоге создать файл «main.c».

=

Рисунок 1.1 – Файлы архива

После были распределены по созданным каталогам файлы, которые предоставлены в методическом пособии (рисунок 1.2 – 1.3).

Рисунок 1.2 – Содержимое каталога «src»

Рисунок 1.3 – Содержимое каталога «inc»

Далее были скачаны и помещены в корне проекта репозиторий с «FreeRTOS» (рисунок 1.4).

Рисунок 1.4 – Содержимое репозитория «FreeRTOS»

Согласно варианту №7 необходимо выполнить следующее задание: есть два потока. Первый поток шлет информацию о состоянии кнопки, второй - на основании этой информации включает или отключает светодиод.

Результаты выполнения работы представлен на рисунке 1.5.

Рисунок 1.5 – Вывод информации о сигнале

Заключение.

В ходе выполнения данной лабораторной работы были изучены основы работы в ОСРВ и получены навыки работы с CMSIS.

Приложение А

(обязательное)

Листинг кода Makefile

TARGET = lab5.elf

INCLUDES = -Iinc -I. -I FreeRTOS-Kernel-main/include -I FreeRTOS-Kernel-main/portable/GCC/ARM_CM3

CFLAGS = -mthumb -mabi=aapcs -mcpu=cortex-m3 -mfloat-abi=soft \

-fno-common -Wall -Os -g3 -Werror \

-DSTM32F103xB \

$(INCLUDES)

LDFLAGS = -mthumb -mabi=aapcs -mcpu=cortex-m3 -mfloat-abi=soft \

-Wl,--gc-sections \

-Wl,-TSTM32F103XB_FLASH.ld \

-L. -llab5_f103

C_SOURCES = src/main.c \

src/syscalls.c \

src/system_stm32f1xx.c \

FreeRTOS-Kernel-main/tasks.c \

FreeRTOS-Kernel-main/queue.c \

FreeRTOS-Kernel-main/list.c \

FreeRTOS-Kernel-main/timers.c \

FreeRTOS-Kernel-main/portable/GCC/ARM_CM3/port.c \

FreeRTOS-Kernel-main/portable/MemMang/heap_1.c

all: $(TARGET)

lab5.elf: $(C_SOURCES:.c=.o) startup_stm32f103xb.o

arm-none-eabi-gcc $(C_SOURCES:.c=.o) startup_stm32f103xb.o $(LDFLAGS) -o $@

%.o: %.c

arm-none-eabi-gcc $(CFLAGS) -c $< -o $@

%.o: %.s

arm-none-eabi-gcc $(CFLAGS) -c $< -o $@

upload:

openocd -f interface/stlink-v2-1.cfg -f target/stm32f1x.cfg -c "init; reset halt; flash write_image erase $(TARGET); verify_image $(TARGET); reset; exit"

clean:

rm -f *.o $(TARGET)

Приложение Б

(обязательное)

Листинг кода на С

#include "FreeRTOS.h"

#include "task.h"

#include "stm32f1xx.h"

#include <stdio.h>

#include <stdbool.h>

void init_uart();

volatile bool flag = true; // начальное значение

void prvSetupHardware(void) {

RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;

// PA5 — LED

GPIOA->CRL &= ~(GPIO_CRL_CNF5 | GPIO_CRL_MODE5);

GPIOA->CRL |= GPIO_CRL_MODE5_1; // output 2MHz

}

void vTaskPrintFlag(void *pvParameters) {

for (;;) {

if (flag)

printf("port1 = true\r\n");

else

printf("port1 = false\r\n");

vTaskDelay(pdMS_TO_TICKS(1000));

}

}

void vTaskLEDControl(void *pvParameters) {

for (;;) {

if (flag)

GPIOA->ODR |= GPIO_ODR_ODR5; // включаем LED

else

GPIOA->ODR &= ~GPIO_ODR_ODR5; // выключаем LED

flag = !flag;

vTaskDelay(pdMS_TO_TICKS(1000));

}

}

int main(void) {

prvSetupHardware();

init_uart();

printf("Restart\r\n");

xTaskCreate(vTaskPrintFlag, "PrintFlag", configMINIMAL_STACK_SIZE, NULL, 1, NULL);

xTaskCreate(vTaskLEDControl, "LEDControl", configMINIMAL_STACK_SIZE, NULL, 1, NULL);

vTaskStartScheduler();

while (1);

}