Перейти к содержанию
    

vprokofiev

Участник
  • Постов

    46
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о vprokofiev

  • Звание
    Участник
    Участник

Контакты

  • Сайт
    Array
  1. PRIMASK=0 FAULTMASK=0 BASEPRI=0xB0 Прерывания другие вызываются, с одного ком-порта на другой данные как шли так и идут. Ну да вот и ответ :) Спасибо всем. Вобщем, при сбое по i2c, я забыл разрешить прерывания. А весь блок от выставления старта до стопа убран был в критическую секцию. Если происходил сбой то я выходил из функции забыв покнуть критическую секцию
  2. Подскажите?:) А прерывание судя по всему не лишнее, а настоящее, только с невыставленным флагом RXNEIE. Я воспользовался библиотечной функцией USART_GetITStatus, которая проверяет этот флаг. Если написать как у вас то проблема не заметна. И ошибки CRC пропали :). Про одновременное срабатывание спасибо, не подумал.
  3. STM32 Прерывание UART

    Простой модуль чтения данных с GPS, из проекта выкинул все, кроме uart драйвера и парсера сообщений UBX. (Ublox gps protocol), STM415 стоит, но софт везде работает с ним как с 215 ( Это не влияет, я это ловил и на настоящих 215 ) Настройка порта: case USART6_BASE: #ifdef USE_IN_UART6_BUFFER UART6_InputBufWR = 0; UART6_InputBufRD = 0; #endif #ifdef USE_OUT_UART6_BUFFER UART6_OutputBufWR = 0; UART6_OutputBufRD = 0; #endif RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART6, ENABLE); GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_USART6); GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_USART6); GPIO_Init_Struct.GPIO_Pin = GPIO_Pin_6; GPIO_Init_Struct.GPIO_Mode = GPIO_Mode_AF; GPIO_Init_Struct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init_Struct.GPIO_OType = GPIO_OType_PP; GPIO_Init_Struct.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOC, &GPIO_Init_Struct); GPIO_Init_Struct.GPIO_Pin = GPIO_Pin_7; GPIO_Init_Struct.GPIO_OType = GPIO_OType_OD; GPIO_Init_Struct.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOC, &GPIO_Init_Struct); #if defined (USE_IN_UART6_BUFFER) || defined (USE_OUT_UART6_BUFFER) NVIC_InitStructure.NVIC_IRQChannel = USART6_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = UART6_PreemptionPriority; NVIC_InitStructure.NVIC_IRQChannelSubPriority = UART6_SubPriority; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); #endif #ifdef USE_IN_UART6_BUFFER USART_ITConfig(USARTx, USART_IT_RXNE, ENABLE); //USART_ITConfig(USARTx, USART_IT_ORE, ENABLE); #endif break; } USART_Init_Struct.USART_BaudRate = Baudrate; USART_Init_Struct.USART_WordLength = USART_WordLength_8b; USART_Init_Struct.USART_StopBits = USART_StopBits_1; USART_Init_Struct.USART_Parity = USART_Parity_No; USART_Init_Struct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init_Struct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_Init(USARTx, &USART_Init_Struct); USART_Cmd(USARTx,ENABLE); Прерывание: void USART6_IRQHandler(void) { if(USART_GetITStatus(USART6, USART_IT_TXE) != RESET) { #ifdef USE_OUT_UART6_BUFFER if(UART6_out_counter != 0) { UART6_out_counter--; USART_SendData(USART6,(uint16_t) UART6_OutputBuf[uART6_OutputBufRD]); if(UART6_OutputBufRD >= (UART6_OutputBuf_size - 1)) { UART6_OutputBufRD = 0; } else { UART6_OutputBufRD++; } } else { USART_ITConfig(USART6, USART_IT_TXE, DISABLE); isTxDone6 = 1; #endif } } else if(USART_GetITStatus(USART6, USART_IT_RXNE) != RESET) { USART6->SR; #ifdef USE_IN_UART6_BUFFER uint8_t read_UART; read_UART = USART_ReceiveData(USART6); #ifdef FATFS_ON GPSLOGGER_PushByte( read_UART ); #endif if(UART6_in_counter < UART6_InputBuf_size) { UART6_InputBuf[uART6_InputBufWR] = read_UART; if(UART6_InputBufWR == (UART6_InputBuf_size - 1)) { UART6_InputBufWR = 0; } else { UART6_InputBufWR++; } UART6_in_counter++; } #endif }else { USART6->SR; USART6->DR; } USART_ClearFlag( USART6, USART_FLAG_CTS | USART_FLAG_LBD | USART_FLAG_RXNE | USART_IT_TC ); } Ну тык вот, есть странности (скорость 200к). Самый главный вопрос, почему мы иногда попадаем в последний else, выполняя USART6->SR; USART6->DR; При этом, это должно было быть прерывание RX, НО RXNEIE = 0! Все остальные биты такие-же как и при нормальном прерывании. Еще странность что ORE почти всегда 1. В GPSLOGGER_PushByte есть глобальное разрешение и запрещение прерывания, но функция просто просто байт сохраняет: inline void GPSLOGGER_PushByte( uint8_t b ){ __disable_irq(); if( sizebuf[curBuf] < LOGBUFSIZE ){ logbuf[ curBuf ][ sizebuf[curBuf] ] = b; } sizebuf[ curBuf ] ++; __enable_irq(); }
  4. Так и не решилась проблема:) Да, Systick переключает задачи. Не вызывется => Задачи не переключаются, что и видно.. Сейчас попробую поймать и посмотреть на другие прерывания..
  5. STM32F215, FreeRtos На одной из плат перестает вызываться прерывание SysTick. При этом на большинстве плат все ок. Если смотреть регистры, то SysTickSR: Enable = 1 TickInt = 1 CLKSOURCE = 1 COUNTFLAG = 1 программа идет по самой приоритетной задаче постоянно, прерывание не вызывается, хотя регистр счетчика постоянно меняется и перескакивает через ноль. Перестают прерывания сыпаться каждый раз на разном значении обработанных прерывания ( тиков операц. системы ) сейчас например отладчик показывает xTickCount = 4050, перед этим было 413.
  6. STM32F215 подключен через FTDI к компу. Все всегда прекрасно работало, а сейчас заметил что контроллер принимает иногда не то, что было послано. Стал копать, выяснилось что если смотреть осцилом, то видно что иногда амплитуда по входной ноге падает раза в два. Из принимаемого пакета могут несколько битиков быть "половинками". Выяснилось что это происходит если контроллер что-то передает и ему во время передачи что-то послать. Как с этим побороться? Попробовать подтянуть насильно ногу к питанию?
  7. Оптимизация выключена вся в настройках проекта. Да, помогает создать глобальную переменную и в нее скопировать значение чтобы посмотреть, спасибо! Но блиин криво так :(
  8. процессор STM32F215 IAR 6.21 В некоторых функциях, когда останавливаешься отладчиком, показывает странные числа вместо настоящих, которые там, на самом деле, правильные. Происходит не со всеми переменными, и не во всех функциях. Было даже так: //В функцию пришло TGPSPoint par //typedef struct tag_GPSPoint{ // double la, lo; //} TGPSPoint; TGPSPoint p; double tmp; //par.la и par.lo адекватные, 60 и 30 p.la = par.la; p.lo = par.lo; //p.la и p.lo показывает -217 степень, явный бред tmp = p.la; //tmp тоже правильный, 60!! В чем причина?
  9. Частотомер на STM32F215

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOA, GPIO_PinSource0, GPIO_AF_TIM8); TIM8->SMCR = TIM_SMCR_ECE; TIM8->CR1 = TIM_CR1_CEN; //Дальше отсебятина пошла TIM_ETRClockMode2Config( TIM8, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_Inverted, 0 ); TIM_SelectInputTrigger( TIM8, TIM_TS_ETRF ); TIM_Cmd( TIM8, ENABLE ); Вопрос такой, хотел настроить вход клока TIM8 на внешнюю ногу. Тогда, если я все правильно понимаю, считывая значения таймера за определенные промежутки имеем частоту сигнала на входе. Написал так, как написано в даташите, но наверное что-то забыл. Вобщем не работает, показывает 0 отчсчетов всегда
  10. STM32 ADC

    Круто, спасибо, помогло!
  11. STM32 ADC

    Я попробовал повторить это через библиотечные вызовы, получилось что один канал ацп влияет на другой. Почему так происходит? Т.е. если читать один канал, он начитывает ~49000, если два канала, то в первом ~43000 во втором ~5000. А так все почти работает) void APADC_Init( void ){ ADC_InitTypeDef ADC_InitStructure; ADC_CommonInitTypeDef ADC_CommonInitStructure; DMA_InitTypeDef DMA_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; /* Enable ADC3, DMA2 and GPIO clocks ****************************************/ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2 | RCC_AHB1Periph_GPIOC, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3, ENABLE); /* DMA2 Stream0 channel2 configuration **************************************/ DMA_InitStructure.DMA_Channel = DMA_Channel_2; DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC3_DR_ADDRESS; DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)ADC3ConvertedValues; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory; DMA_InitStructure.DMA_BufferSize = 2; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull; DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; DMA_Init(DMA2_Stream0, &DMA_InitStructure); DMA_Cmd(DMA2_Stream0, ENABLE); /* Configure ADC3 Channel7 pin as analog input ******************************/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ; GPIO_Init(GPIOC, &GPIO_InitStructure); /* ADC Common Init **********************************************************/ ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent; ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2; ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles; ADC_CommonInit(&ADC_CommonInitStructure); /* ADC3 Init ****************************************************************/ ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; ADC_InitStructure.ADC_ScanConvMode = ENABLE; ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfConversion = 2; //ADC_InitStructure.ADC_NbrOfChannel = 2; ADC_Init(ADC3, &ADC_InitStructure); /* ADC3 regular channel7 configuration *************************************/ ADC_RegularChannelConfig(ADC3, ADC_Channel_10, 1, ADC_SampleTime_3Cycles); ADC_RegularChannelConfig(ADC3, ADC_Channel_11, 2, ADC_SampleTime_3Cycles); /* Enable DMA request after last transfer (Single-ADC mode) */ ADC_DMARequestAfterLastTransferCmd(ADC3, ENABLE); /* Enable ADC3 DMA */ ADC_DMACmd(ADC3, ENABLE); /* Enable ADC3 */ ADC_Cmd(ADC3, ENABLE); ADC_SoftwareStartConv(ADC3); }
  12. Да, спасибо, кажется это ответ. Я Сделал CSTACK больше и вроде сработало. А как узнать какой размер выделить под стеки? Можно еще вопросов глупых позадовать: 1. Память, выделяемая динамически, как то malloc тоже выделяется в стеке CSTACK? 2. Если используем, например, FreeRtos, то переменные, которые я объявляю внутри задачи где хранятся?
  13. функция: void TestSD( void ){ uint8_t buf[5000]; for( i = 0; i < 1024; i++ ){ buf[i] = 5; } После этих строк я вижу, что моя "5" появилась в чужих переменных. Как такое может быть, я же ему явно указал его размер? И как в иаре узнать сколько памяти сейчас выделено/осталось? Еще вопрос не в тему, кто-то говорил, что для определенных задач выделение памяти во время исполнения считается плохим тоном. Не могу придумать чем это плохо, если правильно делать
  14. Кусок своего кода для ыш-1000 прилагаю, но я использовал, кажется, 3-wire и NSS дергал вручную, не помню уже почему void ForceReg ( bit rw, unsigned char addr, unsigned char dataToReg ){ // Send SPI data using double buffered write EA = 0; NSS1 = 0; // drive NSS low SPIF1 = 0; if( rw ){ // clear SPIF SPI1DAT = (addr | 0x80 ); // write reg address } else { SPI1DAT = (addr ); // write reg address } while(!TXBMT1); // wait on TXBMT SPI1DAT = dataToReg; // write value while(!TXBMT1); // wait on TXBMT while((SPI1CFG & 0x80) == 0x80); // wait on SPIBSY curReg.dataFromReg = SPI1DAT; SPIF1 = 0; // leave SPIF cleared NSS1 = 1; EA = 1; // drive NSS high } Кроссбар и порты получаются утилитой, целый файл наверное нет смысла класть. Хотел сказать посмотрите осцилом что там реально получается, но тут это затруднительно :)
  15. У меня ситуация почти постоянно возникает такая, включаем плату, начинается обмен данными с датчиком. Заливаем/запускаем прошивку JTAGом, питание с датчиков не сбрасывается, поэтому их состояние неизвестно, а контроллер с новой прошивкой начинает все сначала. Получилось довольно некрасиво, но работает. Я просто думал может i2c можно аппаратно поклокать, принудительно ченить сделать чтобы байт от слейва дочитать, но пока не нашел способа. //Ïðîâåðêà ÷òî íèêòî èç ñëåéâîâ íå äåðæèò øèíó if( (I2C1->SR2 & I2C_SR2_BUSY) > 0 ){ GPIO_InitTypeDef GPIO_InitStructure; I2C_DeInit(I2C1); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOB, &GPIO_InitStructure); for( j = 0; j < 10; j++ ){ GPIOB->BSRRH = GPIO_Pin_8; for( i = 0; i < 0x0FFF; i++ ); GPIOB->BSRRL = GPIO_Pin_8; for( i = 0; i < 0x0FFF; i++ ); } API2C_Init(); }
×
×
  • Создать...