Пн дек 02, 2013 15:27:58
Пн дек 02, 2013 15:41:41
// Включить тактирование порта А
RCC->AHBENR |= RCC_AHBENR_GPIOBEN;
Пн дек 02, 2013 16:12:18
Вт дек 03, 2013 10:03:15
Пт дек 06, 2013 09:29:26
#include "stm32f0xx.h"
#define APBCLK 8000000UL
#define BAUDRATE 9600UL
int flag = 0;
void Init_usart(void)
{
// Включить тактирование порта А
RCC->AHBENR |= RCC_AHBENR_GPIOAEN;
// Включаем тактирование USART1
RCC->APB2ENR |= RCC_APB2ENR_USART1EN; //Включаем тактирование USART1
GPIOA->MODER |= GPIO_MODER_MODER10_1; // PA10 (RX) - Alternate function mode
GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR10; // PA10 (RX) - High speed
GPIOA->AFR[1] |= 0x0110; //
RCC->CFGR3 &= ~RCC_CFGR3_USART1SW;
RCC->CFGR3 |= RCC_CFGR3_USART1SW_0; //System clock (SYSCLK) selected as USART1 clock
USART1->CR1 |= USART_CR1_UE; //Включаем USART1
USART1->CR1 &= ~USART_CR1_M; //Данные - 8 бит
USART1->CR2 &= ~USART_CR2_STOP; //1 стоп-бит
USART1->BRR =(APBCLK+BAUDRATE/2)/BAUDRATE; //скорость usart
USART1->CR1 |= USART_CR1_TE; //Включаем передатчик USART1
USART1->CR1 |= USART_CR1_RE; //Включаем приемник USART1
USART1->CR1 |= USART_CR1_RXNEIE; //Разрешаем прерывание по приему USART1 в самом модуле USART1
//NVIC_SetPriority(USART1_IRQn, 15); // Как я понял, это функция, которая позволяет изменить приоритет прерывания
//(вот только, что происходит с тем прерыванием, которое имело этот приоритет по умолчанию я не знаю)
NVIC_EnableIRQ(USART1_IRQn); // А эта функция, как я понял, разрешает прерывание от USART1
}
...
void USART1_DAC_IRQHandler(void) // Обработчик прерывания по приему символа USART
{
USART1->ISR &= ~USART_ISR_RXNE; // Сбрасываем флаг (RDR не пуст, принят символ)
flag = 1;
}
// Главный цикл
int main(void)
{
Init_GPIO();
Init_usart();
while(1)
{
// Моргание ножкой pc9!
led_On9();
delay(1000000UL);
led_Off9();
if (flag)
{
led_On8();
delay(1000000UL);
led_Off8();
flag = 0;
}
delay(1000000UL);
}
}
Пт дек 06, 2013 10:13:13
Kvasshtain писал(а): То есть я не беру из RDR данных. Может дело в этом (читал в даташыте, что есть там такае фишка как ошибка перезаписи)?
Kvasshtain писал(а):Еще попутный вопрос: Что делают функции NVIC_SetPriority и NVIC_EnableIRQ. Как я понял, первая меняет приоритет прерывания (круто, такого в AVR-ках не было), но тогда, что случается с прерыванием, которое имело приоритет, который мы хотим задать для нашего прерывания. А вторая разрешает прерывание от аппаратного модуля USART (при этом USART1->CR1 |= USART_CR1_RXNEIE - Разрешаем прерывание по приему USART1 в самом модуле USART1). Хочу сказать, что вход в прерывание происходит точно, это видно и по отладчику (которым я пока плохо умею пользоваться) и, когда я размещаю функцию зажигания диода в теле обработчика прерывания, по загорающемуся синему светику.
Kvasshtain писал(а):Ну и на последок, чем отличаются обработчики USART1_DAC_IRQHandler и USART1_IRQHandler, пробовал и тот и другой .
delay(1000000UL);
Пт дек 06, 2013 10:31:19
Пт дек 06, 2013 10:51:51
Default_Handler PROC
EXPORT WWDG_IRQHandler [WEAK]
EXPORT PVD_IRQHandler [WEAK]
EXPORT RTC_IRQHandler [WEAK]
EXPORT FLASH_IRQHandler [WEAK]
EXPORT RCC_IRQHandler [WEAK]
EXPORT EXTI0_1_IRQHandler [WEAK]
EXPORT EXTI2_3_IRQHandler [WEAK]
EXPORT EXTI4_15_IRQHandler [WEAK]
EXPORT TS_IRQHandler [WEAK]
EXPORT DMA1_Channel1_IRQHandler [WEAK]
EXPORT DMA1_Channel2_3_IRQHandler [WEAK]
EXPORT DMA1_Channel4_5_IRQHandler [WEAK]
EXPORT ADC1_COMP_IRQHandler [WEAK]
EXPORT TIM1_BRK_UP_TRG_COM_IRQHandler [WEAK]
EXPORT TIM1_CC_IRQHandler [WEAK]
EXPORT TIM2_IRQHandler [WEAK]
EXPORT TIM3_IRQHandler [WEAK]
EXPORT TIM6_DAC_IRQHandler [WEAK]
EXPORT TIM14_IRQHandler [WEAK]
EXPORT TIM15_IRQHandler [WEAK]
EXPORT TIM16_IRQHandler [WEAK]
EXPORT TIM17_IRQHandler [WEAK]
EXPORT I2C1_IRQHandler [WEAK]
EXPORT I2C2_IRQHandler [WEAK]
EXPORT SPI1_IRQHandler [WEAK]
EXPORT SPI2_IRQHandler [WEAK]
EXPORT USART1_IRQHandler [WEAK]
EXPORT USART2_IRQHandler [WEAK]
EXPORT CEC_IRQHandler [WEAK]
Пт дек 06, 2013 13:25:06
Пт дек 06, 2013 13:41:47
Пт дек 06, 2013 13:50:33
Пт дек 06, 2013 18:08:09
void init_usart (void)
{
GPIO_InitTypeDef GPIO_InitStruct;
USART_InitTypeDef USART_InitStructure;
// установка пинов USART
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_1); // USART1_TX
GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_1); // USART1_RX
// Разрешить тактирование USART
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
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(USART1, &USART_InitStructure);
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
{}
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
USART_Cmd(USART1, ENABLE);
}
char string[20];
unsigned char counter = 0;
void USART1_IRQHandler (void)
{
char litera = USART_ReceiveData(USART1); // здесь читаю байт из USART
portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
USART_RequestCmd(USART1, USART_Request_RXFRQ, ENABLE); // здесь запись флага не помогает сбросить
if ( (litera == '\r') || (counter >= 19) )
{
counter = 0;
xQueueSendToBackFromISR (g.xOUT_USART1_Queue, &string, &xHigherPriorityTaskWoken);
//memcpy(out_str, string, 20);
if (xHigherPriorityTaskWoken == pdTRUE)
taskYIELD();
}
else
{
string[counter++] = litera;
string[counter] = 0;
}
}
Пт дек 06, 2013 18:51:46
Пт дек 06, 2013 20:07:35
g_pfnVectors:
.word _eram
.word Reset_Handler
.word NMI_Handler
.word HardFault_Handler
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word SVC_Handler /*SVC_Handler*/
.word 0
.word 0
.word PendSV_Handler /*PendSV_Handler*/
.word SysTick_Handler /*SysTick_Handler*/
.word WWDG_IRQHandler
.word PVD_IRQHandler
.word RTC_IRQHandler
.word FLASH_IRQHandler
.word RCC_IRQHandler
.word EXTI0_1_IRQHandler
.word EXTI2_3_IRQHandler
.word EXTI4_15_IRQHandler
.word TS_IRQHandler
.word DMA1_Channel1_IRQHandler
.word DMA1_Channel2_3_IRQHandler
.word DMA1_Channel4_5_IRQHandler
.word ADC1_COMP_IRQHandler
.word TIM1_BRK_UP_TRG_COM_IRQHandler
.word TIM1_CC_IRQHandler
.word TIM2_IRQHandler
.word TIM3_IRQHandler
.word TIM6_DAC_IRQHandler
.word 0
.word TIM14_IRQHandler
.word TIM15_IRQHandler
.word TIM16_IRQHandler
.word TIM17_IRQHandler
.word I2C1_IRQHandler
.word I2C2_IRQHandler
.word SPI1_IRQHandler
.word SPI2_IRQHandler
.word USART1_IRQHandler
.word USART2_IRQHandler
.word 0
.word CEC_IRQHandler
.word 0
.word BootRAM
void init_nvic (void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
Пт дек 06, 2013 20:29:31
GARMIN писал(а):В прервание я отладчиком попадаю, но впрерывании значение регистра USART_CR1 0000002d, то есть
флаг RXNEIE установлен и не сбрасывается при выходе из прерывания.
Где копать?
Пт дек 06, 2013 21:06:30
Пт дек 06, 2013 21:15:57
GARMIN писал(а):Я, наверное, не тот даташит смотрел. У меня есть RM0091 STM32F05 reference manual,
Пт дек 06, 2013 21:39:41
97 string[counter] = 0;
08002ada: ldr r3, [pc, #20] ; (0x8002af0 <USART1_IRQHandler+136>)
08002adc: ldrb r3, [r3, #0]
08002ade: ldr r2, [pc, #24] ; (0x8002af8 <USART1_IRQHandler+144>)
08002ae0: movs r1, #0
08002ae2: strb r1, [r2, r3]
99 }
08002ae4: mov sp, r7
08002ae6: add sp, #8
08002ae8: pop {r7, pc} // вот отсюда шагаю прямо в начало прерывания
nop ; (mov r8, r8)
Пт дек 06, 2013 21:50:27
GARMIN писал(а):Спасибо, хоть успокаиваешь.
Я так понял, что прерывание зацикливается.
После выполнения прерывания процессор тупо переходит на его начало
Пт дек 06, 2013 22:10:21