С наступающим Новым Годом, уважаемые форумчане! Занимаюсь программированием микроконтроллеров около 7 лет, но недавно столкнулся с проблемой настройки USART2 у STM32F407. МК работает в связке с неким чёрным ящиком и общается с ним через max-232, используя USART. Требуемые настройки связи с данным прибором следующие:
- частота связи: 9600
- количество бит посылки: 8
- паритет: по чётному (even)
- стоповые биты: 1
Настроил следующим образом:
Настройки в терминале соответствуют заявленной конфигурации. МК должен послать в терминал (в итоге, к чёрному ящику) последовательность (HEX-формат) 0xA0 0x00 0x08 0xCA. Но в терминал приходит A0 00 88 CA, при чём положение флага выбора паритета (parity) в терминале не влияет на принимаемые данные, всегда приходит A0 00 88 CA. При изменении настроек МК (parity: No):
данные приходят бес искажения, при чём, и в этом случае положение флага выбора паритета (parity) в терминале не влияет на принимаемые данные.
Собственно, вопрос: где, по вашему мнению, следует искать баг?
P.S. С AVRками таких проблем не возникало.
P.P.S. Данный проект разрабатывается на DISCOVERY F4.
- частота связи: 9600
- количество бит посылки: 8
- паритет: по чётному (even)
- стоповые биты: 1
Настроил следующим образом:
Код: Выделить всё
void init_usart2(){
GPIO_InitTypeDef GPIO_InitStructure; //Структура содержащая настройки порта
USART_InitTypeDef USART_InitStructure; //Структура содержащая настройки USART
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); //Включаем тактирование порта A
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); //Включаем тактирование порта USART2
GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_USART2); //Подключаем PA3 к TX USART2
GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_USART2); //Подключаем PA2 к RX USART2
//Конфигурируем PA2 как альтернативную функцию -> TX UART
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//Конфигурируем PA3 как альтернативную функцию -> RX UART
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_Init(GPIOA, &GPIO_InitStructure);
USART_InitStructure.USART_BaudRate = 9600; //Скорость обмена 9600 бод
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //Длина слова 8 бит
USART_InitStructure.USART_StopBits = USART_StopBits_1; //1 стоп-бит
USART_InitStructure.USART_Parity = USART_Parity_Even; //Чётный
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //Включен передатчик и приемник USART2
USART_Init(USART2, &USART_InitStructure);
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
NVIC_EnableIRQ (USART2_IRQn);
USART_Cmd(USART2, ENABLE); //включить юарт2
}
int main(void){
init_usart2();
__enable_irq();
while(1){
put_char(0xA0);
put_char(0x00);
put_char(0x08);
put_char(0xCA);
if(read_flag){
char_to_lcd(chislo, 2); //некая функция, преобразующая массив полученных данных
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
read_flag=0;
}
for(unsigned int n=0; n<900000; n++) n=n;
}
}
void USART2_IRQHandler(void){
if (USART2->SR & USART_SR_RXNE){ //Проверяем, пришло ли что-нибудь в UART
USART1->SR&=~USART_SR_RXNE;
chislo[uart2_rx_bit]=USART2->DR; //Считываем то что пришло в массив
if(++uart2_rx_bit>5){
USART_ITConfig(USART2, USART_IT_RXNE, DISABLE);
uart2_rx_bit=0;
read_flag=1;
}
}
}
Код: Выделить всё
USART_InitStructure.USART_Parity = USART_Parity_No; //Проверка чётности
Собственно, вопрос: где, по вашему мнению, следует искать баг?
P.S. С AVRками таких проблем не возникало.
P.P.S. Данный проект разрабатывается на DISCOVERY F4.