|
отладка в Keil |
|
|
|
Aug 18 2018, 10:22
|
Участник
Группа: Участник
Сообщений: 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 мес), почему так происходит?
|
|
|
|
|
Aug 18 2018, 14:19
|
Знающий
Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663
|
IDR, который для GPIOD, часом не мониторится в окошке Keil-а? Если так, то отладчик флажок вычитывает. Обычно, флажки, сбрасываемые чтением, в окошках отладчика смотреть не полезно (при отладке ). "Зависает" и "не идет дальше" - не одно и то же.
--------------------
Пролетарий умственного труда.
|
|
|
|
|
Aug 18 2018, 16:13
|
Местный
Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264
|
Цитата(Obam @ Aug 18 2018, 17:19) IDR, который для GPIOD, часом не мониторится в окошке Keil-а? Если так, то отладчик флажок вычитывает. Это не бит с доступом типа "сброс при чтении". mihlit, когда заходите в отладку, процессор прошивается актуальной прошивкой, запускает ее выполнение, успевает сколько-то выполниться и затем отладчик сбрасывает его, начиная выполнять код заново. Поэтому с большой долей вероятности обмен Ваш уже завершился с устройством и повторный обмен не предусмотрен - поэтому лог. 1 на линии больше никогда не будет.
|
|
|
|
|
Aug 19 2018, 01:48
|
Участник
Группа: Участник
Сообщений: 34
Регистрация: 7-04-18
Пользователь №: 103 011
|
"Поэтому с большой долей вероятности обмен Ваш уже завершился с устройством и повторный обмен не предусмотрен - поэтому лог. 1 на линии больше никогда не будет." Действительно, сейчас внешнее устройство снимает сигал готовности, после передачи пакета данных. Получается, что я в режиме отладки не могу посмотреть данные в buf[]?
Кнопки пошагового выполнения становятся неактивными - это "Зависает" или "не идет дальше"?
Сообщение отредактировал mihlit - Aug 19 2018, 02:09
|
|
|
|
|
Aug 19 2018, 07:25
|
Местный
Группа: Участник
Сообщений: 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) Кнопки пошагового выполнения становятся неактивными - это "Зависает" или "не идет дальше"? Они в любом случае будут недоступны, если процессор находится в состоянии выполнения команд. Стоит Вам поставить точку останова на Ваш "зацикленный" круг ада - и Вы увидите, что кнопки разблокируются.
|
|
|
|
|
Aug 19 2018, 10:06
|
Участник
Группа: Участник
Сообщений: 34
Регистрация: 7-04-18
Пользователь №: 103 011
|
Цитата Можете. Для этого Вам необходимо пересмотреть протокол передачи данных. Я примерно это и предполагал - поэтому и уже снова открыл Quartus. Цитата Галочка в настройках отладчика Download To Flash->Reset and Run не очень разбираюсь в Кейле, искал в свойствах проекта, (волшебная палочка ) не нашел.
|
|
|
|
|
Aug 19 2018, 10:50
|
Местный
Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264
|
Цитата(mihlit @ Aug 19 2018, 13:06) Я примерно это и предполагал - поэтому и уже снова открыл Quartus. не очень разбираюсь в Кейле, искал в свойствах проекта, (волшебная палочка ) не нашел. Flash->Configure Flash Tools->Debug->Settings->Flash Download->Reset and Run.
|
|
|
|
|
Aug 19 2018, 11:22
|
Участник
Группа: Участник
Сообщений: 34
Регистрация: 7-04-18
Пользователь №: 103 011
|
Дважды смотрел вкладку, но искал установленные птички - поэтому и не увидел. Сброшена она. Ладно, спасибо всем, буду переделывать прошивку CPLD. Смущает только одно - всегда МК был мастером для периферии, а теперь что, по прерыванию обрабатывать прием данных, а если они сейчас не нужны? Ладно, разберусь. Еще раз всем спасибо.
|
|
|
|
|
Sep 1 2018, 10:07
|
Участник
Группа: Участник
Сообщений: 34
Регистрация: 7-04-18
Пользователь №: 103 011
|
Чтобы не плодить тем, спрошу здесь, кто-нибудь подскажите: Есть в GPIO регистр GPIOx_AFRH. Как в нем установить AFRH15[3:0] =5? Записать магическое число 0х50000000 или есть какой-то дефайн? Смотрел stm32f4xx.h, stm32f4_gpio.h - не нашел. Ткните-пните в нужном направлениию
|
|
|
|
|
Sep 1 2018, 12:08
|
Местный
Группа: Участник
Сообщений: 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?
|
|
|
|
|
Sep 1 2018, 12:20
|
Участник
Группа: Участник
Сообщений: 34
Регистрация: 7-04-18
Пользователь №: 103 011
|
Смотрел я GPIO_PinAFConfig, но по своей неопытности предположил, что как-то по аналогии со 103 серией, без приведения к uint32_t и сдвигов можно обойтись. Спасибо за ответ, у меня код рабочий с SPL написан, но в целях самообразования попытался обойтись записью в регистры - не получилось.
|
|
|
|
|
Sep 1 2018, 13:38
|
Местный
Группа: Участник
Сообщений: 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; что абсолютно равнозначно. Разница в удобстве записи и восприятия.
|
|
|
|
|
Sep 1 2018, 15:19
|
Участник
Группа: Участник
Сообщений: 34
Регистрация: 7-04-18
Пользователь №: 103 011
|
Код GPIOA->AFRH = 0x50000000; Ассистент после -> предлагал только "AFR", если я вводил "AFRH", появлялся крест на строке "не объявлено uint32_t"
|
|
|
|
|
Sep 1 2018, 18:04
|
Участник
Группа: Участник
Сообщений: 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.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|