реклама на сайте
подробности

 
 
3 страниц V   1 2 3 >  
Closed TopicStart new topic
> отладка в Keil
mihlit
сообщение Aug 18 2018, 10:22
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 34
Регистрация: 7-04-18
Пользователь №: 103 011



Код
GPIOD->BSRR |= GPIO_BSRR_BS2;            //Request -> 1
    Delay(1);
    GPIOD->BSRR |= GPIO_BSRR_BR2;            //Request -> 0
    
    while(!(GPIOD->IDR & GPIO_IDR_IDR3)) {}    //ждать Ready
    
        for(i=0; i<16; i++)
        {
            GPIOD->BSRR |= GPIO_BSRR_BS6;            //Read -> 1
            buf[i] = GPIO_ReadInputData(GPIOC);
            GPIOD->BSRR |= GPIO_BSRR_BR6;            //Read -> 0
        }
        
    while(1)
    {
        
    }

Когда программа запускается по сбросу, лог. анализатор показывает обмен сигналами между МК и внешним устройством.
Если я запускаю программу в отладчике, на строчке

while(!(GPIOD->IDR & GPIO_IDR_IDR3)) {} //ждать Ready
отладчик зависает. Объясните начинающему (стаж 4,5 мес), почему так происходит?
Go to the top of the page
 
+Quote Post
Obam
сообщение Aug 18 2018, 14:19
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



IDR, который для GPIOD, часом не мониторится в окошке Keil-а? Если так, то отладчик флажок вычитывает.
Обычно, флажки, сбрасываемые чтением, в окошках отладчика смотреть не полезно (при отладке wink.gif ).

"Зависает" и "не идет дальше" - не одно и то же.


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
Arlleex
сообщение Aug 18 2018, 16:13
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264



Цитата(Obam @ Aug 18 2018, 17:19) *
IDR, который для GPIOD, часом не мониторится в окошке Keil-а? Если так, то отладчик флажок вычитывает.

Это не бит с доступом типа "сброс при чтении".

mihlit, когда заходите в отладку, процессор прошивается актуальной прошивкой, запускает ее выполнение, успевает сколько-то выполниться и затем отладчик сбрасывает его, начиная выполнять код заново. Поэтому с большой долей вероятности обмен Ваш уже завершился с устройством и повторный обмен не предусмотрен - поэтому лог. 1 на линии больше никогда не будет.
Go to the top of the page
 
+Quote Post
x893
сообщение Aug 18 2018, 16:14
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 333
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



В IDR при чтении нисего не сбрасывается.
Для GPIOD->BSRR не надо |=, просто =
Go to the top of the page
 
+Quote Post
mihlit
сообщение Aug 19 2018, 01:48
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 34
Регистрация: 7-04-18
Пользователь №: 103 011



"Поэтому с большой долей вероятности обмен Ваш уже завершился с устройством и повторный обмен не предусмотрен - поэтому лог. 1 на линии больше никогда не будет."
Действительно, сейчас внешнее устройство снимает сигал готовности, после передачи пакета данных.
Получается, что я в режиме отладки не могу посмотреть данные в buf[]?

Кнопки пошагового выполнения становятся неактивными - это "Зависает" или "не идет дальше"?

Сообщение отредактировал mihlit - Aug 19 2018, 02:09
Go to the top of the page
 
+Quote Post
Arlleex
сообщение Aug 19 2018, 07:25
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264



Цитата(mihlit @ Aug 19 2018, 04:48) *
Действительно, сейчас внешнее устройство снимает сигал готовности, после передачи пакета данных.
Получается, что я в режиме отладки не могу посмотреть данные в buf[]?

Можете. Для этого Вам необходимо пересмотреть протокол передачи данных. Ну или на крайний случай, сделайте временный костыль: в начале main() сделайте задержку секунды в 3.
Кстати. Галочка в настройках отладчика Download To Flash->Reset and Run не стоит? Сбросьте ее.

Цитата(mihlit @ Aug 19 2018, 04:48) *
Кнопки пошагового выполнения становятся неактивными - это "Зависает" или "не идет дальше"?

Они в любом случае будут недоступны, если процессор находится в состоянии выполнения команд. Стоит Вам поставить точку останова на Ваш "зацикленный" круг ада - и Вы увидите, что кнопки разблокируются.
Go to the top of the page
 
+Quote Post
mihlit
сообщение Aug 19 2018, 10:06
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 34
Регистрация: 7-04-18
Пользователь №: 103 011



Цитата
Можете. Для этого Вам необходимо пересмотреть протокол передачи данных.

Я примерно это и предполагал - поэтому и уже снова открыл Quartus.
Цитата
Галочка в настройках отладчика Download To Flash->Reset and Run

не очень разбираюсь в Кейле, искал в свойствах проекта, (волшебная палочка biggrin.gif ) не нашел.
Go to the top of the page
 
+Quote Post
Arlleex
сообщение Aug 19 2018, 10:50
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264



Цитата(mihlit @ Aug 19 2018, 13:06) *
Я примерно это и предполагал - поэтому и уже снова открыл Quartus.

не очень разбираюсь в Кейле, искал в свойствах проекта, (волшебная палочка biggrin.gif ) не нашел.

Flash->Configure Flash Tools->Debug->Settings->Flash Download->Reset and Run.
Go to the top of the page
 
+Quote Post
mihlit
сообщение Aug 19 2018, 11:22
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 34
Регистрация: 7-04-18
Пользователь №: 103 011



Дважды смотрел вкладку, но искал установленные птички - поэтому и не увидел. Сброшена она.
Ладно, спасибо всем, буду переделывать прошивку CPLD. Смущает только одно - всегда МК был мастером для периферии, а теперь что, по прерыванию обрабатывать прием данных, а если они сейчас не нужны? Ладно, разберусь.
Еще раз всем спасибо.
Go to the top of the page
 
+Quote Post
mihlit
сообщение Sep 1 2018, 10:07
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 34
Регистрация: 7-04-18
Пользователь №: 103 011



Чтобы не плодить тем, спрошу здесь, кто-нибудь подскажите:
Есть в GPIO регистр GPIOx_AFRH.
Как в нем установить AFRH15[3:0] =5?
Записать магическое число 0х50000000 или есть какой-то дефайн? Смотрел stm32f4xx.h, stm32f4_gpio.h - не нашел. Ткните-пните в нужном направлениию
Go to the top of the page
 
+Quote Post
Arlleex
сообщение Sep 1 2018, 12:08
Сообщение #11


Местный
***

Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264



Цитата(mihlit @ Sep 1 2018, 14:07) *
Чтобы не плодить тем, спрошу здесь, кто-нибудь подскажите:
Есть в GPIO регистр GPIOx_AFRH.
Как в нем установить AFRH15[3:0] =5?
Записать магическое число 0х50000000 или есть какой-то дефайн? Смотрел stm32f4xx.h, stm32f4_gpio.h - не нашел. Ткните-пните в нужном направлениию

В stm32f4xx_gpio.h есть
Код
#define GPIO_AF_SPI1          ((uint8_t)0x05)  /* SPI1 Alternate Function mapping      */
#define GPIO_AF_SPI2          ((uint8_t)0x05)  /* SPI2/I2S2 Alternate Function mapping */
#define GPIO_AF_SPI4          ((uint8_t)0x05)  /* SPI4 Alternate Function mapping      */
#define GPIO_AF_SPI5          ((uint8_t)0x05)  /* SPI5 Alternate Function mapping      */
#define GPIO_AF_SPI6          ((uint8_t)0x05)  /* SPI6 Alternate Function mapping      */

А в В stm32f4xx_gpio.c есть
Код
void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF)
{
  uint32_t temp = 0x00;
  uint32_t temp_2 = 0x00;
  
  /* Check the parameters */
  assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
  assert_param(IS_GPIO_PIN_SOURCE(GPIO_PinSource));
  assert_param(IS_GPIO_AF(GPIO_AF));
  
  temp = ((uint32_t)(GPIO_AF) << ((uint32_t)((uint32_t)GPIO_PinSource & (uint32_t)0x07) * 4));
  GPIOx->AFR[GPIO_PinSource >> 0x03] &= ~((uint32_t)0xF << ((uint32_t)((uint32_t)GPIO_PinSource & (uint32_t)0x07) * 4));
  temp_2 = GPIOx->AFR[GPIO_PinSource >> 0x03] | temp;
  GPIOx->AFR[GPIO_PinSource >> 0x03] = temp_2;
}

По сути делает то, что Вам нужно.

Если не используете SPL, то что мешает вовсе использовать самописные #define?
Go to the top of the page
 
+Quote Post
mihlit
сообщение Sep 1 2018, 12:20
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 34
Регистрация: 7-04-18
Пользователь №: 103 011



Смотрел я GPIO_PinAFConfig, но по своей неопытности предположил, что как-то по аналогии со 103 серией, без приведения к uint32_t и сдвигов можно обойтись.
Спасибо за ответ, у меня код рабочий с SPL написан, но в целях самообразования попытался обойтись записью в регистры - не получилось.
Go to the top of the page
 
+Quote Post
Arlleex
сообщение Sep 1 2018, 13:38
Сообщение #13


Местный
***

Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264



Цитата(mihlit @ Sep 1 2018, 15:20) *
Смотрел я GPIO_PinAFConfig, но по своей неопытности предположил, что как-то по аналогии со 103 серией, без приведения к uint32_t и сдвигов можно обойтись.
Спасибо за ответ, у меня код рабочий с SPL написан, но в целях самообразования попытался обойтись записью в регистры - не получилось.

А что конкретно не получилось?
Записать в AFRH15[3:0] число 5 можно, например, так
Код
GPIOA->AFRH = 5UL << 28;

или так
Код
GPIOA->AFRH = 0x50000000;

что абсолютно равнозначно. Разница в удобстве записи и восприятия.
Go to the top of the page
 
+Quote Post
mihlit
сообщение Sep 1 2018, 15:19
Сообщение #14


Участник
*

Группа: Участник
Сообщений: 34
Регистрация: 7-04-18
Пользователь №: 103 011



Код
GPIOA->AFRH = 0x50000000;

Ассистент после -> предлагал только "AFR", если я вводил "AFRH", появлялся крест на строке "не объявлено uint32_t"
Go to the top of the page
 
+Quote Post
Professor Chaos
сообщение Sep 1 2018, 18:04
Сообщение #15


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 25-08-17
Пользователь №: 98 970



Цитата(mihlit @ Sep 1 2018, 13:07) *
Записать магическое число 0х50000000 или есть какой-то дефайн? Смотрел stm32f4xx.h, stm32f4_gpio.h - не нашел. Ткните-пните в нужном направлениию

Любое битовое поле в регистре в общем случае записывается в два прохода:
сначала выставляются 1 в нужных позициях
затем 0
Можно наоборот, порядок не важен.
Для этого нужно знать: имя модифицируемого регистра, позицию битового поля внутри регистра, маску этого битового поля и нужное значение.
Оформить эти 2 строчки кода можно в виде макроса
Код
// Макрос записи в регистр reg битовой последовательности val в позицию pos (по младшему разряду)
// msk - маска битового поля
#define TuneBitField(reg,val,pos,msk) \
                {(reg) |= (((val) << (pos))&(msk)); \
                (reg) &= (((val) << (pos))|~(msk));}

Имена регистров ( в вашем случае это GPIOA->AFRH), позиции и маски битовых полей описываются в .h-файле на конкретный микроконтроллер. Берёте их оттуда и подставляете в качестве аргументов макроса. В качестве значения val подставляете требуемое 5.
Go to the top of the page
 
+Quote Post

3 страниц V   1 2 3 >
Closed TopicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th April 2024 - 21:01
Рейтинг@Mail.ru


Страница сгенерированна за 0.01511 секунд с 7
ELECTRONIX ©2004-2016