Примеров обработки прерывания с помощью таймера что-то не нашел (наверное искал не особо тщательно:)), и поэтому накидал код, почитав документацию. Но, к сожалению, он не работает.
Хочу с помощью TMR1_CH4 (это порт PC10) обработать прерывание. На PC10 припаян провод с кнопкой, при нажатии на которую в порт подается 1
*****
void gpio_init()
{
****
RST_CLK_PCLKcmd(RST_CLK_PCLK_PORTC, ENABLE);
port_init.PORT_FUNC = PORT_FUNC_OVERRID; /** test */
port_init.PORT_MODE = PORT_MODE_DIGITAL;
port_init.PORT_SPEED = PORT_SPEED_MAXFAST;
port_init.PORT_OE = PORT_OE_IN;
port_init.PORT_Pin = PORT_Pin_10;
PORT_Init(MDR_PORTC, &port_init);
****
}
void timer_init(void)
{
MDR_RST_CLK->PER_CLOCK |= 1 << 14; /** разрешение тактирования MDR_TIMER1 */
MDR_RST_CLK->PER_CLOCK |= 1 << 16; /** разрешение тактирования MDR_TIMER3 */
MDR_RST_CLK->TIM_CLOCK =( /** плак-смайл */
0 /** делитель тактовой частоты MDR_TIMER1 */
| (1 << 24) /** разешение тактирования MDR_TIMER1 */
| (0 << 16) /** делитель тактовой частоты MDR_TIMER3 */
| (1 << 26) /** разешение тактирования MDR_TIMER3 */
);
/** Режим захвата (для тестовой ноги с кнопкой) */
MDR_TIMER1->CNTRL = 0x00000000; /** Режим инициализации таймера */
/** Настраиваем работу основного счетчика */
MDR_TIMER1->CNT = 0x00000000; /** Начальное значение счетчика */
MDR_TIMER1->PSG = 0x00000000; /** Предделитель частоты */
MDR_TIMER1->ARR = 0x000000FF; /** Основание счета */
MDR_TIMER1->IE = 0x00001E00; /** Разрешение генерировать прерывание
* по переднему фронту на выходе CAP по всем каналам */
/** Режим работы каналов - захват */
MDR_TIMER1->CH4_CNTRL = 0x00008003;
/** Режим работы выхода канала – канал на выход не работает */
MDR_TIMER1->CH4_CNTRL1= 0x00000000;
MDR_TIMER1->CNTRL = 0x00000001; /** Счет вверх по TIM_CLK. Разрешение работы таймера */
NVIC_EnableIRQ(Timer1_IRQn);
}
*****
void Timer1_IRQHandler(void)
{
****
код всякий
****
MDR_TIMER1->CNT = 0x0000;
MDR_TIMER1->STATUS &= ~(1 << 1);
NVIC_ClearPendingIRQ(Timer1_IRQn);
}
но на нажатие кнопки, таймер ничего делать не хочет..
Скорее всего, я как-то неправильно настроил порт и/или таймер.
Как мне правильно настроить таймер? (порт, думаю, всё таки настроен правильно)