Invalidexception
Пт 11 ноября 2016 г., 2:37
Всем привет
Иметь LCD -проект продолжается, но является решающим времени, и мне нужна четкая задержка 1US, но на образец, который у меня есть на светодиоде, если я положу задержки
Вот изображение логиканалицера
Как это можно сделать, чтобы получить нормальную задержку 1us ???
П.С.
Задержка в MS работает нормально
Иметь LCD -проект продолжается, но является решающим времени, и мне нужна четкая задержка 1US, но на образец, который у меня есть на светодиоде, если я положу задержки
Вот изображение логиканалицера
Как это можно сделать, чтобы получить нормальную задержку 1us ???
П.С.
Задержка в MS работает нормально
Рик Кимбалл
Пт 11 ноября 2016 г., 2:43
Rogerclark
Пт 11 ноября 2016 г., 4:04
Или выключить прерывания и использовать "NOP" S
Invalidexception
Пт 11 ноября 2016 г., 19:07
Вот обновление с реализацией @rick
Небольшая разница не должна сильно влиять (на 100us получил 100.1US)
Но это работает хорошо
Спасибо за помощь
Небольшая разница не должна сильно влиять (на 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 я не могу получить одинаковые времена
Кто -нибудь знает, что такое особенное/отличное в коде 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???
Где я совершил ошибку? Любой столкнулся с аналогичной проблемой?
Но если я запускаю _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, чтобы увеличить каждую миллисекунду.