TM4C - прервемся..

Пока TivaWare производит впечатление более гуманного фрэймворка, нежели CMSIS. Например, внешние прерывания от кнопок.



Навесим кнопок на PD0 и PD1 (другой вывод кнопки на землю) и будем ловить прерывания при их нажатии.

Настроим пины на вход и подключим pull-up резисторы

	GPIOPinTypeGPIOInput(GPIO_PORTD_BASE, GPIO_PIN_0 | GPIO_PIN_1);
	GPIOPadConfigSet(GPIO_PORTD_BASE, GPIO_PIN_0 | GPIO_PIN_1, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU);


Укажим тип GPIO_FALLING_EDGE, зарегистрируем обработчик и разрешим прерывания.

	GPIOIntTypeSet(GPIO_PORTD_BASE, GPIO_PIN_0 | GPIO_PIN_1, GPIO_FALLING_EDGE);
	GPIOIntRegister(GPIO_PORTD_BASE, &IntD);
	GPIOIntEnable(GPIO_PORTD_BASE, GPIO_PIN_0 | GPIO_PIN_1);


IntD — функция обработчик-прерывания.

void IntD(void)
{
	uint32_t status = GPIOIntStatus(GPIO_PORTD_BASE, false);
	
	GPIOIntClear(GPIO_PORTD_BASE, GPIO_INT_PIN_0 | GPIO_PIN_1);

	if (status & GPIO_INT_PIN_0) {
		// нажата кнопка PD0
	}
	if (status & GPIO_INT_PIN_1) {
		// нажата кнопка PD1
	}
}


Пример целиком. Здесь добавлены прерывания по юзерским кнопкам на плате.
#define PART_TM4C123GH6PM
#define TARGET_IS_BLIZZARD_RB1

#include <stdint.h>
#include <stdbool.h>
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/gpio.h"
#include "driverlib/sysctl.h"
#include "driverlib/systick.h"

uint8_t ui8LED = 2;

void IntD(void)
{
	uint32_t status = GPIOIntStatus(GPIO_PORTD_BASE, false);
	
	GPIOIntClear(GPIO_PORTD_BASE, GPIO_INT_PIN_0 | GPIO_PIN_1);

	if (status & GPIO_INT_PIN_0) {
		ui8LED = 2;
	}
	if (status & GPIO_INT_PIN_1) {
		ui8LED = 4;
	}
	
	GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3, ui8LED);	// LED on
}

void IntF(void)
{
	uint32_t status = GPIOIntStatus(GPIO_PORTF_BASE, false);
	
	GPIOIntClear(GPIO_PORTF_BASE, GPIO_INT_PIN_0 | GPIO_INT_PIN_4);

	if (status & GPIO_INT_PIN_0) {
		ui8LED = 2;
	}
	if (status & GPIO_INT_PIN_4) {
		if (ui8LED == 8) {ui8LED = 2;} else {ui8LED = ui8LED*2;}
	}
	
	GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3, ui8LED);	// LED on
}
	
int main(void)
{
    SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ);

    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);

    GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3);
    GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3, 0x00);	// LED off

    GPIOPinTypeGPIOInput(GPIO_PORTF_BASE, GPIO_PIN_0 | GPIO_PIN_4);
    GPIOPadConfigSet(GPIO_PORTF_BASE, GPIO_PIN_0 | GPIO_PIN_4, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU);
	
    GPIOIntTypeSet(GPIO_PORTF_BASE, GPIO_PIN_0 | GPIO_PIN_4, GPIO_FALLING_EDGE);
    GPIOIntRegister(GPIO_PORTF_BASE, &IntF);
    GPIOIntEnable(GPIO_PORTF_BASE, GPIO_PIN_0 | GPIO_PIN_4);


    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);

    GPIOPinTypeGPIOInput(GPIO_PORTD_BASE, GPIO_PIN_0 | GPIO_PIN_1);
    GPIOPadConfigSet(GPIO_PORTD_BASE, GPIO_PIN_0 | GPIO_PIN_1, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU);
	
    GPIOIntTypeSet(GPIO_PORTD_BASE, GPIO_PIN_0 | GPIO_PIN_1, GPIO_FALLING_EDGE);
    GPIOIntRegister(GPIO_PORTD_BASE, &IntD);
    GPIOIntEnable(GPIO_PORTD_BASE, GPIO_PIN_0 | GPIO_PIN_1);

    while(1);
}


Единственное что я не разобрался — почему не ловится прерывание от кнопки SW2 (она подключена к PF0).
  • -1
  • 08 января 2014, 14:37
  • aliaksei

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

RSS свернуть / развернуть
А что за плата?
0
>> TivaWare производит впечатление более гуманного фрэймворка, нежели CMSIS

Что за бред? Каким образом TivaWare может сравниваться с CMSIS — это же разные уровни абстракции. Его корректнее сравнивать с SPL и emlib.
И да, неужели TivaWare не включает в себя CMSIS? Сильно сомневаюсь. Хотя, судя по инклудам, раскладка файлов там не стандартная, что печалит.
0
CMSIS не используется никак. Насчет другого уровня абстракции весьма спорно.
0
А где Вы видите применение камней типа TM4C? Я хотел спросить, в чем Ваша мотивация? Халявный девкит с семинара?
Дело в том, что ST опередила TI более на год (или больше), при том, что контроллеры ST быстрее, с большим объемом flash и при этом дешевле. Какой смысл TI было выпускать это — не понятно. Для портфолио?
0
Никакого не вижу. Скорее для общего развития. Мне если често ардуины хватает выше крыши.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.