Прерывание по UART. Контроллер STM32L152CB

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
алёша
Первый раз сказал Мяу!
Сообщения: 37
Зарегистрирован: Чт апр 30, 2009 17:16:31

Прерывание по UART. Контроллер STM32L152CB

Сообщение алёша »

Посмотрите, пожалуйста, может чего забыл. Не входит в обработчик по прерыванию от UART. Передача идёт, замкнул передатчик на приёмник. NVIC вроде настроил.

Код: Выделить всё

#include "stm32l1xx_gpio.h"
#include "stm32l1xx.h"



int Usart_Initialization()
{
   USART_InitTypeDef UsartStructure;
   
     UsartStructure.USART_BaudRate = 9600;                     
    UsartStructure.USART_WordLength = USART_WordLength_8b; 
    UsartStructure.USART_StopBits = USART_StopBits_1;   
    UsartStructure.USART_Parity = USART_Parity_No ;
    UsartStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    UsartStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
      
      USART_Init(USART3, &UsartStructure);
      
      return 0;
}



int Gpio_initialization()
{
   GPIO_InitTypeDef GpioStructure;
   
   //-----PORTB-----// --- PB8
   GpioStructure.GPIO_Pin = GPIO_Pin_8;
   GpioStructure.GPIO_Mode = GPIO_Mode_OUT;
   GpioStructure.GPIO_Speed = GPIO_Speed_40MHz ; //GPIO_Speed_2MHz
   GpioStructure.GPIO_OType = GPIO_OType_PP;
   GpioStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //  GPIO_PuPd_DOWN
   
   GPIO_Init(GPIOB, &GpioStructure);
   
   
   //-----PORTB-----// --- PB10 - UART3_TX
   
   GpioStructure.GPIO_Pin = GPIO_Pin_10;
   GpioStructure.GPIO_Mode = GPIO_Mode_AF;        // GPIO_Mode_AF   RECOVER!!!
    GpioStructure.GPIO_Speed = GPIO_Speed_40MHz ; //GPIO_Speed_2MHz
   GpioStructure.GPIO_OType = GPIO_OType_PP;
   GpioStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //  GPIO_PuPd_DOWN 
   
   GPIO_Init(GPIOB, &GpioStructure);
   
   GPIO_PinAFConfig( GPIOB, GPIO_PinSource10, GPIO_AF_USART3 );
   
   
      //-----PORTB-----// --- PB11 - UART3_RX
   
   GpioStructure.GPIO_Pin = GPIO_Pin_11;
   GpioStructure.GPIO_Mode = GPIO_Mode_AF;       // GPIO_Mode_IN    RECOVER!!!
   GpioStructure.GPIO_Speed = GPIO_Speed_40MHz ; //GPIO_Speed_2MHz
   GpioStructure.GPIO_OType = GPIO_OType_PP;
   GpioStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //  GPIO_PuPd_DOWN
   
   GPIO_Init(GPIOB, &GpioStructure);
   
   GPIO_PinAFConfig( GPIOB, GPIO_PinSource11, GPIO_AF_USART3 );
   
      //-----PORTA-----// --- PA11
   GpioStructure.GPIO_Pin = GPIO_Pin_11;
   GpioStructure.GPIO_Mode = GPIO_Mode_OUT;
   GpioStructure.GPIO_Speed = GPIO_Speed_40MHz ; //GPIO_Speed_2MHz
   GpioStructure.GPIO_OType = GPIO_OType_PP;
   GpioStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //  GPIO_PuPd_DOWN
   
   GPIO_Init(GPIOA, &GpioStructure);
   
   //-----PORTA-----// --- PA10
   GpioStructure.GPIO_Pin = GPIO_Pin_10;
   GpioStructure.GPIO_Mode = GPIO_Mode_IN;
   GpioStructure.GPIO_Speed = GPIO_Speed_40MHz ; //GPIO_Speed_2MHz
   GpioStructure.GPIO_OType = GPIO_OType_PP;
   GpioStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //  GPIO_PuPd_DOWN
   
   GPIO_Init(GPIOA, &GpioStructure);
   
   
   
   return 0;
}


void USART3_IRQHandler( void )
{
   char *ptRX;
   
   if( USART3 -> SR & USART_SR_TC)
      GPIO_SetBits(GPIOB, GPIO_Pin_8);

}



int main()
{      
    int i, j;
    char strTX[64] = "AT";
    char* pszTX = strTX;


   
   // Clocks
   RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOB, ENABLE );
   RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOA, ENABLE );
   RCC_APB1PeriphClockCmd( RCC_APB1Periph_USART3, ENABLE);
   
   // GPIO
   Gpio_initialization();
   
   //UART
   Usart_Initialization();         
   USART_Cmd( USART3, ENABLE );     
   
   // Interrupts
   
   NVIC_EnableIRQ( USART3_IRQn );                                       
  USART_ITConfig( USART3, USART_CR1_TCIE, ENABLE);
   //__enable_irq ();   



                                               

   USART_SendData(USART3, *pszTX);               
while(1);
   
}



Кстати, приёмник начал работать только после того, как установил ножку приёмника не как вход, а как альтернативную функцию. Не смог найти в даташите, в какой режим устанавливать ножки, когда ими управляет периферия. В документации на тот же STM32F100 в разделе GPIO есть таблички. Причём для ножки-приёмника там указано input floating.


Заранее спасибо!
Реклама
алёша
Первый раз сказал Мяу!
Сообщения: 37
Зарегистрирован: Чт апр 30, 2009 17:16:31

Re: Прерывание по UART. Контроллер STM32L152CB

Сообщение алёша »

Когда вызываю прерывание вручную, то работает:

Код: Выделить всё

NVIC -> ISPR[1] |= (1<<7);



Где-то ещё нужно включить разрешение прерывания?
Реклама
алёша
Первый раз сказал Мяу!
Сообщения: 37
Зарегистрирован: Чт апр 30, 2009 17:16:31

Re: Прерывание по UART. Контроллер STM32L152CB

Сообщение алёша »

Блин, извиняюсь, лень взяла своё. Не посмотрел, что вот это за фигня:

Код: Выделить всё

USART_ITConfig( USART3, USART_CR1_TCIE, ENABLE);


Вместо неё вручную написал:

Код: Выделить всё

USART3 -> CR1 |= USART_CR1_TCIE;


Правда теперь и без отправки данных прерывание срабатывает. Причём когда отпускаешь программу. При отладке не срабатывает. Ладно, будем думать :)
Аватара пользователя
Pavel_1978
Опытный кот
Сообщения: 830
Зарегистрирован: Пт ноя 16, 2007 11:21:37

Re: Прерывание по UART. Контроллер STM32L152CB

Сообщение Pavel_1978 »

Все правильно, флаг USART_CR1_TCIE выставляется когда последний байт полностью передан. Проще говоря это флаг готовности к передаче. Соответственно его надо сбрасывать в обработчике или в функции отвечающей за передачу.

Ну и вообще передатчик USART включить надо например так:

Код: Выделить всё

//Заполняем структуру настройками UARTa
    USART_InitTypeDef uart_struct;
    uart_struct.USART_BaudRate            = 9600;
    uart_struct.USART_WordLength          = USART_WordLength_8b;
    uart_struct.USART_StopBits            = USART_StopBits_1;
    uart_struct.USART_Parity              = USART_Parity_No ;
    uart_struct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

    // разрешаем прием и передачу соответственно
    uart_struct.USART_Mode                = USART_Mode_Rx | USART_Mode_Tx;
    //Инициализируем UART
    USART_Init(USART1, &uart_struct);
    //Включаем UART
    USART_Cmd(USART1, ENABLE);
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: Прерывание по UART. Контроллер STM32L152CB

Сообщение dosikus »

Pavel_1978 писал(а):Все правильно, флаг USART_CR1_TCIE выставляется когда последний байт полностью передан. Проще говоря это флаг готовности к передаче.


Вот же блин дети SPL и аурдуньи . :)))
Какой в ж. USART_CR1_TCIE флаг ? Читайте реф.мануал наконец .

Вдумчиво вчитываемся в Transmission Complete Interrupt Enable
Так же внимательно смотрим на диаграмму на стр. 689 реф.мануал :

Изображение

алёша писал(а):Кстати, приёмник начал работать только после того, как установил ножку приёмника не как вход, а как альтернативную функцию. Не смог найти в даташите, в какой режим устанавливать ножки, когда ими управляет периферия. В документации на тот же STM32F100 в разделе GPIO есть таблички. Причём для ножки-приёмника там указано input floating.
!


А если все же внимательно читать , учитывая что USART и есть периферия ? :)))
И Што L это всяко не F100 ...
• Peripheral alternate function
For the ADC and DAC, configure the desired I/O as analog in the GPIOx_MODER
register.
For other peripherals:
– Configure the desired I/O as an alternate function in the GPIOx_MODER register
– Select the type, pull-up/pull-down andoutput speed via the GPIOx_OTYPER,
GPIOx_PUPDR and GPIOx_OSPEEDERregisters, respectively
– Connect the I/O to the desired AFx inthe GPIOx_AFRL or GPIOx_AFRH register
Реклама
Ответить

Вернуться в «ARM»