Всем добрый вечер. Разбираюсь с stm32f10x. Столкнулся с проблемой uart.
Необходимо отправлять строки, а отправляются одиночные символы.
Обработчик перрывания
CODE
void USART2_IRQHandler(void)
{
// Recognizing the interrupt event
if(USART_GetFlagStatus(USART2,USART_FLAG_ORE))
{
USART_ClearFlag(USART2,USART_FLAG_ORE);
// Overrun Error
}
if(USART_GetFlagStatus(USART2,USART_FLAG_FE))
{
USART_ClearFlag(USART2,USART_FLAG_FE);
// Framing Error
}
if(USART_GetFlagStatus(USART2,USART_FLAG_NE))
{
USART_ClearFlag(USART2,USART_FLAG_NE);
// Noise Error
}
if(USART_GetFlagStatus(USART2,USART_FLAG_PE))
{
USART_ClearFlag(USART2,USART_FLAG_PE);
// Parity Error
}
// Push a new data into the receiver buffer
if(USART_GetFlagStatus(USART2,USART_FLAG_RXNE))
{
// Push a new data into the receiver buffer
Rx2Buf[Rx2Head++] = USART_ReceiveData(USART2);
if (Rx2Head >= US2_RXBUFSIZE) Rx2Head = 0;
}
if( USART_GetFlagStatus(USART2,USART_FLAG_TXE)
&& (USART_GetITStatus (USART2,USART_IT_TXE) == SET))
{
if (Tx2Tail != Tx2Head)
{
USART_SendData(USART2,Tx2Buf[Tx2Tail++]);
if (Tx2Tail >= US2_TXBUFSIZE) Tx2Tail = 0;
}
else
{
USART_ITConfig(USART2,USART_IT_TXE ,DISABLE);
}
}
}
инициализация uart
CODE
void UART2_init(unsigned int baudrate)
{
volatile Int8U Tmp;
USART_InitTypeDef UART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
/* USART_InitStruct members default value */
UART_InitStructure.USART_BaudRate = baudrate;
UART_InitStructure.USART_WordLength = USART_WordLength_8b;
UART_InitStructure.USART_StopBits = USART_StopBits_1;
UART_InitStructure.USART_Parity = USART_Parity_No ;
UART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
UART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
// Init receive and transmit FIFOs
Rx2Head = 0;// the circular buffer index
Rx2Tail = 0;
Tx2Head = 0;// the circular buffer index
Tx2Tail = 0;
// Release reset and enable clock
USART_DeInit(USART2);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
// GPIO Init
// Enable GPIO clock and release reset
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, DISABLE);
GPIO_PinRemapConfig(GPIO_Remap_USART2,DISABLE);
// Assign PA2 to UART2 (Tx)
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// Assign PA3 to UART2 (Rx)
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// Init UART2
USART_Init(USART2,&UART_InitStructure);
// Enable and configure the priority of the UART2 Update IRQ Channel
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = UART2_INTR_PRI;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
USART_ClearFlag(USART2, USART_FLAG_CTS | USART_FLAG_LBD |
USART_FLAG_TC | USART_FLAG_RXNE | USART_FLAG_IDLE |
USART_FLAG_ORE | USART_FLAG_NE | USART_FLAG_FE |
USART_FLAG_PE);
// Enable UART2 interrupts
USART_ITConfig(USART2,USART_IT_PE ,ENABLE);
USART_ITConfig(USART2,USART_IT_TC ,DISABLE);
//USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);
USART_ITConfig(USART2,USART_IT_RXNE,DISABLE);
USART_ITConfig(USART2,USART_IT_IDLE,DISABLE);
USART_ITConfig(USART2,USART_IT_LBD ,DISABLE);
USART_ITConfig(USART2,USART_IT_CTS ,DISABLE);
USART_ITConfig(USART2,USART_IT_ERR ,DISABLE);
// Enable the UART2
USART_Cmd(USART2, ENABLE);
}
процедура запихивания символа в fifo
CODE
void _putcharUART2(char data)
{
__disable_interrupt();
//USART_ITConfig(USART2,USART_IT_RXNE ,DISABLE); //запрещаем прерывание на приём
if( USART_GetITStatus (USART2,USART_IT_TXE) == RESET )
{
//прерывания по опустошению передающего регистра запрещены
//разрешаем прерывание
USART_SendData(USART2,data);
USART_ITConfig(USART2,USART_IT_TXE ,ENABLE);
}
else
{
//ложим байт в fifo
Tx2Buf[Tx2Head++] = data;
if (Tx2Head >= US2_TXBUFSIZE) Tx2Head = 0;
}
__enable_interrupt();
}
одиночные символы раз в 4 секунды отправляются.
А строка закинутая через
Код
void _putstringUART2( const char *pData) { while(*pData != 0x00) _putcharUART2( (char) (*pData++)); }
не отправляется.
Отправка по такому принципу 100% работает в lpc17 и sam7x.
Может чтото в коде упускаю?