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

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

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

Посмотрите, пожалуйста, может чего забыл. Не входит в обработчик по прерыванию от 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

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

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

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

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

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

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

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

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

USART_ITConfig( USART3, USART_CR1_TCIE, ENABLE);
Вместо неё вручную написал:

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

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

Сообщение 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);
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение 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»