LINUX.ORG.RU

История изменений

Исправление James_Holden, (текущая версия) :

Первое. Вообще логично, если ты пишешь что у тебя не получается, приводить пример того кода, с которым не получается, а не рабочего от другого человека.

Второе. Давай ты все же будешь делать сам, а не просить готовый код каждый раз.

Вот возьмем твой код инициализации. Я глянул адреса, биты - вроде все верно. В нем не хватает самого обработчика прерываний, в «рабочем» примере это вот

TIM1_UP_isr:
    ldr    r0, =TIM1_SR
    ldr    r1, [r0]
    bic    r1, #TIM_SR_UIF
    str    r1, [r0]
 
    ldr    r0, =GPIOC_ODR
    ldr    r1, [r0]
    eor    r1, #(1 << 8)
    str    r1, [r0]
 
    bx lr

Что тут надо поменять? Название функции TIM1_UP_isr заменим на TIM3_isr. Сброс флага (первые четыре строчки функции). TIM1_SR меняем на TIM3_SR. TIM3_SR = 0x40000410 (перепроверь это по документации).

Далее, смотрим строчки в «рабочем» примере

.space  0x9c
    .word   TIM1_UP_isr + 1

Тут ты в нужное место таблицы прерываний должен поместить свою функцию-обработчик TIM3_isr, вместо TIM1_UP_isr.

То есть пишешь

    .word   TIM3_isr + 1

Число после .space будет другим, смотри Reference Manual, раздел Interrupts and Events (страница 199). Получается надо

.space 0xAC

Все что я пишу перепроверь по документации! Я не проверяю на железе, сейчас не на чем.

Исправление James_Holden, :

Первое. Вообще логично, если ты пишешь что у тебя не получается, приводить пример того кода, с которым не получается, а не рабочего от другого человека.

Второе. Давай ты все же будешь делать сам, а не просить готовый код каждый раз.

Вот возьмем твой код инициализации. Я глянул адреса, биты - вроде все верно. В нем не хватает самого обработчика прерываний, в «рабочем» примере это вот

TIM1_UP_isr:
    ldr    r0, =TIM1_SR
    ldr    r1, [r0]
    bic    r1, #TIM_SR_UIF
    str    r1, [r0]
 
    ldr    r0, =GPIOC_ODR
    ldr    r1, [r0]
    eor    r1, #(1 << 8)
    str    r1, [r0]
 
    bx lr

Что тут надо поменять? Название функции TIM1_UP_isr заменим на TIM3_isr. Сброс флага (первые четыре строчки функции). TIM1_SR меняем на TIM3_SR. TIM3_SR = 0x40000410 (перепроверь это по документации).

Далее, смотрим строчки в «рабочем» примере

.space  0x9c
    .word   TIM1_UP_isr + 1

Тут ты в нужное место таблицы прерываний должен поместить свою функцию-обработчик TIM3_UP_isr, вместо TIM1_UP_isr.

То есть пишешь

    .word   TIM3_isr + 1

Число после .space будет другим, смотри Reference Manual, раздел Interrupts and Events (страница 199). Получается надо

.space 0xAC

Все что я пишу перепроверь по документации! Я не проверяю на железе, сейчас не на чем.

Исходная версия James_Holden, :

Первое. Вообще логично, если ты пишешь что у тебя не получается, приводить пример того кода, с которым не получается, а не рабочего от другого человека.

Второе. Давай ты все же будешь делать сам, а не просить готовый код каждый раз.

Вот возьмем твой код инициализации. Я глянул адреса, биты - вроде все верно. В нем не хватает самого обработчика прерываний, в «рабочем» примере это вот

TIM1_UP_isr:
    ldr    r0, =TIM1_SR
    ldr    r1, [r0]
    bic    r1, #TIM_SR_UIF
    str    r1, [r0]
 
    ldr    r0, =GPIOC_ODR
    ldr    r1, [r0]
    eor    r1, #(1 << 8)
    str    r1, [r0]
 
    bx lr

Что тут надо поменять? Название функции TIM1_UP_isr заменим на TIM3_isr. Сброс флага (первые четыре строчки функции). TIM1_SR меняем на TIM3_SR. TIM3_SR = 0x40000410 (перепроверь это по документации).

Далее, смотрим строчки

.space  0x9c
    .word   TIM1_UP_isr + 1

Тут ты в нужное место таблицы прерываний должен поместить свою функцию-обработчик TIM3_UP_isr, вместо TIM1_UP_isr.

То есть пишешь

    .word   TIM3_isr + 1

Число после .space будет другим, смотри Reference Manual, раздел Interrupts and Events (страница 199). Получается надо

.space 0xAC

Все что я пишу перепроверь по документации! Я не проверяю на железе, сейчас не на чем.