STM32F10x непонятное поведение ремапленного USART3

Продолжаю битву за урожай портирование девайса с Mega128 на STM32 и в принципе все уже давно портировал, тестирую различные камушки и конфигурации, и в процессе получаю то те, то другие грабли. Щас получил которые сам не могу понять — отвал USART3 на STM32F100 после весьма продолжительного времени нормальной работы…


(картинка если что в приложении)
Сейчас бьюсь с STM32F100RCT6 над USART3 — он перестает принимать данные через какое-то время…
При использовании STM32F103RET6 все было нормально (но как оказалось — работало пару дней потом тоже залипало), а при переходе на STM32F100RCT6 очень похоже, что через какоето время USART3 перестает генерировать прерывания — нет обмена данными по USART3, хотя по USART1 все отлично, причем время нормальной работы может быть и 15 минут и 8 часов — но при рестарте контроллера все работает нормально. USART3 работает на RS-485 микросхема драйвера ADM3485 сама работает нормально. Я смотрел через STM Studio и видел, что счетчик числа байтов в буффере не меняется — 0. Работа и функции используемые с 1 м и 3-м усартами полностью идентичны и конфиги для 103 и 100 камней отличаются одной ногой ADC и двумя GPIO.
Да USART3 ремапленный, да я использую SPI2 и I2C2, но в еррате сказано, что проблемы есть с Syncronious режимом USART3 и в Microexplorer см. приложения тоже все нормально.
STM Studio нормальная работа — видно что переменные меняются:


Отвалилось через 3 часа:


Как оказалось на 103 серии работает подольше но тоже потом отваливается.
Клоки F100:

void SetupClock()
{
      RCC_DeInit ();                    /* RCC system reset(for debug purpose)*/
      RCC_HSEConfig (RCC_HSE_ON);       /* Enable HSE                         */

      /* Wait till HSE is ready                                               */
      while (RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET);

      RCC_HCLKConfig   (RCC_SYSCLK_Div1);   /* HCLK   = SYSCLK                */
      RCC_PCLK2Config  (RCC_HCLK_Div1);     /* PCLK2  = HCLK                  */
      RCC_PCLK1Config  (RCC_HCLK_Div1);     /* PCLK1  = HCLK1 only for STM32F100X  */
      RCC_ADCCLKConfig (RCC_PCLK2_Div8);    /* ADCCLK = PCLK2/8               */

      /* PLLCLK = 8MHz * 3 = 24 MHz                                           */
      RCC_PLLConfig (RCC_PLLSource_PREDIV1, RCC_PLLMul_3);

      RCC_PLLCmd (ENABLE);                  /* Enable PLL                     */

      /* Wait till PLL is ready                                               */
      while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);

      /* Select PLL as system clock source                                    */
      RCC_SYSCLKConfig (RCC_SYSCLKSource_PLLCLK);

      /* Wait till PLL is used as system clock source                         */
      while (RCC_GetSYSCLKSource() != 0x08);

}


Инициализация USART3:

void SetupUSART3(uint16_t baud, uint16_t par)
{
	             NVIC_InitTypeDef  NVIC_InitStructure;
	             GPIO_InitTypeDef  GPIO_InitStructure;
	             USART_InitTypeDef USART_InitStructure;

	            //setting parametrs common for all uarts
	             USART_InitStructure.USART_BaudRate            = baud;


	             USART_InitStructure.USART_Parity              = par;

	             if(USART_InitStructure.USART_Parity==USART_Parity_No)
	               USART_InitStructure.USART_WordLength          = USART_WordLength_8b;
	               else
	               USART_InitStructure.USART_WordLength          = USART_WordLength_9b;

	             USART_InitStructure.USART_StopBits            = USART_StopBits_1;

	             USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	             USART_InitStructure.USART_Mode                = USART_Mode_Rx | USART_Mode_Tx;

	             /* Enable Clock and clock For REMAP - RCC_APB2Periph_AFIO                                             */

	             RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC |RCC_APB2Periph_AFIO, ENABLE); // Alternate Function

                 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);

                 /* Enable the USART3 Pins Software Remapping */
                   GPIO_PinRemapConfig(GPIO_PartialRemap_USART3, ENABLE); // TX/PC10, RX/PC11, CK/PC12, CTS/PB13, RTS/PB14

                 /* Configure USART3 Rx (PC11) as input floating                         */
                 GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_11;
                 GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IN_FLOATING;
                 GPIO_Init(GPIOC, &GPIO_InitStructure);

                 /* Configure USART3 Tx (PC10) as alternate function push-pull            */
                 GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_10;
                 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
                 GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;
                 GPIO_Init(GPIOC, &GPIO_InitStructure);

            	  USART_Init(USART3, &USART_InitStructure);
              	  USART_Cmd(USART3, ENABLE);

              	  //Setting interrupts

                  NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
                  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
                  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
                  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
                  NVIC_Init(&NVIC_InitStructure);

                  USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);  /* Enable Receive interrupt */

}



Что за фтигня может происходить?

UPD В общем железяки работают нормально с ремапом с установками: GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; на RX ноге
  • 0
  • 01 августа 2012, 18:01
  • GYUR22
  • 2
Файлы в топике: ic4_f100.zip, f100_usage.PNG

Комментарии (9)

RSS свернуть / развернуть
Как обычно отвечаю сам себе таким образом F100 работает второй день при инициализации усарта с ремапом на RX ногу поставил — GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
0
В смысле именно с такой настройкой оно нормально работает?
0
да почему то так, возможно попробовать другие настройки,
но т.к. вырубалось в течение нескольких часов — тестирую день минимум
0
Как оказалось и 103 тоже также только работает подольше почемуто
0
как доберусь в своем проекте до USARTa №3 — потестирую. Только у меня он вроде не ремапнутый будет…
0
Не ремапнутый вроде нормально пашет
0
Почему то 100 перестает работать GPIO_Speed_2MHz
Ща почему то сутки проработало GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
0
А с STM общался? Что-то на эту тему говорят?
Мож хоть в эррату добавят, чтобы другие не напарывались.
0
  • avatar
  • Vga
  • 08 августа 2012, 14:54
щас пока проверяю все — долго это как то
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.