Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Настройка USART на PortB в STM32F050С6
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
flopix
Не могу настроить работу с USART на альтернативный порт B. МК STM32F050С6.

Вот код инициализации на порт A который у меня работает

Код
  GPIO_InitTypeDef GPIO_InitStructure;
  USART_InitTypeDef USART_InitStructure;
  
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);  

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);

  GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_1);
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_1);
  
  /* Configure UART1 pins:  Rx and Tx ----------------------------*/
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_2 | GPIO_Pin_3;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  
    
  USART_InitStructure.USART_BaudRate = 9600;
  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_Init(USART2, &USART_InitStructure);  
  
  USART_Cmd(USART2, ENABLE);




А вот инициализация на порт B которая работать не хочет, проверял осциллографом на выходе TX (PB6) тишина, после инициализации на выходе появляется напряжение питания но данных нет.

Код
  USART_InitTypeDef USART_InitStructure;
  GPIO_InitTypeDef GPIO_InitStructure;
    
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);

  GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_1);
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_1);

  //Configure USART1 pins:  Rx and Tx ----------------------------
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6 | GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
    
  USART_InitStructure.USART_BaudRate = 9600;
  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_Init(USART2, &USART_InitStructure);
    
  USART_Cmd(USART2, ENABLE);


Разобрался. Для порта B нужно:

GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_0);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_0);

и использовать USART1.

Подскажите в чем отличие USART1 и USART2? В мануале для порта A и B указано USART1, а в примере от ST используется USART2.



Теперь следующая проблема. Настроил чтение с USART по прерыванию, но в обработчике прерывания при попытке сбросить флаг прерывания

USART_ClearITPendingBit(USART1, USART_IT_RXNE);

вылетает assert_failed: lib\STM32F0xx_StdPeriph_Driver\src\stm32f0xx_usart.c line 1971

это

Код
void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint32_t USART_IT)
{
  uint32_t bitpos = 0, itmask = 0;
  /* Check the parameters */
  assert_param(IS_USART_ALL_PERIPH(USARTx));
  assert_param(IS_USART_CLEAR_IT(USART_IT)); //  <-----  вылет на этой строке
  
  bitpos = USART_IT >> 0x10;
  itmask = ((uint32_t)0x01 << (uint32_t)bitpos);
  USARTx->ICR = (uint32_t)itmask;
}


Что ему не нравится?
Golikov A.
обычно флаг есть данные в буфере УАРТ очищается сам когда вы считает данные из буфера. Так было на многих процессорах что я видел, думаю этот не исключение. Мануал что говорит про сброс флага? нужен ли он?

Также большинство ваших вопрос что были до последнего решается опять же мануалом. УАРТ1 от УАРТ2 отличается тем что это просто другое устройство, другая группа регистров. И надо смотреть опять же мануал на какие ноги какие устройства выходят.
flopix
Дело в том что я не могу найти нормальный мануал на этот контроллер даже на сайте производителя. Вот нашел этот но тут только краткое описание без подробностей.
topkin
Цитата(flopix @ Mar 16 2013, 12:06) *
Дело в том что я не могу найти нормальный мануал на этот контроллер даже на сайте производителя. Вот нашел этот но тут только краткое описание без подробностей.


Сей документ называется - reference manual.
Сыылка http://www.st.com/web/catalog/mmc/FM141/SC...ype=partnumber# , далее "Design Resources", там найдете ваш документ да и много чего интересного...
flopix
Из мануала

RXNE: Read data register not empty
This bit is set by hardware when the content of the RDR shift register has been transferred to
the USART_RDR register. It is cleared by a read to the USART_RDR register. The RXNE flag
can also be cleared by writing 1 to the RXFRQ in the USART_RQR register.
An interrupt is generated if RXNEIE=1 in the USART_CR1 register.
0: Data is not received
1: Received data is ready to be read.

Правильно я понимаю что когда я читаю байт данных с USART то RXNE флаг сбрасывается автоматически?

/* Receive Data */
return (uint16_t)(USARTx->RDR & (uint16_t)0x01FF);
Golikov A.
именно так. потому попытки его сбрасывать, особенно через не тот регистр на уровне функции ассерт вели к беде
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.