Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

Re: STM32F0 и USART

Вт дек 10, 2013 15:00:55

Код:
USART->CR1 =USART_CR1_TE|USART_CR1_RE |USART_CR1_RXNEIE;
USART1->CR2 &= ~USART_CR2_STOP;
NVIC_SetPriority(USART1_IRQn, 15);
NVIC_EnableIRQ(USART1_IRQn);
USART->CR1 =USART_CR1_UE ;


Bits 13:12STOP[1:0]: STOP bits
These bits are used for programming the stop bits.
00: 1 stop bit
01: Reserved.
10: 2 stop bits
11: 1.5 stop bit
This bit field can only be written when the USART is disabled (UE=0)


Как и многие другие биты ...

Re: STM32F0 и USART

Пт фев 05, 2016 19:27:46

Kvasshtain писал(а):Здравствуйте уважаемый Dosikus. Рад Вас видеть :)) . У меня STM32F051. Не ясно что записывать в AFR[1], и как это делать для других случаев. Т.е. я не понимаю откуда взялось число 0x0110, ну или по другому (1<<(2*4))|(1<<(1*4))?


добрый день,

действительно, почему тут устанавливаем биты именно так 0x0110?

Для чего тогда секция в файле stm32f051.s:

/****************** Bit definition for GPIO_AFRL register ********************/
#define GPIO_AFRL_AFR0 ((uint32_t)0x0000000F)
#define GPIO_AFRL_AFR1 ((uint32_t)0x000000F0)
#define GPIO_AFRL_AFR2 ((uint32_t)0x00000F00)
#define GPIO_AFRL_AFR3 ((uint32_t)0x0000F000)
#define GPIO_AFRL_AFR4 ((uint32_t)0x000F0000)
#define GPIO_AFRL_AFR5 ((uint32_t)0x00F00000)
#define GPIO_AFRL_AFR6 ((uint32_t)0x0F000000)
#define GPIO_AFRL_AFR7 ((uint32_t)0xF0000000)

/****************** Bit definition for GPIO_AFRH register ********************/
#define GPIO_AFRH_AFR8 ((uint32_t)0x0000000F)
#define GPIO_AFRH_AFR9 ((uint32_t)0x000000F0)
#define GPIO_AFRH_AFR10 ((uint32_t)0x00000F00)
#define GPIO_AFRH_AFR11 ((uint32_t)0x0000F000)
#define GPIO_AFRH_AFR12 ((uint32_t)0x000F0000)
#define GPIO_AFRH_AFR13 ((uint32_t)0x00F00000)
#define GPIO_AFRH_AFR14 ((uint32_t)0x0F000000)
#define GPIO_AFRH_AFR15 ((uint32_t)0xF0000000)

Re: STM32F0 и USART

Вт фев 09, 2016 20:09:05

помогите начинающему понять :beer:

для удобства, сам себе смог предложить только это:

GPIOA->AFR[1] |= GPIO_AFRH_AFR9_AF1 | GPIO_AFRH_AFR10_AF1;

предварительно добавил это:

#define GPIO_AFRH_AFR9_AF1 ((uint32_t)0x00000010)
#define GPIO_AFRH_AFR10_AF1 ((uint32_t)0x00000100)

либо уж тогда писать так:
*(uint32_t*)0x48000024 |= 0x0110;



а что означает синтаксис (1<<(2*4))|(1<<(1*4)) ?

Re: STM32F0 и USART

Вт фев 09, 2016 20:39:01

К примеру - GPIOA->AFR[0]|=2<<(4*2);
Первая 2 это альтернативная функция, находиться по таблице в даташите, 4 -именно столько занимает каждый пин в регистре AFR , а вторая 2 порядковый номер пина. В итоге мы имеем число определяющее альтернативную функцию и число в скобках на сколько бит сдвинуть. И довольно таки читаемо
Мы видим число определяющее альтернативную функцию и порядковый номер пина. Можно дефайнами конечно заменить.

Re: STM32F0 и USART

Вт фев 09, 2016 20:47:38

godz320 писал(а):для удобства

Для удобства... выдрать из СПЛ... да и все дела...
Код:
void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF)
{
  uint32_t temp = 0x00;
  uint32_t temp_2 = 0x00;
   
  temp = ((uint32_t)(GPIO_AF) << ((uint32_t)((uint32_t)GPIO_PinSource & (uint32_t)0x07) * 4)) ;
  GPIOx->AFR[GPIO_PinSource >> 0x03] &= ~((uint32_t)0xF << ((uint32_t)((uint32_t)GPIO_PinSource & (uint32_t)0x07) * 4)) ;
  temp_2 = GPIOx->AFR[GPIO_PinSource >> 0x03] | temp;
  GPIOx->AFR[GPIO_PinSource >> 0x03] = temp_2;
   
//   GPIO_PinAFConfig(GPIOA, 13, 5);   
}

Re: STM32F0 и USART

Вт фев 09, 2016 20:54:38

спасибо!! Пока нечего не понял,

но можно объяснить на данном примере?

GPIOA->AFR[1] | = 0x0110;

если я правильно понял, то это тождественно:

GPIOA->AFR[1] | = (1<<(2*4))|(1<<(1*4))

Re: STM32F0 и USART

Вт фев 09, 2016 21:02:27

HHIMERA писал(а): выдрать из СПЛ... да и все дела...


да хотелось бы конечно в процессе изучения использовать только даташит и набитые дефайны от производителя.

Re: STM32F0 и USART

Вт фев 09, 2016 21:04:47

AFR 32 битные , а ты предоставил 16 битное значение. Посмотри в RM описание AFR и приведи свое число к 32 битам и все станет на свои места

Re: STM32F0 и USART

Вт фев 09, 2016 21:23:34

AFR 32 битные

это я запомнил (stm32), навряд ли есть регистры 8 или 16 битные.


а ты предоставил 16 битное значение.

это не я предоставил, а вы. Цитата из первой страницы этой темы:



Посмотри в RM описание AFR и приведи свое число к 32 битам и все станет на свои места


На самом деле мне безраличен сейчас AFR, RM, 32 бита. Мне интересна конструкция ввида (1<<(2*4))|(1<<(1*4))

Re: STM32F0 и USART

Вт фев 09, 2016 21:37:49

Ну так не я же пихал 16 битное.

Читайте запись так сдвинуть 1 на 4 бита и сдвинуть 1 на 8 бит. Теперь откройте все же описание AFR в RM и посмотрите что находиться на этих позициях.

Re: STM32F0 и USART

Ср фев 10, 2016 11:46:51

выдрать из СПЛ... да и все дела...
зачем выдирать из спл ?
через месяц ломать голову - что там автор хотел сказать?
спл для F0 вполне рабочая.

Re: STM32F0 и USART

Ср фев 10, 2016 12:03:55

А зачем она вообще нужна... СПЛ??? Да ещё и для Ф0...
И что там ломать голову... если всё есть в хедере... почти...
И можно подумать... что СПЛ улучшает понимание чего-то там... наоборот... отдаляет...

Re: STM32F0 и USART

Вс апр 22, 2018 14:35:13

Народ, начал юзать STM32F0 DISCO на STM32F051, запустил USART1 по примеру из этого топика, добавил прерывания - прерывания по USART_ISR_RXNE и USART_ISR_TC идут, нет прерываний по приёму. Кому не в лом, плз гляньте инициализацию и прерывание:

Код:
// ======= Init SPI2 =======
void Init_USART1 (void)
{
  // PA9 -> USART1_TX, PA10 - USART1_RX
   
   RCC->APB2ENR |= RCC_APB2ENR_USART1EN; // Enable Clock USART1
  RCC->APB2ENR |= RCC_AHBENR_GPIOAEN;   // Enable Clock GPIOA

  GPIOA->MODER |= GPIO_MODER_MODER9_1;   // PA9  (TX) - Alternate function mode
  GPIOA->MODER |= GPIO_MODER_MODER10_1;  // PA10 (RX) - Alternate function mode
 
   GPIOA->AFR[1]  |= 0x0110;  // Alternate function at AF1
   
   GPIOA->OTYPER = 0; // Output push-pull
   
   GPIOA->PUPDR = 0; // No pull-up, no pull-down
   
  GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR9;  // PA9  (TX) - High speed
  GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR10; // PA10 (RX) - High speed
   
  RCC->CFGR3  &= ~RCC_CFGR3_USART1SW; // Set System Clock (SYSCLK) USART1
  RCC->CFGR3  |=  RCC_CFGR3_USART1SW_0;

//  USART1->BRR = 0x681; //Скорость обмена 9600
  USART1->BRR = 0x3FFF;
//  USART1->BRR = 0xFFFF;

  USART1->CR1 &= ~USART_CR1_M; //Данные - 8 бит
  USART1->CR2 &= ~USART_CR2_STOP; //1 стоп-бит

  USART1->CR1 |= USART_CR1_RE;     // Enable Receiver
  USART1->CR1 |= USART_CR1_TE;     // Enable Transmitter

  USART1->CR1 |= USART_CR1_RXNEIE; // RX Complete Interrupt Enable
  USART1->CR1 |= USART_CR1_TCIE; // Transmission Complete Interrupt Enable
//  USART1->CR1 |= USART_CR1_TXEIE; // Transmitter Empty Interrupt Enable
   
  USART1->CR1 |= USART_CR1_UE;  // Enable USART1

  NVIC_EnableIRQ (USART1_IRQn); // Enable Interrupt USART1
   
   USART1->TDR = 0x55; // Begin Transmitte
}   


Код:
// ===== USART1 TX Empty Interrupt =======
void USART1_IRQHandler (void)
{
  if (USART1->ISR & USART_ISR_RXNE) // Read data register not empty
   {
     char USART1_Data = USART1->RDR;

    if (CntRXUSART1++ & 0xF0) { LEDBLUE_DIS; }
     else                      { LEDBLUE_EN;  }
   }
   
  if (USART1->ISR & USART_ISR_TC) // Transmission complete
   {
      USART1->TDR = 0x55;

    if (CntTXUSART1++ & 0xF0) { LEDGREEN_DIS; }
     else                      { LEDGREEN_EN;  }
   }
}


По счётчикам CntRXUSART1 и CntTXUSART1 мигаю светодиодами на плате.

Re: STM32F0 и USART

Вс апр 22, 2018 15:09:26

А зачем ты RX настроил как выход?

Re: STM32F0 и USART

Вс апр 22, 2018 16:11:09

А зачем ты RX настроил как выход?

pls напиши что я сделал неправильно и как нужно правильно, STM32 только начал учить.

подключил на PA9 св.диод - глухо, выхода нет, тоже чёго-то неправильно настроил

Re: STM32F0 и USART

Вс апр 22, 2018 21:59:21

Код:
RCC->APB2ENR |= RCC_AHBENR_GPIOAEN;


Ничего не настораживает ? :roll:

Re: STM32F0 и USART

Пн апр 23, 2018 08:31:06

Код:
RCC->APB2ENR |= RCC_AHBENR_GPIOAEN;

Ничего не настораживает?

Благодарю, сам в упор не видел, исправлю, на выходе TX ничего нет, теперь понятно, что тактирования не было на порт.

Исправил, прошил, выход TX заработал, уже утром буду дальше ковырять.

Добавлено after 8 hours 54 minutes 12 seconds:
Ещё раз благодарю, приём есть, прерывания срабатывают, счётчики прерываний считают, светодиды мигают.

Re: STM32F0 и USART

Ср дек 19, 2018 11:33:27

Настроил USART1, по примерам, но после запуска контроллер "виснет" на Default handelr. Посмотрел память, действительно, в таблице векторов на обработчик USART1 стоит адрес дефолтного обработчика.
Т.е. по-видимому weak функция обработчика не переопределяется.
Подскажите, плиз, в чем может быть проблема?

Код:
int main(void)
  {
   // System Initialization
    SystemCoreClockUpdate();

   /* Initialize RTOS */
   osKernelInitialize();                 // Initialize CMSIS-RTOS

   // PORTA, PORTC AHB peripheral clock enable register (RCC_AHBENR) for GPIOs, DMA
   RCC->AHBENR |= RCC_AHBENR_GPIOAEN;
   RCC->AHBENR |= RCC_AHBENR_GPIOBEN;
   RCC->AHBENR |= RCC_AHBENR_GPIOCEN;

   // Initialize USART1 Interface

   RCC->APB2ENR |= RCC_APB2ENR_USART1EN;
   RCC->CFGR3     &= ~RCC_CFGR3_USART1SW;
   RCC->CFGR3     |=  RCC_CFGR3_USART1SW;   //HSI selected as USART1 clock

   // TX
   GPIOA->MODER |= _VAL2FLD(GPIO_MODER_MODER9, 0x2);
   GPIOA->OTYPER &= ~GPIO_OTYPER_OT_9;   // Reset bit
   GPIOA->PUPDR |= _VAL2FLD(GPIO_PUPDR_PUPDR9, GPIO_PuPd_DOWN);
   GPIOA->OSPEEDR |= _VAL2FLD(GPIO_OSPEEDR_OSPEEDR9,    GPIO_Speed_Level_3);
   GPIOA->AFR[1] |= _VAL2FLD(GPIO_AFRH_AFSEL9, 0x1);

   // RX
   GPIOA->MODER |= _VAL2FLD(GPIO_MODER_MODER10, 0x0);
   GPIOA->PUPDR |= _VAL2FLD(GPIO_PUPDR_PUPDR10, GPIO_PuPd_NOPULL);
   GPIOA->OSPEEDR |= _VAL2FLD(GPIO_OSPEEDR_OSPEEDR10,    GPIO_Speed_Level_3);
   GPIOA->AFR[1] |= _VAL2FLD(GPIO_AFRH_AFSEL10, 0x1);

   USART1->BRR = 0x46;
   USART1->CR1 |= USART_CR1_UE;
   USART1->CR1 &= ~USART_CR1_M;               //Данные - 8 бит
   USART1->CR2 &= ~USART_CR2_STOP;            //1 стоп-бит
   USART1->CR1 |= USART_CR1_TE;
   USART1->CR1 |= USART_CR1_RE;

   USART1->CR1 |= USART_CR1_RXNEIE;
   NVIC_EnableIRQ(USART1_IRQn);


   /*    Initialize output PC8 (blue LED) */

   

   osThreadNew(app_main, NULL, NULL);       // Create application main thread
   osThreadNew(gsm_power, NULL, NULL);       // Create GSM Power thread
   osThreadNew(onoff_key, NULL, NULL);       // Create onoff key monitoring thread
   osThreadNew(usart1_thread, NULL, NULL);       // Create onoff key monitoring thread
   osKernelStart();                      // Start thread execution
   for (;;) {}

//   for(;;){
//      // Read input state of button PA0
//      if(GPIOA->IDR & GPIO_IDR_0){
//         //GPIOB->BSRR |= GPIO_BSRR_BR_8;
//      }else{
//         //GPIOB->BSRR |= GPIO_BSRR_BS_8;
//      }
//   }
}

/***********************************/
/*** прерывание по приему данных ***/
/***********************************/
volatile unsigned int usart_temp;
void USART1_IRQHandler(void)
{
  if((USART1->ISR & USART_ISR_RXNE)!=0)
  {
    usart_temp = USART1->RDR;
  }
}


Добавлено after 10 minutes 26 seconds:
Разобрался))
Посмотрел на выход компилятора, по map файлу дефолтный обработчик проходил по имени как "USART1_IRQHandler", а моя функция как "USART1_IRQHandler()"
У меня проект на C++, поставил перед описанием extern "C", всё завелось.

Re: STM32F0 и USART

Ср дек 19, 2018 11:36:56

Если где-то засветился С++ компилятор, то надо так
Код:
extern "C" void USART1_IRQHandler()
{
  //...
}


Ну, ок, сам разобрался.

Re: STM32F0 и USART

Вс янв 13, 2019 16:20:40

Начал ковырять, stm32f030, не могу понять почему после того как остановил прием отладчиком, следующий байт не выставляет флаг RXNE
Принимаю байт так:
Код:
uint8_t ReadByte(USART_TypeDef* USARTx){
   while(!(USARTx->ISR & USART_ISR_RXNE)){};   
        return USARTx->RDR;
}

Инициализация минимальная


Main:
Код:
int main(){
InitDriverUsart(USART1,7600,NOT_REMAP);
while(1){
ReadByte(USART1);
ReadByte(USART1);
ReadByte(USART1);
ReadByte(USART1);
ReadByte(USART1);
ReadByte(USART1);
NOP;
}
}



Если поставить брекпоинт на NOP то после мк зависает на ожидании флага, хотя данные сами идут смотрю анализатором, ну и в одном из байте передается номер посылки, и он меняеться пока не остановил брек поинтом
Последний раз редактировалось pokk Вс янв 13, 2019 16:38:04, всего редактировалось 1 раз.
Ответить