USART шлет на комп фигню, а прерывания на прием не работают.

Кто любит RISC в жизни, заходим, не стесняемся.
AFG-92
Родился
Сообщения: 17
Зарегистрирован: Сб окт 03, 2009 17:59:12

Re: USART шлет на комп фигню, а прерывания на прием не работ

Сообщение AFG-92 »

Добрый день.
Возникла такая проблема. В STM32F401 на плате Diccovery инициализировал USART. Он заработал, но при попытке отправить данные на комп отправляется какой то мусор, т. е. не то что было отправлено. Отправлял на комп число 10 в десятичном, а в программе терминал отображалось 00 Е0 00 в шестнадцатиричном виде. На этом же форуме прочитал, что порты МК, которые конфигурируются как выводы USART должны быть свободными. Подключил их к РА2(Тх) и к РА3(Rx) которые на плате свободны, но принимаемое значение не изменилось. Подскажите, пожалуйста, в чем может быть причина?
P.S.
Что такое оверсемплинг в USART и может ли он как то искажать принимаемые данные?
Если да, то как его отключить или как извлечь данные?

Спасибо.
Реклама
AFG-92
Родился
Сообщения: 17
Зарегистрирован: Сб окт 03, 2009 17:59:12

Re: USART шлет на комп фигню, а прерывания на прием не работ

Сообщение AFG-92 »

Код

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

#include "stm32f4xx.h"                  // Device header
#include <stdio.h>
#define DELAY 100000

//****************************************************************************************************
//                                       ПЕРЕМЕННЫЕ
//****************************************************************************************************

uint8_t i = 0;
uint8_t num;

//****************************************************************************************************
//                                      ПОДПРОГРАММЫ
//****************************************************************************************************

void RCC_conf(void)
{
	RCC->CR &= 0;														// сброс регистра управления тактрованием
	RCC->CFGR |= RCC_CFGR_SW_PLL;						// источник тактирования системы - умножитель частоты
	RCC->PLLCFGR |= 0x00013008;							// вх. частота : 8(PLLM) х 192(PLLN) : 4(PLLP) и становится равной 48 МГц
	RCC->PLLCFGR |= RCC_PLLCFGR_PLLSRC_HSE; // вход умножителя - внешний кварц
	RCC->CFGR |= RCC_CFGR_PPRE1_DIV2;				// деление частоты шины APB1 в 2 раза (24МГц)
	RCC->CR |= RCC_CR_PLLON;								// активация Умножителя частоты
	RCC->CR |= RCC_CR_HSEON;								// разрешение внешнего тактирования
											
	
}


void GPIO_ini(void)
{
	RCC->AHB1ENR |= 0x00000008;					// тактирование группы портов D
	GPIOD->MODER |= 0x55555555;					// настройка их на вывод 
	GPIOD->OTYPER |= 0;
	GPIOD->OSPEEDR |= 0;								// частота работы портов минимальна
}

void sleep_ini(void)
{
	RCC->APB1ENR |= RCC_APB1ENR_PWREN;  //вкл тактирование PWR
	SCB->SCR |= 0x04; 									//для M3 разрешаем sleepdeep
	PWR->CR |= PWR_CR_PDDS;							//выбираем режим Power Down Deepsleep
	PWR->CR |= PWR_CR_CWUF ; 						//очищаем wakeup flag
	PWR->CSR |= PWR_CSR_EWUP; 					//разрешаем пробуждение по переднему фронту на А0
	//__WFE();  //уснули
}

void RTC_ini(void)
{
	RCC->APB1ENR |= RCC_APB1ENR_PWREN;  //вкл тактирование PWR
	PWR->CR |= 0x0100;									// получение доступа к регистрам RTC
	RCC->BDCR |= 0x00100;								// выбран внешний источник тактирования
	RCC->BDCR |= RCC_BDCR_LSEON;				// разрешение работы внешнего кварца
	RCC->BDCR |= 0x08000;								// запуск часов
}

void USART2_ini(void)
{
	
	RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;					// тактирование группы портов A
	GPIOA->MODER |= GPIO_MODER_MODER2_1 | 
	GPIO_MODER_MODER3_1;													// PA2 - PA3 альтернативная функция
	GPIOA->AFR[0] |= 0x00007700;									// настройка PA2 - PA3 на выводы USART1
	GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR2_1 |
	GPIO_OSPEEDER_OSPEEDR3_1;											// скорость работы пинов высокая
	
	RCC->APB1ENR |= RCC_APB1ENR_USART2EN;					// включение тактирования USART2
	USART2->BRR |= 0x00001388;					 					// бодрейт 9600
	USART2->CR1 |= USART_CR1_RE;				 					// разрешение работы приемника
	USART2->CR1 |= USART_CR1_TE;				 					// разрешение работы передатчика
	USART2->CR1 |= USART_CR1_UE;				 					// разрешение работы USART1
	//длина передачи 8 бит; проверка четности отключена; 
}


void Systick_ini(void)
{
	__enable_irq ();          										// глобальное разрешение прерываний
	SysTick->LOAD = ((uint32_t) 0x0186A00);				// число для перезагрузки 100000
	SysTick->CTRL = 															// тактирование от шины АНВ
	SysTick_CTRL_TICKINT_Msk |										// разрешение прерывания по окончанию счета
	SysTick_CTRL_ENABLE_Msk;											// запуск таймера SysTick

	
}



//*****************************************************************************************************
//                               ОБРАБОТЧИКИ ПРЕРЫВАНИЙ
//*****************************************************************************************************


void SysTick_Handler(void)
{
	//GPIOD->ODR >>= 1;
	USART2->DR = 10;
	//i++;
}

//*****************************************************************************************************
//                                  ОСНОВНАЯ ФУНКЦИЯ                                                    
//*****************************************************************************************************

int main(void)
{
	RCC_conf();
	GPIO_ini();
	RTC_ini();
	Systick_ini();
	USART2_ini();
	
	
	GPIOD->ODR = 0x8000;
	//char data_buf[30];
	
	while(1)
	{
		
		
		//sprintf (data_buf, "Hello, world");
		if(i > 9)
		{
			i = 0;
			GPIOD->ODR = 0x8000;
			
		}
	}
	
}
Реклама
Ответить

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