Код: Выделить всё
Добавлено after 36 minutes 14 seconds:
ии
Добавлено after 32 seconds:
Код: Выделить всё
Код: Выделить всё
Код: Выделить всё
Код: Выделить всё
RCC_ClocksTypeDef RCC_Clocks;
RCC_GetClocksFreq (&RCC_Clocks);
Код: Выделить всё
Код: Выделить всё
RCC_ClocksTypeDef RCC_Clocks;
RCC_GetClocksFreq (&RCC_Clocks);
Как ругается?ivan dimir писал(а):на жто компелятор ругается
Код: Выделить всё
#include <stm32f4xx_rcc.h>Код: Выделить всё
RCC_PLLCFGR_PLLP
AHB Prescaler
APB2 PrescalerКод: Выделить всё
USART1->CR1 |= USART_CR1_RXNEIE;
NVIC_EnableIRQ (USART1_IRQn);Код: Выделить всё
void UsartInit(uint16_t baud)
{
USART1->BRR = (uint16_t)baud;
USART1->CR1 |= USART_CR1_TE | USART_CR1_RE | USART_CR1_UE;
USART1->CR2 = 0;
USART1->CR3 = 0;
}
void nast_uart(void)
{ uint16_t i;
for( i=100; i<0xFFF0; i++ )
{
UsartInit(i);
tx_uart1 (0x0a); tx_uart1 (0x0d);
tx_uart1 ('K');tx_uart1 ('O');tx_uart1 ('D');tx_uart1 ('=');
tx_uart1 ((i/10000)%10+0x30);
tx_uart1 ((i/1000)%10+0x30);
tx_uart1 ((i/100)%10+0x30);
tx_uart1 ((i/10)%10+0x30);
tx_uart1 ((i/1)%10+0x30);
tx_uart1 (0x0a); tx_uart1 (0x0d);
}
}
Код: Выделить всё
timer6_init();
//ds18b20_init();
USART1_init();
nast_uart(); ////////////////////
// adc_init();
I2C_Init();Найди. Без него никак.Там на рисунке есть PLL и что такое R я не нашол
Код: Выделить всё
ComPort UART_base::open
(
ComPort _port,
uint32 _baudRate,
uint8 _dataBits,
Parity _parity,
StopBits _stopBits
)
{
switch( _port )
{
case COMPORT1:
{
usart = USART1;
break;
}
case COMPORT2:
{
usart = USART2;
break;
}
case COMPORT6:
{
usart = USART6;
break;
}
default:
{
usart = 0;
_port = UNKNOWNPORT;
break;
}
}
port = _port;
baudRate = _baudRate;
dataBits = _dataBits;
parity = _parity;
stopBits = _stopBits;
if
(
( port == UNKNOWNPORT ) ||
( usart == 0 )
)
{
return UNKNOWNPORT;
}
// ---- _baudRate ----
if( ( _baudRate == 0 ) || ( _baudRate > 921000UL ) )
{
lastError = INVALID_BAUDRATE;
return port;
}
// ---- _dataBits ----
if( _dataBits != 8 )
{
lastError = UNSUPPORTED_DATA_BITS_VALUE;
return port;
}
// Расчитаем делители частоты УАРТа.
// Определим частоту тактирования шины, к которой подключен УАРТ.
switch( port )
{
case COMPORT1: // Этот порт подключен к APB2.
{
APB_n = 2;
usart_IRQn = USART1_IRQn;
// Извлечём делитель частоты,
APB_divider = ( RCC -> CFGR >> RCC_CFGR_PPRE2_Pos ) & 0x07;
taskENTER_CRITICAL();
{
// Включаеи тактирование порта.
RCC -> APB2ENR |= RCC_APB2ENR_USART1EN;
}
taskEXIT_CRITICAL();
break;
}
case COMPORT2: // Этот порт подключен к APB1.
{
APB_n = 1;
usart_IRQn = USART2_IRQn;
// Извлечём делитель частоты,
APB_divider = ( RCC -> CFGR >> RCC_CFGR_PPRE1_Pos ) & 0x07;
taskENTER_CRITICAL();
{
// Включаеи тактирование порта.
RCC -> APB1ENR |= RCC_APB1ENR_USART2EN;
}
taskEXIT_CRITICAL();
break;
}
case COMPORT6: // Этот порт подключен к APB2.
{
APB_n = 2;
usart_IRQn = USART6_IRQn;
// Извлечём делитель частоты,
APB_divider = ( RCC -> CFGR >> RCC_CFGR_PPRE2_Pos ) & 0x07;
taskENTER_CRITICAL();
{
// Включаеи тактирование порта.
RCC -> APB2ENR |= RCC_APB2ENR_USART6EN;
}
taskEXIT_CRITICAL();
break;
}
default:
{
lastError = INVALID_PORT;
return port;
}
}
// Сбросим все конфигурационные биты. По ходу разбора параметров будем
// выставлять нужные.
usart -> CR1 = \
usart -> CR2 = \
usart -> CR3 = 0;
// Преобразуем код делителя в число.
switch( APB_divider )
{
case 0x0: // 000b
case 0x1: // 001b
case 0x2: // 010b
case 0x3: // 011b
{
// Без делителя, напрямую.
APB_divider = 1;
break;
}
case 0x4: // 100b
{
APB_divider = 2;
break;
}
case 0x5: // 101b
{
APB_divider = 4;
break;
}
case 0x6: // 110b
{
APB_divider = 8;
break;
}
case 0x7: // 111b
{
APB_divider = 16;
break;
}
}
uint32
floor = SystemCoreClock / ( APB_divider * (uint32)_baudRate * 16UL );
int32
frac =
(
( SystemCoreClock / APB_divider ) -
( (uint32)_baudRate * floor * 16UL )
) / 200L,
fracfrac = frac % 100L;
frac /= 100L;
if( fracfrac > 50 )
{
++frac;
}
usart -> BRR = ( floor << 4 ) | frac; // Выставили делитель.
// ---- parity ----
switch( _parity )
{
case NO_PARITY:
{
break;
}
case ODD: // Нечётность
{
usart -> CR1 |=
(
USART_CR1_PCE | // Разрешение контроля чётности-нечётности.
USART_CR1_M | // Длина символа 9 бит.
USART_CR1_PS // Работаем с признаком нечётности.
);
break;
}
case PARITY: // Чётность
{
usart -> CR1 |=
(
USART_CR1_PCE | // Разрешение контроля чётности-нечётности.
USART_CR1_M // Длина символа 9 бит.
);
break;
}
default:
{
return port;
}
}
// ---- stopBits ----
// 00 — 1 бит, 01 — 0.5 бит, 10 — 2 бит, 11 — 1.5 бит;
switch( _stopBits )
{
case ONE_STOP_BIT:
{
break;
}
case ONE_AND_HALF_STOP_BIT:
{
usart -> CR2 |= USART_CR2_STOP;
break;
}
case TWO_STOP_BITS:
{
usart -> CR2 |= USART_CR2_STOP_1;
break;
}
default:
{
lastError = UNSUPPORTED_STOP_BITS_VALUE;
return port;
}
}
purgeTxBuff();
purgeRxBuff();
usart -> SR = 0;
setEvents(); // Разрешаем нужные нам прерывания.
return( port );
}
по ходу дела выбранный вами проц не вытягивает ваш код, то есть слабоват будет.ivan dimir писал(а):stm32f407
Я конечно понимаю, что тут грамотных людей меньше, чем хотелось бы, но такое первый раз встречаю. Ты если покурил или бухнул чего, то не следует сразу сюда выплёскивать отрыжку своего повреждённого мозга.Dimon456 писал(а):по ходу дела выбранный вами проц не вытягивает ваш код, то есть слабоват будет.
Код: Выделить всё
#define RCC_PLLCFGR_PLLP_div2 (0x0U << RCC_PLLCFGR_PLLP_Pos) /*!< 0x00000000 */
#define RCC_PLLCFGR_PLLP_div4 (0x1U << RCC_PLLCFGR_PLLP_Pos) /*!< 0x00010000 */
#define RCC_PLLCFGR_PLLP_div6 (0x2U << RCC_PLLCFGR_PLLP_Pos) /*!< 0x00020000 */
#define RCC_PLLCFGR_PLLP_div8 (0x3U << RCC_PLLCFGR_PLLP_Pos) /*!< 0x00030000 */
#define RCC_CFGR_MCO2_SYSCLK (0x0U << RCC_CFGR_MCO2_Pos)
#define RCC_CFGR_MCO2_PLLI2S (0x1U << RCC_CFGR_MCO2_Pos)
#define RCC_CFGR_MCO2_HSE (0x2U << RCC_CFGR_MCO2_Pos)
#define RCC_CFGR_MCO2_PLL (0x3U << RCC_CFGR_MCO2_Pos)
#define RCC_CFGR_MCO2PRE_div1 (0x0U << RCC_CFGR_MCO2PRE_Pos)
#define RCC_CFGR_MCO2PRE_div2 (0x4U << RCC_CFGR_MCO2PRE_Pos)
#define RCC_CFGR_MCO2PRE_div3 (0x5U << RCC_CFGR_MCO2PRE_Pos)
#define RCC_CFGR_MCO2PRE_div4 (0x6U << RCC_CFGR_MCO2PRE_Pos)
#define RCC_CFGR_MCO2PRE_div5 (0x7U << RCC_CFGR_MCO2PRE_Pos)
#define RCC_CFGR_MCO1PRE_div1 (0x0U << RCC_CFGR_MCO1PRE_Pos)
#define RCC_CFGR_MCO1PRE_div2 (0x4U << RCC_CFGR_MCO1PRE_Pos)
#define RCC_CFGR_MCO1PRE_div3 (0x5U << RCC_CFGR_MCO1PRE_Pos)
#define RCC_CFGR_MCO1PRE_div4 (0x6U << RCC_CFGR_MCO1PRE_Pos)
#define RCC_CFGR_MCO1PRE_div5 (0x7U << RCC_CFGR_MCO1PRE_Pos)
#define RCC_CFGR_I2SSRC_PLLI2S (0x0U << RCC_CFGR_I2SSRC_Pos)
#define RCC_CFGR_I2SSRC_EXT (0x1U << RCC_CFGR_I2SSRC_Pos)
#define RCC_CFGR_MCO1_HSI (0x0U << RCC_CFGR_MCO1_Pos)
#define RCC_CFGR_MCO1_LSE (0x1U << RCC_CFGR_MCO1_Pos)
#define RCC_CFGR_MCO1_HSE (0x2U << RCC_CFGR_MCO1_Pos)
#define RCC_CFGR_MCO1_PLL (0x3U << RCC_CFGR_MCO1_Pos)
...
__disable_irq();
// Настройка FLASH
FLASH -> ACR = \
FLASH_ACR_PRFTEN |
FLASH_ACR_ICEN |
FLASH_ACR_DCEN |
FLASH_ACR_LATENCY_3WS;
// Тактирование ------------------------------------------------------------
// Включаем HSE = 8 MHz
RCC -> CR = _VAL2FLD(RCC_CR_HSITRIM,16) | RCC_CR_HSION | RCC_CR_HSEON;
while( !( RCC -> CR & RCC_CR_HSERDY ) )
{};
// Задаём источники тактирования и прескалеры SYSCLK = 96 МГц USB = 48 МГц
RCC -> PLLCFGR = \
RCC_PLLCFGR_PLLSRC_HSE |
_VAL2FLD( RCC_PLLCFGR_PLLQ, 4 ) |
_VAL2FLD( RCC_PLLCFGR_PLLN, 96 ) |
_VAL2FLD( RCC_PLLCFGR_PLLM, 4 ) |
RCC_PLLCFGR_PLLP_div2;
RCC -> CR = \
_VAL2FLD( RCC_CR_HSITRIM, 16 ) |
RCC_CR_HSION |
RCC_CR_HSEON |
RCC_CR_PLLON; //Включаем PLL
while( !( RCC -> CR & RCC_CR_PLLRDY ) )
{};
// Переключаемся на PLL с установленнными ранее прескалерами
RCC -> CFGR = \
RCC_CFGR_MCO2_HSE |
RCC_CFGR_MCO2PRE_div1 |
RCC_CFGR_MCO1PRE_div1 |
RCC_CFGR_I2SSRC_PLLI2S |
RCC_CFGR_MCO1_HSE |
_VAL2FLD( RCC_CFGR_RTCPRE, 8 ) |
RCC_CFGR_PPRE2_DIV1 |
RCC_CFGR_PPRE1_DIV2 |
RCC_CFGR_HPRE_DIV1 |
RCC_CFGR_SW_PLL;
SystemCoreClock = 96000000;
RCC-> CR = \
_VAL2FLD( RCC_CR_HSITRIM, 16 ) |
RCC_CR_HSEON |
RCC_CR_PLLON; // Выключаем HSI
у меня то ума хватит на этоivan dimir писал(а):Это писал такой же амматор как и я
либо этоa797945 писал(а):зациклите выдачу 0х55 в режиме 8n1 и замерьте частоту
а так же тупо нажать "паузу" в отладчике и выдернуть для анализа, после выполнения или разгона,Dimon456 писал(а):функция последовательно будет перебирать регистр USART1->BRR, пока не получите адекватную информацию в терминале.
содержимое регистровivan dimir писал(а):А настраиваю на PLL шину на скорость 168Мгц.
Код: Выделить всё
RCC->CR
RCC->PLLCFGRКод: Выделить всё
Что по-вашему должен сделать код вида:tonyk писал(а):Читай комментарии и держи перед глазами описание SFR.