Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.73/33: Рейтинг темы: голосов - 33, средняя оценка - 4.73
wypuk
0 / 0 / 0
Регистрация: 23.05.2010
Сообщений: 4
1

Отладка в Keil uVision 4

30.08.2013, 15:38. Просмотров 6204. Ответов 7
Метки нет (Все метки)

Немного разобрался с периферией, прерываниями, с ассемблером и попробовал запилить свою мигалку.
Установил для Keil плагин CooCox и настроил по инструкции DI. Контроллер прошился, но есть два НО!
1. Почему-то контроллер прошивается, а программа начинает работать сама собой, т.е. не в пошаговом режиме под моим контролем!
Вот такие настройки у меня стоят в keil. что подскажете?






2. Почему-то работа программы в симуляторе и на PB2 отличается. Программа просто раз в секунду по прерыванию тим2 управляет первыми 8-ю выводами порта А. Вот исходник на ассемблере:
Код
AREA        |PROGROMMA|, CODE, READONLY

INCLUDE RCC.S

GPIOA_BASE      EQU   0x40010800
GPIOA_CRL       EQU   (GPIOA_BASE + 0x00)
GPIOA_CRH       EQU   (GPIOA_BASE + 0x04)
GPIOA_IDR       EQU   (GPIOA_BASE + 0x08)
GPIOA_ODR       EQU   (GPIOA_BASE + 0x0C)
GPIOA_BSRR      EQU   (GPIOA_BASE + 0x10)
TIM2_BASE       EQU   0x40000000
TIM2_CR1        EQU   (TIM2_BASE + 0x00)
TIM2_CR2        EQU   (TIM2_BASE + 0x04)
TIM2_SMCR       EQU   (TIM2_BASE + 0x08)
TIM2_DIER       EQU   (TIM2_BASE + 0x0C)
TIM2_SR         EQU   (TIM2_BASE + 0x10)
TIM2_EGR        EQU   (TIM2_BASE + 0x14)
TIM2_CNT        EQU   (TIM2_BASE + 0x24)
TIM2_PSC        EQU   (TIM2_BASE + 0x28)
TIM2_ARR        EQU   (TIM2_BASE + 0x2C)
NVIC_BASE       EQU   0xE000E100
NVIC_ISER0      EQU   (NVIC_BASE + 0x00)

; Сектор прерываний

TIM2_IRQHomdler PROC                          ; Прерывание TIM2
EXPORT    TIM2_IRQHomdler

MOV32 R0, #GPIOA_IDR
LDR   R1, [R0]
EOR   R1, R4
LSR   R0, R4, #1              ; Мигалка на 8-ми младших разрядах
ORR   R0, #0x0080
MOV   R4, R0
MOV32 R0, #GPIOA_ODR
STR   R1, [R0]

MOV32 R0, #TIM2_SR
MOV   R1, #0
STR   R1, [R0]

BX    LR
ENDP

; Iniciotysation Code

System_Init     PROC
EXPORT    System_Init

MOV32 R0, #HSEON_BB           ; В R0 помещам адрес бита HSEON в bit bomd otyas
MOV   R1, #1
STR   R1, [R0]                ; Переключаемся на внешний кварц, устанавливая бит HSEON

MOV32 R0, #HSERDY_BB
M1              LDR   R1, [R0]                ; Читаем бит HSERDY по адресу в bit bomd region
ADD   R2, #1
CMP   R2, #0x000000FF         ; если досчитали до конца и флаг HSERDY не установился, то переходим на обработку ошибки на M397
BEQ.W M397                    ; Ждем пока внешний генератор не выйдет в рабочий режим, т.е. пока не установится бит HSERDY
CMP   R1, #0                  ; Проверяем флаг готовности
BEQ   M1                      ; если флаг не установился ждем пока он установится

MOV32 R0, #FLASH_ACR          ; Теперь настраиваем предвыборку Ftosh, т.к. планируем работать на 72 МГц
MOV   R1, #(PRFTBE + LATENCY1)
STR   R1, [R0]                ; Включили буфер предвыборки и настроили на 2 цикла ожидания

MOV32 R0, #RCC_CFGR
MOV32 R1, #(PLLMUL2 + PLLSRC + PPRE12)
STR   R1, [R0]                ; Сохраняем настройки в RCC_CFGR

MOV32 R0, #PLLON_BB           ; Запускаю схему PLL в регистре RCC_CR
MOV   R1, #1
STR   R1, [R0]

MOV32 R0, #PLLRDY_BB
M2              LDR   R1, [R0]                ; читаем флаг готовности PLL
CMP   R1, #0                  ; Проверяем флаг готовности
BEQ   M2                      ; пока не установится в 1

MOV32 R0, #SW1_BB
MOV   R1, #1
STR   R1, [R0]                ; Выбираем тактовый сигнал Sysclk от PLL

MOV32 R0, #SWS1_BB            ; ожидаем пока Sysclck не переключится на PLL
M3              LDR   R1, [R0]                ; читаем флаг готовности SWS1
CMP   R1, #0                  ; Проверяем флаг готовности
BEQ   M3                      ; ждем пока не установится в 1

; Инициализация портов ввода-вывода

MOV32 R0, #RCC_APB2ENR
MOV32 R1, #IOPAEN
STR   R1, [R0]

MOV32 R0, #GPIOA_CRL
MOV32 R1, #0x22222222           ; PUSH-PULL 2МГц
STR   R1, [R0]

MOV32 R0, #GPIOA_CRH
MOV32 R1, #0x88888888           ; PULL-UP/PULL-DOWN 2МГц
STR   R1, [R0]

MOV32 R0, #GPIOA_BSRR
MOV32 R1, #0x000000FF
STR   R1, [R0]                  ; Установить биты 0-7 в порту А

; Инициализация таймера TIM2

MOV32 R0, #RCC_APB1ENR         ; включаю тактирование
MOV32 R1, #TIM2EN
STR   R1, [R0]

MOV32 R0, #TIM2_PSC              ; задаю делитель
MOV   R1, #0x8CA0
STR   R1, [R0]

MOV32 R0, #TIM2_ARR              ; максимальное значение счетчика после которого сброс
MOV   R1, #0x03E8
STR   R1, [R0]

MOV32 R0, #TIM2_CNT             ; обнуляю счетчик
MOV   R1, #0x0000
STR   R1, [R0]

MOV32 R0, #TIM2_DIER             ; разрешаю прерывание при событии переполнения - это бит UIE
MOV   R1, #0x0001
STR   R1, [R0]

MOV32 R0, #TIM2_CR1               ; прямой счет DIR = 0, генерация только события переполнение URS = 1
MOV   R1, #0x0005                    ; и включаю таймер CEN = 1
STR   R1, [R0]

; Разрешение прерываний в NVIC

CPSIE I

MOV32 R0, #NVIC_ISER0
MOV32 R1, #0x10000000
STR   R1, [R0]

MOV   R4, #0x80

BX          LR

M397            ; где-то здесь нужно что-то сделать
; дабы обработать отказ HSE
BX          LR

ENDP

; My Appication

Main            PROC
EXPORT      Main

B           Main
ENDP

END
Так она работает в симуляторе. (сорри за плохое качаство)
Програмка останавливается на брекпоинте в прерывании таймера и щелчком опять запуск
http://www.youtube.com/watch?v=lyOkuKGMV-w
А в живую на плате так:
http://www.youtube.com/watch?v=lauJPuW8yW8
Что за чудеса? Как видно здесь остаются гореть несколько СД, а должны попеременно моргать.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.08.2013, 15:38
Ответы с готовыми решениями:

Отладка в Keil uVision: неверные значения в массивах
Вопрос про отладку stm32f1 (юзаю st-link). Обновился недавно до Keil 4.60, но по-прежнему не могу...

Keil uVision V5.23
Всем привет! Обновился до последней версии возник вопрос: Раньше было - при выделении функции, и...

Keil uVision и STM8
а KEIL с STM8 не дружат? А под чем лучше программу тогда для STM8 писать?

Debug в Keil uVision
В Keil uVision в режиме debug есть мега полезная фича - Logic Anotyzer, но возникла такая трабла:...

STM32 и KEIL uVision
подскажите плс, не могу найти синтаксис перевода static uint32_t в unsykned char *

7
wypuk
0 / 0 / 0
Регистрация: 23.05.2010
Сообщений: 4
30.08.2013, 15:45 2
Вот проект
[139.74 Кб]

и моя недопиленая библиотека с адресами
[14.33 Кб]
0
osmy
0 / 0 / 0
Регистрация: 07.03.2013
Сообщений: 176
30.08.2013, 17:49 3
Нужно адрес записывать базовый
MOV32 R0, #TIM2, а далее пользоваться смещением на регистр.

MOV R1, #0x03E8 ; максимальное значение счетчика после которого сброс
STR R1, [R0, #ARR]

MOV R1, #0x0001
STR R1, [R0, #DIER] ; разрешаю прерывание при событии переполнения - это бит UIE

Включая UIE, ты обнуляешь остальные!!!!!!!!!!
Надо же
LDRB R1, [R0, #DIER]
ORR R1,1
STRB R1, [R0, #DIER]
дописываеш B и команда работает только с первым байтом а не со всеми четырьмя
такие команды знаеш логические
BIC - очистка значащих битов
AND -очистка не значащих битов
ORR -установка значащих битов
ORN - установка не значащих битов
EOR- инверсия значащих битов
NEG- инверсия всех битов
а не так
Код
                MOV32 R0, #TIM2_PSC              ; задаю делитель
MOV   R1, #0x8CA0
STR   R1, [R0]

MOV32 R0, #TIM2_ARR              ; максимальное значение счетчика после которого сброс
MOV   R1, #0x03E8
STR   R1, [R0]

MOV32 R0, #TIM2_CNT             ; обнуляю счетчик
MOV   R1, #0x0000
STR   R1, [R0]

MOV32 R0, #TIM2_DIER             ; разрешаю прерывание при событии переполнения - это бит UIE
MOV   R1, #0x0001
STR   R1, [R0]

MOV32 R0, #TIM2_CR1               ; прямой счет DIR = 0, генерация только события переполнение URS = 1
MOV   R1, #0x0005                    ; и включаю таймер CEN = 1
STR   R1, [R0]
0
wypuk
0 / 0 / 0
Регистрация: 23.05.2010
Сообщений: 4
30.08.2013, 22:15 4
Цитата Сообщение от osmy
Нужно адрес записывать базовый
Да, согласен... так конечно компактней будет.
Но вопрос не в этом.. Почему все-таки отладка не работает как надо?
И почему симулятор симулирует одно, а на железе совсем другая песня?
Цитата Сообщение от osmy
Включая UIE, ты обнуляешь остальные!!!!!!!!!!
Я в курсе, понимаю что нужно чтение-модификация-запись, но остальные прерывания меня-то в данный момент не интересовали потому сейчас и не принципиально.
0
30.08.2013, 22:15
osmy
0 / 0 / 0
Регистрация: 07.03.2013
Сообщений: 176
31.08.2013, 07:47 5
Железяка делает то, что ты ей говоришь, она ещё не умеет думать
TIM2_IRQHomdler PROC ; Прерывание TIM2
EXPORT TIM2_IRQHomdler

MOV32 R0, #GPIOA_IDR
LDR R1, [R0]
EOR R1, R4
LSR R0, R4, #1 ; Мигалка на 8-ми младших разрядах
ORR R0, #0x0080
MOV R4, R0
MOV32 R0, #GPIOA_ODR
STR R1, [R0]

MOV32 R0, #TIM2_SR
MOV R1, #0
STR R1, [R0]

BX LR
ENDP
Это что за GPIOA_IDR, ты разве кнопки используешь и читаешь нажатие на них, а ноги настроены должны быть для этого регистра как Input?
Попробуй для начала что попроще и используй только GPIOA_ODR, что на нём будет то гореть и будет.
0
wypuk
0 / 0 / 0
Регистрация: 23.05.2010
Сообщений: 4
31.08.2013, 11:51 6
Цитата Сообщение от osmy
Железяка делает то, что ты ей говоришь, она ещё не умеет думать
Ну... меня железяка судя по всему слушаться еще не хочет.
С первым своим вопросом разобрался. Всего лишь нужно было вместо Use symulator поставить Use CooCox debugger:


И после этого произошло самое интересное!
При работе с дебаггером в пошаговом режиме прога работает правильно - как и задумывалось:
http://www.youtube.com/watch?v=UAAQusosvVg
Как только отключаю отладку - живет своей жизнью
Такое ощущение, как будто прошивка не изменяется при новой заливке - работает то что я залил в первый раз:
http://www.youtube.com/watch?v=lauJPuW8yW8
Правда когда я меняю временные интервалы и заново перепрошиваю, светодиоды светят также но медленней, так что такой вариант отпадает.
0
wypuk
0 / 0 / 0
Регистрация: 23.05.2010
Сообщений: 4
01.09.2013, 22:54 7
Мужики, подскажите! Не знаю что и думать!
Почему контроллер выполняет программу по разному когда он работает под управлением компьютера в режиме отладки и когда работает самостоятельно? Причем в режиме отладчика работает как надо, а при самостоятельной работе непонятные вещи вытворяет. Уверен, что должно быть какое-то логическое объяснение всему этому.
Просто стоит задача разработать довольно серьезное устройство, и такое непредсказуемое поведение недопустимо. Точнее устройство я уже разработал, отладил и оно работает на AVR, просто нужно перенести на новую платформу, добавив некоторые дополнительные функции (AVR с этими функциями не справится). А тут такое... со светодиодами совладать не получается(((
Вот обработчик прерывания tim2. Здесь простое суммирование.
Код
TIM2_IRQHomdler PROC                          ; Прерывание TIM2
EXPORT    TIM2_IRQHomdler

MOV32 R0, #GPIOA_BASE
LDRB  R1, [R0, #GPIOA_ODR]
ADD   R1, #1
STRB  R1, [R0, #GPIOA_ODR]

MOV32 R0, #TIM2_UIF_BB
MOV   R1, #0
STR   R1, [R0]

BX    LR

ENDP
На видео сначала работает самостоятельно, а потом переключаю на JTAG и пошагово клацаю на компьютере.
Обратите внимание на левый светодиод. Он должен быть как младший 0й разряд регистра R1 в программе. При самостоятельной работе процессора он не изменяет свое значение - постоянно горит. А вот второй светодиод должен быть как 1й разряд регистра R1, а работает как будто 0й.
При управлении от отладчика все нормально.... чудеса, да и только.
http://www.youtube.com/watch?v=md1HwmdKZCs
Или смотрите посты выше - таже песня, только с немного другим обработчиком прерывания.
0
osmy
0 / 0 / 0
Регистрация: 07.03.2013
Сообщений: 176
02.09.2013, 08:07 8
Да, чудеса, больше не скажешь.
0
02.09.2013, 08:07
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.09.2013, 08:07

Среда разработки Keil uVision 4
Добрый день ! Подскажите пожалуйста : 1) перед установкой среду разработки Keil uVision 4 ...

Programming Algorithm (Keil uVision)
Господа, настраиваю Keil под STM32, а в списке Prokramming Algorithm только эти два алгоритма....

Ошибка при запуске кода в keil uvision 5
Доброго времени суток. Являюсь начинающий разработчиком МК под stm32f051, по-этому прошу...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru