Согласно даташиту, микроконтроллеры STM32F103xC, STM32F103xD и STM32F103xE содержат 5 каналов USART. Конкретно у STM32F103VCT6 эти каналы выведены на пины:

Канал Пин Примечание
USART1 RX: PA10 / TX: PA9
CK: PA8 / CTS: PA11 / RTS: PA12
до 4.5 Мбит/с (APB2)
USART2 RX: PA3 / TX: PA2
CK: PA4 / CTS: PA0 / RTS: PA1
до 2.25 Мбит/с (APB1)
USART3 RX: PB11 / TX: PB10
CK: PB12 / CTS: PB13 / RTS: PB14
до 2.25 Мбит/с (APB1)
UART4 RX: PC11 / TX: PC10 до 2.25 Мбит/с (APB1)
UART5 RX: PD2 / TX: PC12 до 2.25 Мбит/с (APB1)

У платы HY-MINI доступными через свободные пины являются канал USART2 (кроме линии CK: пин PA4 используется в качестве линии TP_CS для выбора сенсорной панели) и канал USART3 (полностью). Канал USART1 естественным образом разведен – именно по нему происходит коммуникация с компьютером (PA9->USART1_TX; PA10->USART1_RX; PA11->USB_DM; PA12->USB_DP).

Возможность воспользоваться каналами UART4/5 невелика, так как “их” пины заняты для коммуникации с SD-карточкой, а именно
UART4: PC10 используется в качестве SDIO_D2, а PC11 – как SDIO_D3.
UART5: PC12 используется в качестве SDIO_CK, а PD2 – как SDIO_CMD.

Конечно, остается возможность ремаппинга каналов, однако она доступна только для каналов USART1…3, а стало быть, имеет смысл только для USART1.

Инициализация USART1 выглядит следующим образом:

void Usart1Init(void) {
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
USART_ClockInitTypeDef  USART_ClockInitStructure;
#ifdef BUFFERED
//конфигурируем NVIC
NVIC_InitTypeDef NVIC_InitStructure;
//создаем буферы для приема и передачи символов
BufferInit(&U1Rx);
BufferInit(&U1Tx);
#endif
//разрешаем тактирование шины
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);

// настройка пинов, используемых USART-каналом

//настраиваем пин PA09 (USART1->Tx) на выход (AF push-pull)
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//настраиваем пин PA10 (USART1->Rx) на вход (input floating)
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
USART_ClockStructInit(&USART_ClockInitStructure);
USART_ClockInit(USART1, &USART_ClockInitStructure);

// теперь очередь настраивать USART-канал

USART_InitStructure.USART_BaudRate = 9600;
// USART_InitStructure.USART_BaudRate = 2400;
// USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No ;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
//Write USART1 parameters
USART_Init(USART1, &USART_InitStructure);
//Enable USART1
USART_Cmd(USART1, ENABLE);
#ifdef BUFFERED
//select NVIC channel to configure
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
//set priority to lowest
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;
//set subpriority to lowest
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;
//enable IRQ channel
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
//update NVIC registers
NVIC_Init(&NVIC_InitStructure);
//disable Transmit Data Register empty interrupt
USART_ITConfig(USART1, USART_IT_TXE, DISABLE);
//enable Receive Data register not empty interrupt
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
#endif
}
А то, как эта настройка производится напрямую – через установку битов в соответствующих регистрах – можно посмотреть здесь. Эта же тема, но на русском языке – здесь.

Filed under: Микроконтроллеры,Программирование
Trackback Uri



Оставить комментарий

Вы должны войти чтобы оставить комментарий.