Лабораторная 5
.docxМинистерство науки и высшего образования Российской Федерации
Федеральное государственное автономное образовательное учреждение высшего образования
ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОННИКИ (ТУСУР)
Кафедра комплексной информационной безопасности электронно-вычислительных систем (КИБЭВС)
ОСНОВЫ 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);
}
