Не могу понять в чём дело.. процессор STM32F100C4 инициализирую при помощи файла STM32_Init.c
пытаюсь принять и передать байты по прерываниям...
принимать удаётся, только все принятые данные почему то смещены на 0х80
т.е. если передается
1 то принимаю 129 (0х81)
2 то принимаю 130 (0х82)
и Т.Д.
а вот передать через прерывание вообще не получается...
точнее .. если не через прерывания, то байт передаётся.. правда данные искажены..
если ставлю галочку в мастере TXE Interrupt Enable , по вообще всё виснет
помогите разобраться
инициализирую теперь так:
Код
void USART_configuration(void)
{
//Включение тактирования
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; //Тактирование GPIO
RCC->APB2ENR |= RCC_APB2ENR_AFIOEN; //Тактирование альтернативных функций GPIO
RCC->APB1ENR |= RCC_APB1ENR_USART2EN; //Тактирование USART2
//Конфигурирование PORTA.2 для TX; PORTA.3 для RX
GPIOA->CRL &= ~(0xFFUL << 8); // Clear PA2, PA3
GPIOA->CRL |= (0x0BUL << 8); // USART2 Tx (PA2) alternate output push-pull
GPIOA->CRL |= (0x04UL << 12); // USART2 Rx (PA3) input floating
//Задание режима работы
USART2->BRR = 0x0341; //Cкорость обмена 9600 бод
USART2->CR1 &= ~USART_CR1_M; //8 бит данных
USART2->CR2 &= ~USART_CR2_STOP; //Предочистка числа стоп-битов
USART2->CR2 |= USART_CR2_STOP_0; //Количество стоп-битов: 2
//Управление работой
USART2->CR1 |= USART_CR1_UE; //Включение модуля USART2
USART2->CR1 |= USART_CR1_TE; //Включение передатчика
USART2->CR1 |= USART_CR1_RE; //Включение приемника
//Разрешить прерывания
//NVIC_EnableIRQ (USART2_IRQn); //Прерывания USART2
// USART2->CR1 |= USART_CR1_TCIE; //Прерывание по завершении передачи
USART2->CR1 |= USART_CR1_RXNEIE; //Прерывание по завершении приема
NVIC->ISER[1] = (1 << (USART2_IRQn & 0x1F)); // enable interrupt
USART_ITConfig(USART2, USART_IT_TC, DISABLE);
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
{
//Включение тактирования
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; //Тактирование GPIO
RCC->APB2ENR |= RCC_APB2ENR_AFIOEN; //Тактирование альтернативных функций GPIO
RCC->APB1ENR |= RCC_APB1ENR_USART2EN; //Тактирование USART2
//Конфигурирование PORTA.2 для TX; PORTA.3 для RX
GPIOA->CRL &= ~(0xFFUL << 8); // Clear PA2, PA3
GPIOA->CRL |= (0x0BUL << 8); // USART2 Tx (PA2) alternate output push-pull
GPIOA->CRL |= (0x04UL << 12); // USART2 Rx (PA3) input floating
//Задание режима работы
USART2->BRR = 0x0341; //Cкорость обмена 9600 бод
USART2->CR1 &= ~USART_CR1_M; //8 бит данных
USART2->CR2 &= ~USART_CR2_STOP; //Предочистка числа стоп-битов
USART2->CR2 |= USART_CR2_STOP_0; //Количество стоп-битов: 2
//Управление работой
USART2->CR1 |= USART_CR1_UE; //Включение модуля USART2
USART2->CR1 |= USART_CR1_TE; //Включение передатчика
USART2->CR1 |= USART_CR1_RE; //Включение приемника
//Разрешить прерывания
//NVIC_EnableIRQ (USART2_IRQn); //Прерывания USART2
// USART2->CR1 |= USART_CR1_TCIE; //Прерывание по завершении передачи
USART2->CR1 |= USART_CR1_RXNEIE; //Прерывание по завершении приема
NVIC->ISER[1] = (1 << (USART2_IRQn & 0x1F)); // enable interrupt
USART_ITConfig(USART2, USART_IT_TC, DISABLE);
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
прерывание
Код
void USART2_IRQHandler(void)
{
volatile unsigned int IIR;
IIR = USART2->SR;
if(IIR & USART_IT_RXNE)
{
USART2->SR &= ~USART_IT_RXNE; // clear interrupt
if(usart2.rxcnt>(BUF_SZ-2)) usart2.rxcnt=0;
usart2.buffer[usart2.rxcnt++] = USART_ReceiveData (USART2);
usart2.delay=0;
if(usart2.rxcnt>7)usart2.rxgap=1; // принял всю посылку
}
{
volatile unsigned int IIR;
IIR = USART2->SR;
if(IIR & USART_IT_RXNE)
{
USART2->SR &= ~USART_IT_RXNE; // clear interrupt
if(usart2.rxcnt>(BUF_SZ-2)) usart2.rxcnt=0;
usart2.buffer[usart2.rxcnt++] = USART_ReceiveData (USART2);
usart2.delay=0;
if(usart2.rxcnt>7)usart2.rxgap=1; // принял всю посылку
}
ф-я маin
Код
stm32_Init (); // STM32 setup
USART_configuration();
while (1)
{
if(usart2.rxgap==1)
{
// if (usart2.buffer[0]==129)
// {
GPIOB->BSRR = GPIO_Pin_1; // передача
// rx_Data=usart2.buffer[1];
//USART_ITConfig(USART2, USART_IT_RXNE, DISABLE);
// USART_ITConfig(USART2, USART_IT_TC, ENABLE);
Delay(100);
USART_SendData(USART2, 1);
usart2.rxcnt=0;
usart2.rxtimer=0;
usart2.delay=0;
usart2.rxgap=0;
GPIOB->BRR = GPIO_Pin_1;
}
USART_configuration();
while (1)
{
if(usart2.rxgap==1)
{
// if (usart2.buffer[0]==129)
// {
GPIOB->BSRR = GPIO_Pin_1; // передача
// rx_Data=usart2.buffer[1];
//USART_ITConfig(USART2, USART_IT_RXNE, DISABLE);
// USART_ITConfig(USART2, USART_IT_TC, ENABLE);
Delay(100);
USART_SendData(USART2, 1);
usart2.rxcnt=0;
usart2.rxtimer=0;
usart2.delay=0;
usart2.rxgap=0;
GPIOB->BRR = GPIO_Pin_1;
}
приём остался таким же
1 то принимаю 129 (0х81)
2 то принимаю 130 (0х82)
и Т.Д.
а при передаче байта отправляется мусор !!!
и тоже если в конфигурации разрешить
USART2->CR1 |= USART_CR1_TCIE; //Прерывание по завершении передачи
то уже ничего не принимает ... похоже висит.
посоветуйте, что проверить? как ещё настроить?
осциллографом смотрел, битики при передаче бегут

