Управление портами микроконтроллера в режиме ввода-вывода общего назначения (GPIO)

Содержание

Слайд 2

Постановка задачи

Согласно приведённым в данной презентации основным файлам, построить проекты MMVP_LW1_GPIO_OUT, MMVP_LW1_GPIO_IN

Постановка задачи Согласно приведённым в данной презентации основным файлам, построить проекты MMVP_LW1_GPIO_OUT,
и MMVP_LW1_GPIO_OUT_REGS управления портами ввода-вывода общего назначения и обеспечить возможность их пошаговой отладки

Слайд 3

Постановка задачи

Новый проект рекомендуется создавать на базе одного из предыдущих, ранее отлаженных,

Постановка задачи Новый проект рекомендуется создавать на базе одного из предыдущих, ранее
например, на основе «MMVP_LW0_PWM» путём его копирования через буфер обмена (см. слайды 4 – 10)

Слайд 4

Основы управления средствами Eclipse

Шаг 1. Копирование текущего проекта в буфер обмена

Основы управления средствами Eclipse Шаг 1. Копирование текущего проекта в буфер обмена

Слайд 5

Основы управления средствами Eclipse

Шаг 2. Вставка скопированного проекта из буфера обмена

Основы управления средствами Eclipse Шаг 2. Вставка скопированного проекта из буфера обмена

Слайд 6

Основы управления средствами Eclipse

Шаг 3. Коррекция имени нового проекта

Основы управления средствами Eclipse Шаг 3. Коррекция имени нового проекта

Слайд 7

Основы управления средствами Eclipse

Шаг 4. Очистка нового проекта

Основы управления средствами Eclipse Шаг 4. Очистка нового проекта

Слайд 8

Основы управления средствами Eclipse

Шаг 5. Коррекция имени нового проекта в его make-файле

Основы управления средствами Eclipse Шаг 5. Коррекция имени нового проекта в его make-файле

Слайд 9

Основы управления средствами Eclipse

Шаг 6. Проверка безошибочного построения нового проекта

Основы управления средствами Eclipse Шаг 6. Проверка безошибочного построения нового проекта

Слайд 10

Основы управления средствами Eclipse

Шаг 6. Проверка безошибочного построения нового проекта

Основы управления средствами Eclipse Шаг 6. Проверка безошибочного построения нового проекта

Слайд 11

Программа MMVP_LW1_GPIO_OUT управления портами GPIO

Файлы
info.c, startup.c, stm32f4xx_conf.h
и standalone.ld
остаются без изменений по сравнению

Программа MMVP_LW1_GPIO_OUT управления портами GPIO Файлы info.c, startup.c, stm32f4xx_conf.h и standalone.ld остаются
с проектом «MMVP_LW0_PWM»

Слайд 12

Программа MMVP_LW1_GPIO_OUT управления портами GPIO

/*
* main.c
*
* Created on: 15.10.2014

Программа MMVP_LW1_GPIO_OUT управления портами GPIO /* * main.c * * Created on:
* Author: Oleg
*/
#include "stm32f4xx_conf.h"
volatile int32_t ITM_RxBuffer;
RCC_ClocksTypeDef RCC_Clocks;

Файл main.c

Слайд 13

Программа MMVP_LW1_GPIO_OUT управления портами GPIO

const uint16_t arGPIO_Pins[] = {
GPIO_Pin_12,
GPIO_Pin_14,
GPIO_Pin_15,
};
extern const unsigned char

Программа MMVP_LW1_GPIO_OUT управления портами GPIO const uint16_t arGPIO_Pins[] = { GPIO_Pin_12, GPIO_Pin_14,
gImage_Info[];
unsigned short InfoImage_coor[] = {0, 0, 0, 0};
void ShowImage ( const unsigned char * pImage, unsigned short * pCoordinates );

Файл main.c

Слайд 14

Программа MMVP_LW1_GPIO_OUT управления портами GPIO

int main (void) {
uint8_t uiIndex = 0;
GPIO_InitTypeDef GPIO_InitStruct;
InfoImage_coor[2]

Программа MMVP_LW1_GPIO_OUT управления портами GPIO int main (void) { uint8_t uiIndex =
= ((unsigned short)gImage_Info[3] << 8) + gImage_Info[2];
InfoImage_coor[3] = ((unsigned short)gImage_Info[5] << 8) + gImage_Info[4];
/* SysTick end of count event each 1 ms */
RCC_GetClocksFreq ( &RCC_Clocks );
SysTick_Config ( RCC_Clocks.HCLK_Frequency / 1000 );
STM32f4_Discovery_LCD_Init();
ShowImage ( gImage_Info, InfoImage_coor );

Файл main.c

Слайд 15

Программа MMVP_LW1_GPIO_OUT управления портами GPIO

RCC_AHB1PeriphClockCmd ( RCC_AHB1Periph_GPIOD, ENABLE );
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStruct.GPIO_OType =

Программа MMVP_LW1_GPIO_OUT управления портами GPIO RCC_AHB1PeriphClockCmd ( RCC_AHB1Periph_GPIOD, ENABLE ); GPIO_InitStruct.GPIO_Mode =
GPIO_OType_PP;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init ( GPIOD, &GPIO_InitStruct );

Файл main.c

Слайд 16

Программа MMVP_LW1_GPIO_OUT управления портами GPIO

while (1) {
Delay ( 1000 );
GPIO_ToggleBits ( GPIOD,

Программа MMVP_LW1_GPIO_OUT управления портами GPIO while (1) { Delay ( 1000 );
arGPIO_Pins [ uiIndex++ ] );
uiIndex %= (sizeof(arGPIO_Pins) / sizeof(uint16_t));
}
return 1;
}

Файл main.c

Слайд 17

Программа MMVP_LW1_GPIO_OUT управления портами GPIO

///\brief Show small image
void ShowImage ( const unsigned char

Программа MMVP_LW1_GPIO_OUT управления портами GPIO ///\brief Show small image void ShowImage (
* pImage, unsigned short * pCoordinates ) {
unsigned long ulIndex_i, ulIndex_j;
unsigned long bmpAddress = (unsigned long) pImage + 8;
for ( ulIndex_i = 0; ulIndex_i < pCoordinates[3]; ulIndex_i++ ) {
LCD_WriteReg ( SSD2119_X_RAM_ADDR_REG, pCoordinates[0] );
LCD_WriteReg ( SSD2119_Y_RAM_ADDR_REG, pCoordinates[1] + ulIndex_i );
LCD_WriteReg ( SSD2119_RAM_DATA_REG, *(__IO uint16_t *) bmpAddress );
for ( ulIndex_j = 0; ulIndex_j < pCoordinates[2]; ulIndex_j++ ) {
LCD_WriteRAM ( *(__IO uint16_t *) bmpAddress );
bmpAddress += 2;
}
}
}

Файл main.c

Слайд 18

Программа MMVP_LW1_GPIO_OUT управления портами GPIO

Отличительные строки make-файла
# Target file name (without extension)
TARGET=MMVP_LW1_GPIO_OUT
……………………………………………
SOURCE=main.c

Программа MMVP_LW1_GPIO_OUT управления портами GPIO Отличительные строки make-файла # Target file name
\
startup.c \
Info.c \
$(CMSIS_PATH)/ST/STM32F4xx/Source/Templates/system_stm32f4xx.c \
$(STD_PeriphDriver_PATH)/src/stm32f4xx_rcc.c \
$(STD_PeriphDriver_PATH)/src/stm32f4xx_gpio.c \
$(STD_PeriphDriver_PATH)/src/stm32f4xx_fsmc.c \
$(DISCOVERY_PATH)/src/stm32f4_discovery_lcd.c \
$(DISCOVERY_PATH)/src/fonts.c

Файл makefile

Слайд 19

Коррекция проекта завершена Его необходимо построить и загрузить HEX-файл в контроллер, т.е. прошить

Коррекция проекта завершена Его необходимо построить и загрузить HEX-файл в контроллер, т.е. прошить

Слайд 20

Технология отладки в Eclipse

Технология отладки в Eclipse

Слайд 21

Настройка вызова внешней программы ST-LINK GDB SERVER
Настройка параметров GDB HARDWARE DEBUGGING отладки

Настройка вызова внешней программы ST-LINK GDB SERVER Настройка параметров GDB HARDWARE DEBUGGING
в Eclipse

Технология отладки в Eclipse

Слайд 22

Настройка вызова внешней программы ST-LINK GDB SERVER
Вкладка «Main»

Технология отладки в Eclipse

Настройка вызова внешней программы ST-LINK GDB SERVER Вкладка «Main» Технология отладки в Eclipse

Слайд 23

Настройка вызова внешней программы ST-LINK GDB SERVER
Вкладка «Build»

Технология отладки в Eclipse

Настройка вызова внешней программы ST-LINK GDB SERVER Вкладка «Build» Технология отладки в Eclipse

Слайд 24

Технология отладки в Eclipse

Запуск GDB сервера

Технология отладки в Eclipse Запуск GDB сервера

Слайд 25

Технология отладки в Eclipse

Остановка в Eclipse GDB сервера или иного процесса

Технология отладки в Eclipse Остановка в Eclipse GDB сервера или иного процесса

Слайд 26

Технология отладки в Eclipse

Подготовка к настройке параметров отладки

Технология отладки в Eclipse Подготовка к настройке параметров отладки

Слайд 27

Технология отладки в Eclipse

Настройка параметров отладки. Вкладка «Main»

Технология отладки в Eclipse Настройка параметров отладки. Вкладка «Main»

Слайд 28

Технология отладки в Eclipse

Настройка параметров отладки. Вкладка «Debugger»

Технология отладки в Eclipse Настройка параметров отладки. Вкладка «Debugger»

Слайд 29

Настройка параметров отладки. Завершающая вкладка «Startup»

Технология отладки в Eclipse

Настройка параметров отладки. Завершающая вкладка «Startup» Технология отладки в Eclipse

Слайд 30

Подготовка и настройка средства запуска очереди программ

Технология отладки в Eclipse

Подготовка и настройка средства запуска очереди программ Технология отладки в Eclipse

Слайд 31

Технология отладки в Eclipse

Горячие клавиши: – шаг с входом внутрь функции,

Технология отладки в Eclipse Горячие клавиши: – шаг с входом внутрь функции,
– шаг без входа в функцию, – запуск на дальнейшее выполнение до точки прерывания, или двойной щелчок левой клавиши мыши в крайнем вертикальном поле слева – установка/удаление точки прерывания

Слайд 32

Технология отладки в Eclipse

Остановка процесса отладки (вместе с GDB сервером)

Технология отладки в Eclipse Остановка процесса отладки (вместе с GDB сервером)

Слайд 33

Технология отладки в Eclipse

Очистка окна «Debug» от завершённых процессов и переход к

Технология отладки в Eclipse Очистка окна «Debug» от завершённых процессов и переход к привычной перспективе «C/C++»
привычной перспективе «C/C++»

Слайд 34

Программа MMVP_LW1_GPIO_IN управления портами GPIO

/*
* main.c
*
* Created on: 15.10.2014

Программа MMVP_LW1_GPIO_IN управления портами GPIO /* * main.c * * Created on:
* Author: Oleg
*/
#include "stm32f4xx_conf.h"
volatile int32_t ITM_RxBuffer;
RCC_ClocksTypeDef RCC_Clocks;

Файл main.c

Слайд 35

Программа MMVP_LW1_GPIO_IN управления портами GPIO

const uint16_t arGPIO_Pins[] = {
GPIO_Pin_12,
GPIO_Pin_14,
GPIO_Pin_15,
};
extern const unsigned char

Программа MMVP_LW1_GPIO_IN управления портами GPIO const uint16_t arGPIO_Pins[] = { GPIO_Pin_12, GPIO_Pin_14,
gImage_Info[];
unsigned short InfoImage_coor[] = {0, 0, 0, 0};
void ShowImage ( const unsigned char * pImage, unsigned short * pCoordinates );

Файл main.c

Слайд 36

Программа MMVP_LW1_GPIO_IN управления портами GPIO

int main (void) {
uint8_t uiIndex = 0;
GPIO_InitTypeDef GPIO_InitStruct;
InfoImage_coor[2]

Программа MMVP_LW1_GPIO_IN управления портами GPIO int main (void) { uint8_t uiIndex =
= ((unsigned short)gImage_Info[3] << 8) + gImage_Info[2];
InfoImage_coor[3] = ((unsigned short)gImage_Info[5] << 8) + gImage_Info[4];
/* SysTick end of count event each 1 ms */
RCC_GetClocksFreq ( &RCC_Clocks );
SysTick_Config ( RCC_Clocks.HCLK_Frequency / 1000 );
STM32f4_Discovery_LCD_Init();
ShowImage ( gImage_Info, InfoImage_coor );

Файл main.c

Слайд 37

Программа MMVP_LW1_GPIO_IN управления портами GPIO

RCC_AHB1PeriphClockCmd ( RCC_AHB1Periph_GPIOD, ENABLE );
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStruct.GPIO_OType =

Программа MMVP_LW1_GPIO_IN управления портами GPIO RCC_AHB1PeriphClockCmd ( RCC_AHB1Periph_GPIOD, ENABLE ); GPIO_InitStruct.GPIO_Mode =
GPIO_OType_PP;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init ( GPIOD, &GPIO_InitStruct );

Файл main.c

Слайд 38

Программа MMVP_LW1_GPIO_IN управления портами GPIO

RCC_AHB1PeriphClockCmd ( RCC_AHB1Periph_GPIOA, ENABLE );
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStruct.GPIO_OType =

Программа MMVP_LW1_GPIO_IN управления портами GPIO RCC_AHB1PeriphClockCmd ( RCC_AHB1Periph_GPIOA, ENABLE ); GPIO_InitStruct.GPIO_Mode =
GPIO_OType_OD;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init ( GPIOA, &GPIO_InitStruct );

Файл main.c

Слайд 39

Программа MMVP_LW1_GPIO_IN управления портами GPIO

while (1) {
if (GPIO_ReadInputDataBit ( GPIOA, GPIO_Pin_0 )

Программа MMVP_LW1_GPIO_IN управления портами GPIO while (1) { if (GPIO_ReadInputDataBit ( GPIOA,
== Bit_SET) {
GPIO_ToggleBits ( GPIOD, arGPIO_Pins [ uiIndex++ ] );
uiIndex %= (sizeof(arGPIO_Pins) / sizeof(uint16_t));
Delay ( 300 );
}
}
return 1;
}

Файл main.c

Слайд 40

Программа MMVP_LW1_GPIO_IN управления портами GPIO

///\brief Show small image
void ShowImage ( const unsigned char

Программа MMVP_LW1_GPIO_IN управления портами GPIO ///\brief Show small image void ShowImage (
* pImage, unsigned short * pCoordinates ) {
unsigned long ulIndex_i, ulIndex_j;
unsigned long bmpAddress = (unsigned long) pImage + 8;
for ( ulIndex_i = 0; ulIndex_i < pCoordinates[3]; ulIndex_i++ ) {
LCD_WriteReg ( SSD2119_X_RAM_ADDR_REG, pCoordinates[0] );
LCD_WriteReg ( SSD2119_Y_RAM_ADDR_REG, pCoordinates[1] + ulIndex_i );
LCD_WriteReg ( SSD2119_RAM_DATA_REG, *(__IO uint16_t *) bmpAddress );
for ( ulIndex_j = 0; ulIndex_j < pCoordinates[2]; ulIndex_j++ ) {
LCD_WriteRAM ( *(__IO uint16_t *) bmpAddress );
bmpAddress += 2;
}
}
}

Файл main.c

Слайд 41

Программа MMVP_LW1_GPIO_OUT_REGS управления портами GPIO

#include "stm32f4xx_conf.h"
volatile int32_t ITM_RxBuffer;
RCC_ClocksTypeDef RCC_Clocks;
extern const unsigned char

Программа MMVP_LW1_GPIO_OUT_REGS управления портами GPIO #include "stm32f4xx_conf.h" volatile int32_t ITM_RxBuffer; RCC_ClocksTypeDef RCC_Clocks;
gImage_Info[];
unsigned short InfoImage_coor[] = {0, 0, 0, 0};
void ShowImage ( const unsigned char * pImage, unsigned short * pCoordinates );

Файл main.c

Слайд 42

Программа MMVP_LW1_GPIO_OUT_REGS управления портами GPIO

int main (void) {
GPIO_InitTypeDef GPIO_InitStruct;
InfoImage_coor[2] = ((unsigned short)gImage_Info[3]

Программа MMVP_LW1_GPIO_OUT_REGS управления портами GPIO int main (void) { GPIO_InitTypeDef GPIO_InitStruct; InfoImage_coor[2]
<< 8) + gImage_Info[2];
InfoImage_coor[3] = ((unsigned short)gImage_Info[5] << 8) + gImage_Info[4];
/* SysTick end of count event each 1 ms */
RCC_GetClocksFreq ( &RCC_Clocks );
SysTick_Config ( RCC_Clocks.HCLK_Frequency / 1000 );
STM32f4_Discovery_LCD_Init();
ShowImage ( gImage_Info, InfoImage_coor );

Файл main.c

Слайд 43

Программа MMVP_LW1_GPIO_OUT_REGS управления портами GPIO

// Далее следует программный блок непосредственного регистрового

Программа MMVP_LW1_GPIO_OUT_REGS управления портами GPIO // Далее следует программный блок непосредственного регистрового
управления GPIO
int * pGeneralPointer;
uint8_t uiIndex = 0;
const uint8_t arGPIO_Pins[] = { 12, 15, 14 };
pGeneralPointer = (int *)0x40023830;
*pGeneralPointer = 7;
pGeneralPointer = (int *)0x40020C00;
*pGeneralPointer &= ~((0b11 << (arGPIO_Pins[0] * 2))
| (0b11 << (arGPIO_Pins[1] * 2))
| (0b11 << (arGPIO_Pins[2] * 2)));
*pGeneralPointer |= ((0x01 << (arGPIO_Pins[0] * 2))
| (0x01 << (arGPIO_Pins[1] * 2))
| (0x01 << (arGPIO_Pins[2] * 2)));

Файл main.c

В программный код внедрена ошибка!!!

Слайд 44

Программа MMVP_LW1_GPIO_OUT_REGS управления портами GPIO

while (1) {
Delay ( 1000 );
pGeneralPointer = (int

Программа MMVP_LW1_GPIO_OUT_REGS управления портами GPIO while (1) { Delay ( 1000 );
*)0x40020C14;
*pGeneralPointer ^= (1 << arGPIO_Pins [ uiIndex++ ]);
uiIndex %= (sizeof(arGPIO_Pins) / sizeof(uint8_t));
}
return 1;
}

Файл main.c

Слайд 45

Программа MMVP_LW1_GPIO_OUT_REGS управления портами GPIO

///\brief Show small image
void ShowImage ( const unsigned char

Программа MMVP_LW1_GPIO_OUT_REGS управления портами GPIO ///\brief Show small image void ShowImage (
* pImage, unsigned short * pCoordinates ) {
unsigned long ulIndex_i, ulIndex_j;
unsigned long bmpAddress = (unsigned long) pImage + 8;
for ( ulIndex_i = 0; ulIndex_i < pCoordinates[3]; ulIndex_i++ ) {
LCD_WriteReg ( SSD2119_X_RAM_ADDR_REG, pCoordinates[0] );
LCD_WriteReg ( SSD2119_Y_RAM_ADDR_REG, pCoordinates[1] + ulIndex_i );
LCD_WriteReg ( SSD2119_RAM_DATA_REG, *(__IO uint16_t *) bmpAddress );
for ( ulIndex_j = 0; ulIndex_j < pCoordinates[2]; ulIndex_j++ ) {
LCD_WriteRAM ( *(__IO uint16_t *) bmpAddress );
bmpAddress += 2;
}
}
}

Файл main.c

Имя файла: Управление-портами-микроконтроллера-в-режиме-ввода-вывода-общего-назначения-(GPIO).pptx
Количество просмотров: 37
Количество скачиваний: 0