29.10.2014, 20:38
|
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,627
Сказал спасибо: 115
Сказали Спасибо 814 раз(а) в 591 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от Tronix286
|
ДОС это вообще офигенная ось
|
Однозадачная хрень. Сейчас даже RTOS многозадачная...
__________________
Союз Советских Социалистических Округов Северной Америки
|
|
|
|
29.10.2014, 20:50
|
|
Гражданин KAZUS.RU
Регистрация: 25.11.2010
Сообщений: 516
Сказал спасибо: 1
Сказали Спасибо 126 раз(а) в 109 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
eddy пока не портанешь Дум2 под stm32 лучше помалкивать.
|
|
|
|
30.10.2014, 11:13
|
|
Гражданин KAZUS.RU
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от Hives
|
eddy пока не портанешь Дум2 под stm32 лучше помалкивать.
|
Для того чтобы портировать нужны исходники. ))
Обычно идут несколько другим путём. Эмулируют железо и переписывают ось. Ну или только железо, в принципе достаточно. В этом случае требуется, чтобы производительность целевой платформы была примерно в 10 раз выше, чем эмулируемой. Я первый наладонник сыну купил (тогда ещё без GSM), а было это 7 лет назад примерно. DOOM там вполне нормально шёл... )) правда на QVGA. )) Думаю старшие stm32 уже приближаются ...
http://www.st.com/web/en/catalog/mmc/SC1169/SS1858
|
|
|
|
31.10.2014, 19:17
|
|
Гражданин KAZUS.RU
Регистрация: 16.03.2009
Адрес: Украина, Харьков
Сообщений: 762
Сказал спасибо: 108
Сказали Спасибо 67 раз(а) в 67 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Добрый вечер, это опять я ![Улыбка](images/smilies/icon_smile.gif) В общем взял библиотеку для работы с DMA и USARTом, переписал под себя и все зависает при проверки флага принятия 8 байт. Использовал эту библиотеку
изменял следующее:
Код:
|
#define OW_USART USART1
#define OW_DMA_CH_RX DMA1_Channel3
#define OW_DMA_CH_TX DMA1_Channel2
#define OW_DMA_FLAG DMA1_FLAG_TC3 |
Код:
|
uint8_t OW_Init() {
GPIO_InitTypeDef GPIO_InitStruct;
USART_InitTypeDef USART_InitStructure;
if (OW_USART == USART1) {
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
// USART TX
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStruct);
// USART RX
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStruct);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_0);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_0);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
}
USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl =
USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
USART_Init(OW_USART, &USART_InitStructure);
USART_Cmd(OW_USART, ENABLE);
return OW_OK;
} |
и отправка команд, на которой зависает:
Код:
|
if (sendReset == OW_SEND_RESET) {
if (OW_Reset() == OW_NO_DEVICE) {
return OW_NO_DEVICE;
}
}
while (cLen › 0) {
OW_toBits(*command, ow_buf);
command++;
cLen--;
DMA_InitTypeDef DMA_InitStructure;
// DMA на чтение
DMA_DeInit(OW_DMA_CH_RX);
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t) &(OW_USART-›RDR);
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t) ow_buf;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = 8;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
DMA_InitStructure.DMA_Priority = DMA_Priority_Low;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(OW_DMA_CH_RX, &DMA_InitStructure);
// DMA на запись
DMA_DeInit(OW_DMA_CH_TX);
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t) &(OW_USART-›TDR);
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t) ow_buf;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
DMA_InitStructure.DMA_BufferSize = 8;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
DMA_InitStructure.DMA_Priority = DMA_Priority_Low;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(OW_DMA_CH_TX, &DMA_InitStructure);
// старт цикла отправки
USART_ClearFlag(OW_USART, USART_FLAG_RXNE | USART_FLAG_TC | USART_FLAG_TXE);
USART_DMACmd(OW_USART, USART_DMAReq_Tx | USART_DMAReq_Rx, ENABLE);
DMA_Cmd(OW_DMA_CH_RX, ENABLE);
DMA_Cmd(OW_DMA_CH_TX, ENABLE);
// ждем, пока не примем 8 байт, тут и зависает
// никогда не устанавливается флаг.
while (DMA_GetFlagStatus(DMA1_FLAG_TC3) == RESET){
}
// отключаем DMA
DMA_Cmd(OW_DMA_CH_TX, DISABLE);
DMA_Cmd(OW_DMA_CH_RX, DISABLE);
USART_DMACmd(OW_USART, USART_DMAReq_Tx | USART_DMAReq_Rx, DISABLE);
if (readStart == 0 && dLen › 0) {
*data = OW_toByte(ow_buf);
data++;
dLen--;
} else {
if (readStart != OW_NO_READ) {
readStart--;
}
}
}
return OW_OK; |
Но если написать в главном цикле:
то вернется 0xE0, т.е. датчик отвечает. Как мне кажется проблема в настройке DMA, но пока понять не могу, что не так. Если есть идеи - подскажите.
|
|
|
|
31.10.2014, 21:07
|
|
Гражданин KAZUS.RU
Регистрация: 25.11.2010
Сообщений: 516
Сказал спасибо: 1
Сказали Спасибо 126 раз(а) в 109 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
swat24 по указанной ссылке UART1 DMA висит на 4 и 5 каналах...
|
|
|
|
31.10.2014, 21:21
|
|
Заблокирован
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от Hives
|
UART1 DMA висит на 4 и 5 каналах...
|
У STM32f0XX на 2 и 3 каналах, по умолчанию.
|
|
|
|
31.10.2014, 21:25
|
|
Гражданин KAZUS.RU
Регистрация: 16.03.2009
Адрес: Украина, Харьков
Сообщений: 762
Сказал спасибо: 108
Сказали Спасибо 67 раз(а) в 67 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Hives, в примере другой контроллер, на моем 2 и 3. страница 190 референс мануала. На 4 и 5 висит юарт 2 и можно для первого сделать ремап
|
|
|
|
31.10.2014, 21:44
|
|
Заблокирован
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от swat24
|
Если есть идеи - подскажите.
|
Подключайте анализатор, смотрите что идёт, что не идёт. Тормозните прогу, посмотрите что в счётчике транзакций ДМА.
|
|
|
|
31.10.2014, 22:02
|
|
Гражданин KAZUS.RU
Регистрация: 25.11.2010
Сообщений: 516
Сказал спасибо: 1
Сказали Спасибо 126 раз(а) в 109 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
на пробу перенеси обе DMA_Cmd() перед USART_ClearFlag(), а то как то странно - сначала включаешь периферию а только потом канал DMA
|
|
|
|
31.10.2014, 22:05
|
|
Гражданин KAZUS.RU
Регистрация: 16.03.2009
Адрес: Украина, Харьков
Сообщений: 762
Сказал спасибо: 108
Сказали Спасибо 67 раз(а) в 67 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
STM32F0, проблема в анализаторе - его нет ![Улыбка](images/smilies/icon_smile.gif) есть только осциллограф, по которому смотрел работает ли вообще юсарт. а счетчик транзакций ДМА это что? DMA_CNDTR оно?
И на втором канале 8 и на третьем 8
Перенос DMA_Cmd ничего не дал. Та и вроде правильно стоит, вначале настраиваем, потом разрешаем работу.
Последний раз редактировалось swat24; 31.10.2014 в 22:13.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 11:17.
|
|