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

 
 
> Проблема с функцией задержки., STM32F107
Jenya7
сообщение Jun 27 2016, 09:05
Сообщение #1


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

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Какая то ну очень странная проблема.
Я сделал функцию задержки так.
Код
void Delay_us(uint32_t us)
{
    uint32_t ticks = 72 * us;
    SysTick->LOAD = ticks;
    SysTick->CTRL |= 0x01;  //enable
    while (!(SysTick->CTRL&SysTick_CTRL_COUNTFLAG_Msk));
    SysTick->CTRL &= ~0x01; //disable
}

Проверяю
Код
PIN_OUT_PP(One_Wire_Pin);
while (1)
{
    PIN_ON(One_Wire_Pin);
    Delay_us(500);
    PIN_OFF(One_Wire_Pin);
    Delay_us(500);
}

Вижу хороший сигнал 500 микросек. Никаких проблем.
А вот в этой функции
Код
unsigned int One_Wire_Reset(GPIO_TypeDef * GPIOx, uint16_t PINx)
{
    unsigned int tmp;
    PIN_IN(GPIOx, PINx);
    if ((PIN_SYG(GPIOx, PINx))==0)    return One_Wire_Bus_Low_Error;

    PIN_OUT_PP(GPIOx, PINx);
    PIN_OFF(GPIOx, PINx);
    Delay_us(480);
    PIN_ON(GPIOx, PINx);
    PIN_IN(GPIOx, PINx);
    Delay_us(60);

    if ((PIN_SYG(GPIOx, PINx))==0) tmp=One_Wire_Success;
        else tmp=One_Wire_Error_No_Echo;
    Delay_us(Time_After_Reset);
    return tmp;
}

я вижу сигнал идет вниз на 350 микро (вместо 480). Кручу и так и этак, ума не приложу в чем проблема

Сообщение отредактировал Jenya7 - Jun 27 2016, 09:06
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
scifi
сообщение Jun 27 2016, 09:16
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



А я вот так сделал:
CODE
#include "systick.h"
#include "stm32f0xx.h"

void
systick_init(void)
{
SysTick->CTRL &= SysTick_CTRL_ENABLE_Msk; // stop SysTick timer
SysTick->LOAD = 0x00FFFFFF;
SysTick->VAL = 0x00FFFFFF;
SysTick->CTRL = SysTick_CTRL_ENABLE_Msk; // start SysTick timer
}

int
systick_ticks(void)
{
return SysTick->VAL;
}

int
systick_diff(int from, int to)
{
return (from - to) & 0x00FFFFFF;
}

void
systick_delay(int ticks)
{
int start = systick_ticks();
while (systick_diff(start, systick_ticks()) < ticks) ;
}
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jun 27 2016, 09:38
Сообщение #3


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

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(scifi @ Jun 27 2016, 14:16) *
А я вот так сделал:

Я не хочу чтоб он все время тикал, будет генерироваться интерапт который не нужен (SysTick_Handler). А так открыл, отсчитал, закрыл.
Go to the top of the page
 
+Quote Post
pitt
сообщение Jun 27 2016, 13:23
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 328
Регистрация: 1-06-06
Из: USA
Пользователь №: 17 672



Цитата(Jenya7 @ Jun 27 2016, 05:38) *
Я не хочу чтоб он все время тикал, будет генерироваться интерапт который не нужен (SysTick_Handler). А так открыл, отсчитал, закрыл.

STM32F4xx
Код
#define DWT_CYCCNT    *(volatile uint32_t *)0xE0001004
#define DWT_CONTROL   *(volatile uint32_t *)0xE0001000
#define SCB_DEMCR     *(volatile uint32_t *)0xE000EDFC
  
#ifndef HCLK
  #define   HCLK      168000000
#endif

#define dwt_ena()     (SCB_DEMCR   |=  CoreDebug_DEMCR_TRCENA_Msk)
#define dwt_dis()     (SCB_DEMCR   &= ~CoreDebug_DEMCR_TRCENA_Msk)
#define dwt_rst()     DWT_CYCCNT    = 0
#define dwt_start()   (DWT_CONTROL |= DWT_CTRL_CYCCNTENA_Msk)
#define dwt_cnt()     DWT_CYCCNT

void delay_1us (void) {
  uint32_t start, end;
  
  start = dwt_cnt();
  end = start + HCLK/1000000;
  if (end < start) while (dwt_cnt() > start);
  while (end >= dwt_cnt());
}

void delay_1ms (void) {
  uint32_t start, end;
  
  start = dwt_cnt();
  end = start + HCLK/1000;
  if (end < start) while (dwt_cnt() > start);
  while (end >= dwt_cnt());


Идея, надеюсь, понятна...


--------------------
Прокричал немой глухому:"...Спасибо за внимание!"
http://www.youtube.com/watch?v=3Nnj4ky4Z_g
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Jenya7   Проблема с функцией задержки.   Jun 27 2016, 09:05
|- - scifi   Цитата(Jenya7 @ Jun 27 2016, 12:38) Я не ...   Jun 27 2016, 11:09
- - KnightIgor   Цитата(Jenya7 @ Jun 27 2016, 10:05) Какая...   Jun 27 2016, 11:35
|- - Jenya7   Цитата(KnightIgor @ Jun 27 2016, 16:35) У...   Jun 27 2016, 12:01
- - Сергей Борщ   Извиняюсь, что не про задержку: QUOTE (Jenya7 ...   Jun 27 2016, 12:45
|- - Jenya7   Цитата(Сергей Борщ @ Jun 27 2016, 17:45) ...   Jun 27 2016, 13:18
|- - Сергей Борщ   QUOTE (Jenya7 @ Jun 27 2016, 16:18) выход...   Jun 27 2016, 13:23
|- - Jenya7   Цитата(Сергей Борщ @ Jun 27 2016, 18:23) ...   Jun 27 2016, 13:28
|- - Сергей Борщ   QUOTE (Jenya7 @ Jun 27 2016, 16:28) Серге...   Jun 27 2016, 13:46
|- - Jenya7   Цитата(Сергей Борщ @ Jun 27 2016, 18:46) ...   Jun 27 2016, 13:54
|- - Сергей Борщ   QUOTE (Jenya7 @ Jun 27 2016, 16:54) После...   Jun 27 2016, 16:13
||- - Jenya7   Цитата(Сергей Борщ @ Jun 27 2016, 21:13) ...   Jun 27 2016, 16:22
||- - Сергей Борщ   QUOTE (Jenya7 @ Jun 27 2016, 19:22) Нижни...   Jun 27 2016, 16:48
||- - Jenya7   Цитата(Сергей Борщ @ Jun 27 2016, 21:48) ...   Jun 27 2016, 16:57
|- - jcxz   Цитата(Jenya7 @ Jun 27 2016, 19:54) Вообщ...   Jun 28 2016, 03:47
- - jcxz   Цитата(Jenya7 @ Jun 27 2016, 15:05) Какая...   Jun 27 2016, 13:44
- - Jenya7   Переделал функции под вариант с OPEN DRAIN. CODE#...   Jun 28 2016, 05:34
|- - Сергей Борщ   QUOTE (Jenya7 @ Jun 28 2016, 08:34) но те...   Jun 28 2016, 07:29
|- - Jenya7   То есть нужно так? Код PIN_OFF(GPIOx, PINx...   Jun 28 2016, 07:44
- - Tarbal   Цитата(Jenya7 @ Jun 27 2016, 13:05) Какая...   Jun 29 2016, 18:13
|- - Alechek   Цитата(Tarbal @ Jun 29 2016, 23:13) Я бол...   Jun 29 2016, 18:42
||- - Tarbal   Цитата(Alechek @ Jun 29 2016, 22:42) И чт...   Jun 29 2016, 20:26
|- - Jenya7   Цитата(Tarbal @ Jun 29 2016, 23:13) Я бол...   Jun 30 2016, 08:05
|- - Сергей Борщ   QUOTE (Jenya7 @ Jun 30 2016, 11:05) Единс...   Jun 30 2016, 08:48
|- - KnightIgor   Цитата(Сергей Борщ @ Jun 30 2016, 09:48) ...   Jun 30 2016, 09:04
|- - Jenya7   Цитата(Сергей Борщ @ Jun 30 2016, 13:48) ...   Jun 30 2016, 09:30
|- - jcxz   Цитата(Jenya7 @ Jun 30 2016, 15:30) разгр...   Jun 30 2016, 10:15
||- - Tarbal   Цитата(jcxz @ Jun 30 2016, 14:15) А чем у...   Jun 30 2016, 12:47
|- - Эдди   Цитата(Jenya7 @ Jun 30 2016, 12:30) Интер...   Jun 30 2016, 10:40
- - Эдди   ТС, возьми нормальную реализацию 1-wire через тайм...   Jun 30 2016, 09:14
|- - Сергей Борщ   QUOTE (Эдди @ Jun 30 2016, 12:14) ТС, воз...   Jun 30 2016, 09:43
- - Alechek   Ой, о чем спор? Ногодрыг или аппаратный 1-wire? ...   Jun 30 2016, 11:21
- - Jenya7   Цитата(Alechek @ Jun 30 2016, 16:21) Ой, ...   Jun 30 2016, 12:26
- - Alechek   Цитата(Jenya7 @ Jun 30 2016, 17:26) Я вид...   Jul 1 2016, 04:58


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 15:27
Рейтинг@Mail.ru


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