Перейти к содержанию

Uart В Stm32Vl


T@MERLAN

Рекомендуемые сообщения

Здравствуйте! Соединил плату с компьютером,научился отправлять с платы слова,теперь хочу научиться принимать что-то. Суть такая:при отправлении "5" должен загореться светодиод подключенный к порту PC9. Программы из различных статей хорошо работают,а вот своя никак. Ошибок редактор не показывает,собирается программа успешно. Очень прошу помощи,заранее спасибо!

#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_usart.h"

int main(void)
{
RCC->APB2ENR |= RCC_APB2ENR_IOPCEN; // Разрешить тактирование GPIOC
//Конфигурирование GPIOC.9
GPIOC->CRH &= ~GPIO_CRH_MODE9; //очистить разряды MODE
GPIOC->CRH &= ~GPIO_CRH_CNF9; //очистить разряды CNF
GPIOC->CRH |= GPIO_CRH_MODE9_1; //выход, 2MHz
GPIOC->CRH &= ~GPIO_CRH_CNF9; //общего назначения, симетричный
//Включение тактирования
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; //Тактирование GPIO
RCC->APB2ENR |= RCC_APB2ENR_AFIOEN; //Тактирование альтернативных функций GPIO
RCC->APB2ENR |= RCC_APB2ENR_USART1EN; //Тактирование USART1
//Конфигурирование PORTA.9 для TX; PORTA.10 для RX
GPIOA->CRH &= ~(GPIO_CRH_MODE9 | GPIO_CRH_CNF9); //Предочистка MODE и CNF
GPIOA->CRH |= GPIO_CRH_MODE9 | GPIO_CRH_CNF9_1; //Двухтактный выход с альтернативной ф-ей, 50MHz
GPIOA->CRH &= ~(GPIO_CRH_MODE10 | GPIO_CRH_CNF10); //Предочистка MODE и CNF
GPIOA->CRH |= GPIO_CRH_CNF10_0; //Вход, третье состояние
//Задание режима работы
USART1->BRR = 0x9c4; //Cкорость обмена 9600 бод
USART1->CR1 &= ~USART_CR1_M; //8 бит данных
USART1->CR2 &= ~USART_CR2_STOP; //Количество стоп-битов: 1
//Управление работой
USART1->CR1 |= USART_CR1_UE; //Включение модуля USART1
USART1->CR1 &= ~USART_CR1_TE; //Отключить передатчик
USART1->CR1 |= USART_CR1_RE; //Включение приемника
//Разрешить прерывания
NVIC_EnableIRQ (USART1_IRQn); //Прерывания USART1
USART1->CR1 |= USART_CR1_RXNEIE; //Прерывание по завершении приема
while(1){
unsigned char tmp; //для временного хранения

//Если причина прерывания окончание приема байта
if((USART1->SR & USART_SR_RXNE)!=0)
{
tmp = USART1->DR; //прочитать принятый байт
//можно выполнить другие действия
if(tmp=='5'){
GPIOC->BSRR = GPIO_BSRR_BS9; //GPIOC.9=1
}
}}}


Вот еще вопрос...почему перед главной функцией int а не void? Что она принимает то?

Изменено пользователем T@MERLAN

аська 570362446

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Вынеси проверку приема данных в функцию void USART1_IRQHandler (void) чтобы у тебя при срабатывании прерывания управление переходило в эту функцию

Примерно как это реализовано здесь: http://cxem.net/uprav/uprav44.php

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Так?

#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_usart.h"
void USART1_IRQHandler(void);
int main(void)
{
RCC->APB2ENR |= RCC_APB2ENR_IOPCEN; // Разрешить тактирование GPIOC
//Конфигурирование GPIOC.9
GPIOC->CRH &= ~GPIO_CRH_MODE9; //очистить разряды MODE
GPIOC->CRH &= ~GPIO_CRH_CNF9; //очистить разряды CNF
GPIOC->CRH |= GPIO_CRH_MODE9_1; //выход, 2MHz
GPIOC->CRH &= ~GPIO_CRH_CNF9; //общего назначения, симетричный
//Включение тактирования
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; //Тактирование GPIO
RCC->APB2ENR |= RCC_APB2ENR_AFIOEN; //Тактирование альтернативных функций GPIO
RCC->APB2ENR |= RCC_APB2ENR_USART1EN; //Тактирование USART1
//Конфигурирование PORTA.9 для TX; PORTA.10 для RX
GPIOA->CRH &= ~(GPIO_CRH_MODE9 | GPIO_CRH_CNF9); //Предочистка MODE и CNF
GPIOA->CRH |= GPIO_CRH_MODE9 | GPIO_CRH_CNF9_1; //Двухтактный выход с альтернативной ф-ей, 50MHz
GPIOA->CRH &= ~(GPIO_CRH_MODE10 | GPIO_CRH_CNF10); //Предочистка MODE и CNF
GPIOA->CRH |= GPIO_CRH_CNF10_0; //Вход, третье состояние
//Задание режима работы
USART1->BRR = 0x9c4; //Cкорость обмена 9600 бод
USART1->CR1 &= ~USART_CR1_M; //8 бит данных
USART1->CR2 &= ~USART_CR2_STOP; //Количество стоп-битов: 1
//Управление работой
USART1->CR1 |= USART_CR1_UE; //Включение модуля USART1
USART1->CR1 &= ~USART_CR1_TE; //Отключить передатчик
USART1->CR1 |= USART_CR1_RE; //Включение приемника
//Разрешить прерывания
NVIC_EnableIRQ (USART1_IRQn); //Прерывания USART1
USART1->CR1 |= USART_CR1_RXNEIE; //Прерывание по завершении приема
void USART1_IRQHandler(void)
{
unsigned char tmp; //для временного хранения

//Если причина прерывания окончание приема байта
if((USART1->SR & USART_SR_RXNE)!=0)
{
tmp = USART1->DR; //прочитать принятый байт
//можно выполнить другие действия
if(tmp=='5'){
GPIOC->BSRR = GPIO_BSRR_BS9; //GPIOC.9=1
}
}}}

Так не работает и ругается при сборке: C:\CooCox\CoIDE\workspace\uart\main.c:46:1: warning: control reaches end of non-void function

Функцию поставил в бесконечный цикл - перестал ругаться, но всё равно не работает.

аська 570362446

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Если ставлю без прерываний и чтоб светодиод включался от любого символа-всё работает,то есть я ошибся когда разрешал прерывания либо не правильно использую функцию обработки прерываний. Очень прошу помощи

аська 570362446

Ссылка на комментарий
Поделиться на другие сайты

Тело обработчика прерывания должно быть вне главного тела .

типа:

#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_usart.h"
unsigned char tmp; // для временного хранения

void USART1_IRQHandler(void)
{
//Если причина прерывания окончание приема байта
if((USART1->SR & USART_SR_RXNE)!=0)
{
	 tmp = USART1->DR; //прочитать принятый байт
	 if( tmp == '5' )
	 {
		 GPIOC->BSRR = GPIO_BSRR_BS9; //GPIOC.9=1
	 }
 }
}

int main(void)
{
// Разрешить тактирование GPIOC
.
.
.
// Прерывание по завершении приема

while(1)
{
 // Куча времени для разных дел 
}

}

Ну как то так....

P.S. Пожалуйста код перед вставкой форматируйте логически... разбирать с ходу тяжело.

P.S.S. :) Кстати admin вам классный линк бросил.

Изменено пользователем tire
Ссылка на комментарий
Поделиться на другие сайты

Форматировать логически это как? Один алгоритм?

Да,может быть классный,но я начинающий,мне пока трудновато разобраться.

аська 570362446

Ссылка на комментарий
Поделиться на другие сайты

"Логически" я имею ввиду что неплохо бы визуально разделить функциональные части программы.

А то что начинающий ... так это ничего :) разберетесь помаленьку.

Ссылка на комментарий
Поделиться на другие сайты

Спасибо большое за помощь! У меня получилось,но только с терминалом putty,а вот с by bray никак,может насторил что то не так...

аська 570362446

Ссылка на комментарий
Поделиться на другие сайты

Я пользую прогу Terminal v1.9b

А int перед main , так это к компилятору вопрос :) . так надо . ставите и не морочите себе голову :) , или морочите в описании компилятора.

Ссылка на комментарий
Поделиться на другие сайты

  • 4 недели спустя...

Еще как будет.

Только нужно

USART1->BRR = 0x9c4; //Cкорость обмена 9600 бод

пересчтать, если частота тактирования изменилась.

Если нет желания считать самому, инициализируйте через библиотеку

USART_InitTypeDef USART_InitStructure;

USART_StructInit(&USART_InitStructure);
USART_InitStructure.USART_BaudRate = 9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1, &USART_InitStructure);

Изменено пользователем TDSS

Иван Сусанин - первый полупроводник

Ссылка на комментарий
Поделиться на другие сайты

Да,внутренний вроде на 16,а внешний у меня на 8 стоял...а как считать подскажите?

Где на 16 где на 8 пишут внутренний по умолчанию. Так на сколько он?

Изменено пользователем T@MERLAN

аська 570362446

Ссылка на комментарий
Поделиться на другие сайты

Вот так прописал - не работает

RCC->CR |= RCC_CR_HSION; // Включить генератор HSI
RCC->CFGR &= ~RCC_CFGR_SW;; //Очистка битов выбора источника тактового сигнала
RCC->CFGR |= RCC_CFGR_SW_HSI;//Выбрать источником тактового сигнала HSI

В главном теле эти три строчки,самые первые

Изменено пользователем T@MERLAN

аська 570362446

Ссылка на комментарий
Поделиться на другие сайты

В референс мануале на 100 серию пишут что на 8МГц внутренний генератор. Запуск микроконтроллера с его помощью и происходит, а уже потом камень может на тактирование от внешнего источника перейти, если указано.

К коду еще добавить проверку готовности генератора нужно. Тут глянуть можно: http://eugenemcu.ru/publ/13-1-0-73

Ссылка на комментарий
Поделиться на другие сайты

То есть внешний генератор можно запустить лишь прописав биты в соответствующих регистрах? Автоматом этого не произойдет?

аська 570362446

Ссылка на комментарий
Поделиться на другие сайты

Насколько я знаю - нет. Биты выбора источника тактирования по умолчанию выставлены как 00, что соответствует внутреннему RC- генератору.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...