Для обработки энкодера используются два канала таймера, то есть в этом случае они работают как входы. Эти же каналы можно использовать как выходы, для генерации шим. Как МК определяет как настроить канал?
Добрый день, подскажите пожалуйста как включить поддержку FSMC в 407. У 103 серии для этого можно было установить пару галочек, а для 407 предлагается генерировать код в Cube, можно ли как-то это сделать без Cube, но с помощью HAL?
baghear писал(а):Добрый день, подскажите пожалуйста как включить поддержку FSMC в 407. У 103 серии для этого можно было установить пару галочек, а для 407 предлагается генерировать код в Cube, можно ли как-то это сделать без Cube, но с помощью HAL?
//----------------- Настройка портов ввода-вывода (SPL) ----------------------
GPIO_InitTypeDef GPIO_Init_struct; //Объявляем структуру для настройки порта
GPIO_StructInit(&GPIO_Init_struct); //Заполняем структуру начальными значениями
//Разрешаем тактирование шины порта A и B
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB, ENABLE);
//Режим работы портов - медленный, до 2МГц
GPIO_Init_struct.GPIO_Speed = GPIO_Speed_2MHz;
//Настройка порта А
GPIO_Init_struct.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7; //Настройка выводов 6 и 7
GPIO_Init_struct.GPIO_Mode = GPIO_Mode_OUT;
GPIO_Init(GPIOA, &GPIO_Init_struct); //Применяем настройки порта А
//Для порта B
//RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE); //Разрешаем тактирование шины порта B
GPIO_Init_struct.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1; //Настройка выводов 0 и 1
//(остальные настройки как для предыдущего порта)
GPIO_Init(GPIOB, &GPIO_Init_struct); //Применяем настройки порта B
GPIO_SetBits(GPIOA, GPIO_Pin_6);
//------------------------- Настройка UART (SPL) ------------------------------
#define UART_GPIO GPIOA //порт UART
#define UART_TX_Pin GPIO_Pin_9 //выход передатчика (TX)
#define UART_RX_Pin GPIO_Pin_10 //вход приемника (RX)
//Настройка выводов для работы с UART
// UART_TX_Pin -> TX UART (выход)
GPIO_Init_struct.GPIO_Pin = UART_TX_Pin; //настройка вывода 9 порта
GPIO_Init_struct.GPIO_Mode = GPIO_Mode_AF; //режим альтернативной функции
GPIO_Init_struct.GPIO_Speed = GPIO_Speed_2MHz;//скорость работы порта - до 2МГц
GPIO_Init_struct.GPIO_OType = GPIO_OType_PP; //тип выхода - двухтактный
GPIO_Init_struct.GPIO_PuPd = GPIO_PuPd_NOPULL;//без подтягивающего резистора
GPIO_Init(UART_GPIO, &GPIO_Init_struct); //Инициализируем
// UART_RX_Pin -> RX UART (вход)
GPIO_Init_struct.GPIO_Pin = UART_RX_Pin; //настройка вывода 10 порта
GPIO_Init_struct.GPIO_Mode = GPIO_Mode_IN; //вход
//скорость работы порта - до 2МГц
//тип выхода - [нет]
GPIO_Init_struct.GPIO_PuPd = GPIO_PuPd_UP; //подтягивающий резистор к VCC
GPIO_Init(UART_GPIO, &GPIO_Init_struct); //Инициализируем
/* Настройка UART:
- Скорость обмена - 9600 бод
- Длина посылки - 8 бит
- Стоповый бит - 1
- Контроль четности - Выкл.
- Аппаратное управление потоком - Выкл.
- Прием и передача - Вкл.
*/
USART_InitTypeDef USART_InitStructure; //Объявляем структуру для параметров UART
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //Разрешаем тактирование UART1
USART_InitStructure.USART_BaudRate = 9600; // скорость
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //8 бит данных
USART_InitStructure.USART_StopBits = USART_StopBits_1; //один стоп бит
USART_InitStructure.USART_Parity = USART_Parity_No; //четность - нет
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//прием и передача
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;// управлени потоком - нет
//USART_OverSampling8Cmd(ENABLE); //можно уменьшить частоту семплирования
//USART_OneBitMethodCmd(ENABLE); //можно уменьшить количество стробирований
//USART_HalfDuplexCmd (ENABLE); // можно выбрать полудуплексный режим.
USART_Init(USART1, &USART_InitStructure); //инизиализируем
//Разрешим генерировать прерывание по приему и передачи
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
USART_ITConfig(USART1, USART_IT_TXE, ENABLE);
USART_Cmd(USART1, ENABLE);//Разрешаем использовать UART
USART_SendData(USART1,0xAA); <------------------------------------------------------------------------------тест
NVIC_EnableIRQ(USART1_IRQn); //Разрешаем прерывания от UART1
//--- конец настройки UART
Не работает!
Причем при включении прерывание хотя бы 1 раз генерится и уходит на ошибку "Framing error" (смотрел что в регистре ISR).
Вставил в код строчку (тест) чтобы посмотреть, работает ли вообще передатчик. В итоге на ноге PA9 код 0xAA не выдается (смотрел запоминающим осцилом по триггеру) . Более того, эта нога почему-то смотрится как вход - если не подключена - на ней напряжение коло 0, если подтягиваю к плюсу через резистор 10 кОм - на ней питание. В чем дело?
This bit is set and cleared by software to select the USART1 clock source.
00: PCLK selected as USART1 clock source (default)
01: System clock (SYSCLK) selected as USART1 clock
10: LSE clock selected as USART1 clock
11: HSI clock selected as USART1 clock
Часто может оказаться более удобным использовать для тактирования HSI, т.к. в этом случае настройки последовательного порта не зависят ни от каких изменений в схеме тактирования МК. В функции инициализации порта можно сразу вставить "рыбу":
a5021 писал(а):
Ни к чему эти выкрутасы. В референсе черным по белому написано:
Не знаете матчасть, dosikus.
В отличие от dosikus, вы не знаете ни матчасть, ни математику. Ваша безграмотность просто безмерна. Хотя занятия в школе уже давно начались, вы продолжаете их упорно прогуливать. Про "выкрутасы" было особенно смешно.
scorpi_0n писал(а):В отличие от dosikus, вы не знаете ни матчасть, ни математику. Ваша безграмотность просто безмерна. Хотя занятия в школе уже давно начались, вы продолжаете их упорно прогуливать. Про "выкрутасы" было особенно смешно.
Доставляет, как вы старательно избегаете любых подробностей и технических деталей. Только вопли. Страшит проколоться и загреметь вслед за досикусом? Согласен, вам есть чего опасаться.
Reflector писал(а):
Там два примера, для 921.6K и 9600 бод.
a5021 писал(а):
Второй пример для восьмибитного семплирования. Найдется не сильно много случаев, когда использование этого режима будет оправдано.
Учитывая вашу маниакальную привычку к ногодрыгу, вам 98% режимов периферии не нужны ни под каким соусом. Однако не стоит так настойчиво выдавать это за правило.
Вы показываете, что для разных пар делимое/делитель, частное может быть одним и тем же числом? Ну да, это арифметика. Или вы что таким образом хотели сказать?
a5021 писал(а):Вы показываете, что для разных пар де6лимое/делитель, частное может быть одним и тем же числом? Ну да, это арифметика. Или вы что таким образом хотели сказать?
Я хотел сказать, что желательно округлять результат деления до ближайшего целого(даже если не используется 8-ми битное семплирование). Для этого обычно к делимому добавляют половинку baudRate, что код dosikusa и делает.
a5021 писал(а):
Вам бы с галлюцинациями своими как-нибудь разобраться
Не с моими, а с вашими. Тут хватит нескольких ваших последних постов. То у вас "индусы" не тот код пишут, то у вас разрабы СТМ ненужные режимы в МК впихнули, то dosikus матчасть не знает, то учителя в школе вас делению с округлением не научили. А вы точно свой диагноз "Дартаньян" у психиатра оспаривать не будете?
a5021 писал(а):
Не знаете матчасть, dosikus. На F0хх прием конкретного символа можно отслеживать аппаратно, хоть с вызовом прерывания по данному событию.
Научился читать документацию? Значит наши пинки даром не прошли.
Тебе болезному сообщаю, эту фичу уже год как гоняю в modbus и RTU и ASCII вместе с CRC, а то что скопипастил сюда - наброски трехлетней давности.
Но ты продолжай, продолжай...