Форум РадиоКот https://radiokot.ru/forum/ |
|
Разобрать код STM32F103C8T6 в среде Keil uvision https://radiokot.ru/forum/viewtopic.php?f=59&t=166912 |
Страница 1 из 1 |
Автор: | 201bazza [ Пн ноя 18, 2019 20:13:55 ] |
Заголовок сообщения: | Разобрать код STM32F103C8T6 в среде Keil uvision |
Всем привет! Встала необходимость реализовать задержку в миллисекундах в микроконтроллере STM32F103C8T6. Перерыл интернет, ничего работоспособного не нашел, ни один код не работает у меня. Взял вот отсюда код задержки https://hubstub.ru/stm32/101-funkciya-z ... stm32.html, но Keil ругается. В чем может быть дело? ![]() Что вообще за регистры CoreDebug_DEMCR_TRCENA_Msk, DWT_CTRL_CYCCNTENA_Msk, DWT ? В даташите не нашел инфы. |
Автор: | Eddy_Em [ Пн ноя 18, 2019 21:05:03 ] |
Заголовок сообщения: | Re: Разобрать код STM32F103C8T6 в среде Keil uvision |
Нельзя миллисекундные задержки блокирующими делать! Надо разворачивать или конечные автоматы, или запускать таймер и заниматься своими делами, а как сработает прерывание таймера - выполнить требующийся короткий кусочек кода. > CYCCNTENA Это для микросекундных задержек, подсчет количества циклов системной шины. Только все равно строгой паузы не получится. Для строгой паузы есть таймеры. Вот пример коротенькой паузы. Но это - блажь. Не надо так делать. Там же можно увидеть еще более грубый пример - миллисекундных пауз. Так тем более делать нельзя! |
Автор: | 201bazza [ Пн ноя 18, 2019 21:18:28 ] |
Заголовок сообщения: | Re: Разобрать код STM32F103C8T6 в среде Keil uvision |
Eddy_Em, не пойму почему до сих пор еще никто не озаботился написать нормальный рабочий код для милли - или секундных задержек? Смотришь примеры в инете, копируешь к себе в Keil, а ничего не работает, ошибки.... То библиотеки какие-то еще нужно, то регистры левые вылазят. Возникает мысль что у всех этих советчиков с "с рабочими задержками" что то с головой не в порядке, если уж рядовому начинающему прогеру не могут доступно донести инфу. Я в шоке! |
Автор: | Eddy_Em [ Пн ноя 18, 2019 21:36:46 ] |
Заголовок сообщения: | Re: Разобрать код STM32F103C8T6 в среде Keil uvision |
201bazza писал(а): почему до сих пор еще никто не озаботился написать нормальный рабочий код для милли - или секундных задержек? Потому что универсального решения в данном случае не существует: кому-то нравится в теле main проверять счетчик времени, а потом запускать нужную процедуру, а кто-то делает все на конечных автоматах (и по сути внутри обработки состояния автомата в состоянии PAUSE выполняется та же самая процедура). Для пущей точности можно паузу таймером делать: по прерыванию при окончании счета выставляем флаг, а далее - те же самые процедуры проверки. Тупо как абдуринщики делать блокирующую паузу в полсекунды-секунду некошерно! |
Автор: | 201bazza [ Пн ноя 18, 2019 21:47:27 ] |
Заголовок сообщения: | Re: Разобрать код STM32F103C8T6 в среде Keil uvision |
Eddy_Em, ну хорошо, универсального решения нет. Вы можете помочь мне код доработать? 1) файл delay1.h #include "stdint.h" #ifndef __uint32_t_defined typedef unsigned int uint32_t; # define __uint32_t_defined #endif #define DWT_CYCCNT *(volatile uint32_t *)0xE0001004 #define DWT_CONTROL *(volatile uint32_t *)0xE0001000 #define SCB_DEMCR *(volatile uint32_t *)0xE000EDFC uint32_t DWT_Get(void) { return DWT_CYCCNT; } __inline uint8_t DWT_Compare(int32_t tp) { return (((int32_t)DWT_Get() - tp) < 0); } void DWT_Delay(uint32_t us) // microseconds { int32_t tp = DWT_Get() + us * (8000000/1000000); // вместо 8000000 должно стоять SystemCoreClock, но тогда Keil ругается на SystemCoreClock while (DWT_Compare(tp)); } 2) файл main.h #include "stm32f10x.h" #include "stm32f10x_gpio.h" #include "stm32f10x_rcc.h" #include "delay1.h" #include <stdio.h> int i; void SendCameBit(int b) { DWT_Delay (320); if (!b) GPIOC->ODR=GPIO_Pin_13; DWT_Delay (320); GPIOC->ODR=GPIO_Pin_13; DWT_Delay (320); GPIOC->ODR=0; } int main(void) { char Code [] = "100001111000011101010100"; if (!(DWT_CONTROL & 1)) { SCB_DEMCR |= 0x01000000; DWT_CYCCNT = 0; DWT_CONTROL|= 1; // enable the counter } /* объявление инициализационной структуры (InitStructure), которая содержит все параметры для настройки периферийного устройства в виде переменных-членов структуры */ GPIO_InitTypeDef GPIO_InitStructure; /* подача на порт тактирования */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); /* переменные-члены структуры */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /* вызываем функцию инициализации, куда передаем указатель на сформированную структуру */ GPIO_Init(GPIOC, &GPIO_InitStructure); while (1) { for (int j=0;j<4;j++) { GPIOC->ODR=GPIO_Pin_13; DWT_Delay (1); // вот тут программа встает и дальше не двигается. Светодиод на плате просто горит бесконечно GPIOC->ODR=0;// посылаем стартовый импульс for (int i=0;i<24;i++) { SendCameBit((int)Code [i]); // побитово перебираем и посылаем код } DWT_Delay (320); } GPIOC->ODR=0; DWT_Delay (1000000); // сделать паузу после посылки на 1 с } } |
Автор: | Eddy_Em [ Пн ноя 18, 2019 22:22:45 ] |
Заголовок сообщения: | Re: Разобрать код STM32F103C8T6 в среде Keil uvision |
Я ж приводил пример: в начале всегда нужно обнулять счетчик: Код: DWT_CYCCNT = 0; По-хорошему, надо еще выключать счетчик, когда он не используется. Но это не очень важно. Вот еще. но у меня без этого 0xC5ACCE55 все работало. |
Автор: | jcxz [ Пн ноя 18, 2019 23:11:22 ] |
Заголовок сообщения: | Re: Разобрать код STM32F103C8T6 в среде Keil uvision |
Что вообще за регистры CoreDebug_DEMCR_TRCENA_Msk, DWT_CTRL_CYCCNTENA_Msk, DWT ? В даташите не нашел инфы. Плохо искали: http://infocenter.arm.com/help/topic/co ... l#cortexm3Раздел "Data Watchpoint and Trace Unit". Добавлено after 5 minutes 10 seconds: Eddy_Em, не пойму почему до сих пор еще никто не озаботился написать нормальный рабочий код для милли - или секундных задержек? "Нормальный рабочий код" давно уже написан. Называется он "РТОС". Ибо - грамотные программисты ПО на ARM-ах в суперлупе не пишут. ![]() |
Автор: | Eddy_Em [ Вт ноя 19, 2019 07:16:52 ] |
Заголовок сообщения: | Re: Разобрать код STM32F103C8T6 в среде Keil uvision |
jcxz, грамотные специалисты РТОС в любую дырку не суют! |
Автор: | Мурик [ Вт ноя 19, 2019 12:08:19 ] |
Заголовок сообщения: | Re: Разобрать код STM32F103C8T6 в среде Keil uvision |
https://radiokot.ru/forum/download/file.php?id=316654 Код: #include "stm32f10x.h" extern uint32_t SystemCoreClock; static uint32_t Delay_ms; void DWT_Delay_ms(uint32_t ms) { uint32_t Count = DWT->CYCCNT; ms = ms * Delay_ms; while((DWT->CYCCNT - Count) < ms); } int main(void) { SystemCoreClockUpdate(); // Текущая тактовая частота. Delay_ms = SystemCoreClock / 1000; RCC-> APB2ENR |= RCC_APB2ENR_IOPCEN; GPIOC->CRH &= ~GPIO_CRH_CNF13; GPIOC->CRH |= GPIO_CRH_MODE13; CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk; while(1) { GPIOC->ODR ^= GPIO_ODR_ODR13; DWT_Delay_ms(500); } } 201bazza писал(а): В чем может быть дело? Кто вас учил писать исполняемый код в заголовочных файлах и к тому же не подключать другие заголовочные файлы где находятся объявления регистров и их битов? ![]() 201bazza писал(а): Что вообще за регистры CoreDebug_DEMCR_TRCENA_Msk, DWT_CTRL_CYCCNTENA_Msk, DWT ? В даташите не нашел инфы. Это из ядра ARM и не регистры, а их биты. ![]() |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |