История изменений
Исправление 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
Все что я пишу перепроверь по документации! Я не проверяю на железе, сейчас не на чем.