Добрый день.
Возникла такая проблема. В STM32F401 на плате Diccovery инициализировал USART. Он заработал, но при попытке отправить данные на комп отправляется какой то мусор, т. е. не то что было отправлено. Отправлял на комп число 10 в десятичном, а в программе терминал отображалось 00 Е0 00 в шестнадцатиричном виде. На этом же форуме прочитал, что порты МК, которые конфигурируются как выводы USART должны быть свободными. Подключил их к РА2(Тх) и к РА3(Rx) которые на плате свободны, но принимаемое значение не изменилось. Подскажите, пожалуйста, в чем может быть причина?
P.S.
Что такое оверсемплинг в USART и может ли он как то искажать принимаемые данные?
Если да, то как его отключить или как извлечь данные?
Спасибо.
USART шлет на комп фигню, а прерывания на прием не работают.
- Реклама
Re: USART шлет на комп фигню, а прерывания на прием не работ
Код
Код: Выделить всё
#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;
}
}
}