реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
flopix
сообщение Mar 15 2013, 23:34
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 105
Регистрация: 21-06-12
Пользователь №: 72 429



Не могу настроить работу с 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;
}


Что ему не нравится?

Сообщение отредактировал flopix - Mar 15 2013, 23:36
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Mar 16 2013, 04:24
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



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

Также большинство ваших вопрос что были до последнего решается опять же мануалом. УАРТ1 от УАРТ2 отличается тем что это просто другое устройство, другая группа регистров. И надо смотреть опять же мануал на какие ноги какие устройства выходят.
Go to the top of the page
 
+Quote Post
flopix
сообщение Mar 16 2013, 08:06
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 105
Регистрация: 21-06-12
Пользователь №: 72 429



Дело в том что я не могу найти нормальный мануал на этот контроллер даже на сайте производителя. Вот нашел этот но тут только краткое описание без подробностей.
Прикрепленные файлы
Прикрепленный файл  stm32f050c6.pdf ( 1.07 мегабайт ) Кол-во скачиваний: 13
 
Go to the top of the page
 
+Quote Post
topkin
сообщение Mar 16 2013, 08:37
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 152
Регистрация: 21-12-05
Из: Москва
Пользователь №: 12 476



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


Сей документ называется - reference manual.
Сыылка http://www.st.com/web/catalog/mmc/FM141/SC...ype=partnumber# , далее "Design Resources", там найдете ваш документ да и много чего интересного...
Go to the top of the page
 
+Quote Post
flopix
сообщение Mar 16 2013, 21:03
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 105
Регистрация: 21-06-12
Пользователь №: 72 429



Из мануала

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);
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Mar 17 2013, 06:16
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



именно так. потому попытки его сбрасывать, особенно через не тот регистр на уровне функции ассерт вели к беде
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 14th July 2025 - 00:12
Рейтинг@Mail.ru


Страница сгенерированна за 0.01413 секунд с 7
ELECTRONIX ©2004-2016