Проблема Bluepill Delopmicroseconds

Invalidexception
Пт 11 ноября 2016 г., 2:37
Всем привет

Иметь LCD -проект продолжается, но является решающим времени, и мне нужна четкая задержка 1US, но на образец, который у меня есть на светодиоде, если я положу задержки
Вот изображение логиканалицера
Изображение

Как это можно сделать, чтобы получить нормальную задержку 1us ???

П.С.
Задержка в MS работает нормально

Рик Кимбалл
Пт 11 ноября 2016 г., 2:43
Один подход: http: // www.STM32duino.com/viewtopic.PHP?t = 326

-рик

Rogerclark
Пт 11 ноября 2016 г., 4:04
Или выключить прерывания и использовать "NOP" S

Invalidexception
Пт 11 ноября 2016 г., 19:07
Вот обновление с реализацией @rick
Изображение

Небольшая разница не должна сильно влиять (на 100us получил 100.1US)
Но это работает хорошо :)

Спасибо за помощь

Rogerclark
Пт 11 ноября 2016 г., 19:57
Вы уверены, что время вашего логического анализатора точна до нескольких сотен нано -секунд ?

Ddrown
Пт 11 ноября 2016 г., 21:39
Rogerclark написал:Вы уверены, что время вашего логического анализатора точна до нескольких сотен нано -секунд ?

Rogerclark
Пт 11 ноября 2016 г., 22:38
У меня есть анализатор 100 МГц, а также объем полосы пропускания 100 МГц, если бы вы могли опубликовать точный код, который я мог бы посмотреть на него на них.

Invalidexception
Пт 11 ноября 2016 г., 23:26
Я протестировал на образце @rick Blink и измерю на Rigol 100 МГц
вот выход, и он выглядит нормально

Изображение

Invalidexception
Солнце 13 ноября 2016 г., 19:55
Попытка повторить проблему для библиотеки STM SPL и HAL, но не может получить правильное значение
Кто -нибудь знает, что такое особенное/отличное в коде Arduino, которое работает нормально, но на SW4STM32 и ST Libs я не могу получить одинаковые времена

Invalidexception
Ср. 16 ноября 2016 г. 12:59
Вот мой пример, который я пытаюсь воспроизвести, и для MS работает нормально (получил 1.01 мс)
Но если я запускаю _delay_us (1), я получаю странное значение (2.25US) и это самое низкое значение, которое я могу получить :(
П.С. (С GPIO_SETBITS/GPIO_RESETBITS Такое же значение 2 - 2.625us)

Нужно ли мне настраивать часы/перерывы или что получить одинаковое время, как stmduino???
Где я совершил ошибку? Любой столкнулся с аналогичной проблемой?
#include "stm32f10x.h" void _delay_us(uint32_t us); void _delay_ms(uint32_t ms); void InitGPIO(); int main(void) { InitGPIO(); while (1) { GPIOC->ODR = 1<<13; _delay_ms(1); GPIOC->ODR = 0<<13; _delay_ms(1); } } void InitGPIO() { //def port C (LED) RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); GPIO_InitTypeDef GPIO_InitStructureC; GPIO_InitStructureC.GPIO_Pin = GPIO_Pin_13; GPIO_InitStructureC.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructureC.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructureC); } void _delay_us(uint32_t nus) { u32 temp; SysTick->LOAD = 8 * nus; SysTick->VAL = 0X00; SysTick->CTRL = 0X01; do { temp = SysTick->CTRL; } while ((temp & 0x01) && (!(temp & (1 << 16)))); SysTick->CTRL = 0x00; SysTick->VAL = 0X00; } void _delay_ms(uint32_t nms) { u32 temp; SysTick->LOAD = 9000 * nms; SysTick->VAL = 0X00; SysTick->CTRL = 0X01; do { temp = SysTick->CTRL; } while ((temp & 0x01) && (!(temp & (1 << 16)))); SysTick->CTRL = 0x00; SysTick->VAL = 0X00; }

Rogerclark
Ср 16 ноября 2016 г. 1:49
Libmaple устанавливает Systick, чтобы увеличить каждую миллисекунду.

Adafruit SSD1331 Spied Display