Всем доброго времени суток!
Проковырялся уже два дня - не удается инициализировать последовательный порт USART1 в stm32l152cbt6.
Код
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB, ENABLE);
RCC_AHBPeriphResetCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB,DISABLE);
// Èíèöèàëèçèðóåì ïîñëåäîâàòåëüíûé ïîðò.
/* Enable UART clock */
RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1,DISABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
RCC_APB2PeriphClockLPModeCmd(RCC_APB2Periph_USART1,ENABLE);
USART_DeInit(USART1);
// GPIO_PinAFConfig(GPIOA, GPIO_Pin_8, GPIO_AF_USART1);
/* Connect PXx to USARTx_Tx */
GPIO_PinAFConfig(GPIOA, GPIO_Pin_9, GPIO_AF_USART1);
/* Connect PXx to USARTx_Rx */
GPIO_PinAFConfig(GPIOA, GPIO_Pin_10, GPIO_AF_USART1);
/* Connect PXx to USARTx_Rx */
// GPIO_PinAFConfig(GPIOA, GPIO_Pin_11, GPIO_AF_USART1);
/* Connect PXx to USARTx_Rx */
// GPIO_PinAFConfig(GPIOA, GPIO_Pin_12, GPIO_AF_USART1);
VD3G_ON;
/* Configure USART Tx as alternate function push-pull */
/* Configure USART Rx as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// GPIO_SetBits(GPIOA,GPIO_Pin_9|GPIO_Pin_10);
VD3G_OFF;
// Èíèöèàëèçèðóåì ïåðåäåñêðèòèçàöèþ 8õ.
USART_OverSampling8Cmd(USART1,ENABLE);
// Èíèöèàëèçàöèÿ îäèíî÷íîãî òåñòèðîâàíèÿ ëèíèè ïðèåìíèêà.
USART_OneBitMethodCmd(USART1,ENABLE);
USART_ReceiverWakeUpCmd(USART1,DISABLE);
USART_InitStructure.USART_BaudRate = baudrate;
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_Rx | USART_Mode_Tx;
/* USART configuration */
USART_Init(USART1, &USART_InitStructure);
/* Enable USART */
USART_Cmd(USART1, ENABLE);
/* Enable the USART Receive interrupt */
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
/* Enable USART Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
Здесь уже добавил все что только можно, но не работает.
Симптомы следующие - после вызова PinAFConfig начинает нарастать напряжение на выводах rx tx в течение примерно 10-20мкс. Далее напряжение падает в ноль и все. Постоянно ноль на обоих выводах. Судя по ходу программы - порт работает и куда то передает байты, так как прерывания выполняются и видимость работы есть.
Устройство периодически ложится спать в режимах sleep и stop, но во время выполнения процедуры инициализации такого нет. Также используется усб - соседние линии совмещенные с RTS/CTS порта. Но для эксперимента все отключил и выполнил инициализацию сначала прошивки - не помогло.
Порт рабочий - прошивка через него шьется, если выводы инициализировать на цифровой вход подтянутый к единице - логическая единица на обоих. То есть выводы снаружи ничем не нагружены.
Заранее спасибо за подсказку!