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

STM32F1 проблемы с приемом по UART


Тимур1992

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

Доброго времени суток.

Решил пробудить свои скилы по написанию программ под stm32f103. Поигрался с SMT32CUDEMX и HAL, но вернулся к SLP библиотеке.  Начал постепенно наращивать программу по примерам, начиная с GPIO, тактирования и на работе c USART встал. Суть в том что передача по UART идет нормально, а вот прием приводит к "зависанию". Устанавливая бесконечные while с мигалками внутри, я выяснил что по все видимости МК не переходит в прерывания USART1_IRQHandler. Я не могу понять в чем ошибка, раньше с таким не сталкивался, хотя написал несколько программ для stm32f100 .____.

Среда разработки Atollic TrusStudio 9.0.0.

 

#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_usart.h"
#include "misc.h"
#include <string.h>
// тактовый светодиод для индикации
#define LED GPIO_Pin_5
#define RX_BUF_SIZE 80
volatile char RX_FLAG_END_LINE = 0;
volatile char RXi;
volatile char RXc;
volatile char RX_BUF[RX_BUF_SIZE] = {'\0'};
volatile char buffer[80] = {'\0'};

void init_GPIO(void);
void SetSysClockTo72(void);
void init_uart(void);
void clear_RXBuffer(void);
void USARTSend(const char *pucBuffer);


void USART1_IRQHandler(void) {
	GPIO_ResetBits(GPIOA, LED);
	//GPIOA->ODR ^= LED;
	//USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);
	//if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {
    //if ((USART1->SR & USART_FLAG_RXNE) != RESET) {
	//if ((USART1->SR & USART_SR_RXNE) != (u16)RESET) {
	if (USART1->SR & USART_SR_RXNE) {

			// Сбрасываем флаг прерывания

		    USART1->SR &=~ USART_SR_RXNE;
            //RXc = USART_ReceiveData(USART1);

            //RX_BUF[RXi] = RXc;
            //RXi++;

            //if (RXc != 13) {
            //    if (RXi > RX_BUF_SIZE-1) {
            //        clear_RXBuffer();
            //    }
            //}
            //else {
            //    RX_FLAG_END_LINE = 1;
            //}

            //Echo
            //USARTSend("Interrapt_UART1\r\n");
            //USART_SendData(USART1, RXc);
    }
	//return
}


int main(void) {
	int i;
	//SetSysClockTo72();
	init_GPIO();
	init_uart();
	USARTSend("Test USART1\r\n");

	while (1) {

		//if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_9) != 0) {
			/* Toggle LED which connected to PC13*/
			GPIOA->ODR ^= LED; // Invert C13

			/* delay */
			for(i=0;i<0x100000;i++);

			/* Toggle LED which connected to PC13*/
			GPIOA->ODR ^= LED;

			/* delay */
			for(i=0;i<0x100000;i++);
			USARTSend("Test USART1\r\n");
		//}
		//else {
			//GPIO_SetBits(GPIOA, LED);
		//}
	}
}

void init_GPIO(void) {
	// Создаем класс для постепенной настройки параметров и единовременного применени¤
	GPIO_InitTypeDef GPIO_InitStructure;

	//Настрайваем светодиод, включаем тактирование GPIOA
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	// Конфигурация для светодиода, режим работы, максимальная скорость
	GPIO_InitStructure.GPIO_Pin = LED;
	// GPIO_Mode_Out_OD выход с открытым стоком, GPIO_Mode_Out_PP выход двумя состояниями
	// GPIO_Mode_AF_OD выход с открытым стоком для альтернативных функций, GPIO_Mode_AF_PP то же самое, но с двумя состояниями
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);

	// Устанавливаем начальное значение SetBits -> High level ("1"), ResetBits -> Low level ("0")
	GPIO_ResetBits(GPIOA, LED);

	// Настрайваем пин 9, регистра B на вход, для отладки, включаем тактирование регистра B
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	// Настрайваем для кнопку, пин, режим, максимальная частота входного сигнала
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
	// GPIO_Mode_AIN аналоговый вход, GPIO_Mode_IN_FLOATING вход без подтяжки, болтающийся
	// GPIO_Mode_IPD вход с подтяжкой к земле, GPIO_Mode_IPU вход с подтяжкой к питанию
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
}


void SetSysClockTo72(void) {
	ErrorStatus HSEStartUpStatus;
	/* SYSCLK, HCLK, PCLK2 and PCLK1 configuration -----------------------------*/
    /* Системный RESET RCC (делать не обязательно, но полезно на этапе отладки) */
    RCC_DeInit();

    /* Включаем HSE (внешний кварц) */
    RCC_HSEConfig( RCC_HSE_ON);

    /* Ждем пока HSE будет готов */
    HSEStartUpStatus = RCC_WaitForHSEStartUp();

    /* Если с HSE все в порядке */
    if (HSEStartUpStatus == SUCCESS) {

        /* HCLK = SYSCLK */ /* Смотри на схеме AHB Prescaler. Частота не делится (RCC_SYSCLK_Div1) */
        RCC_HCLKConfig( RCC_SYSCLK_Div1);

        /* PCLK2 = HCLK */ /* Смотри на схеме APB2 Prescaler. Частота не делится (RCC_HCLK_Div1)  */
        RCC_PCLK2Config( RCC_HCLK_Div1);

        /* PCLK1 = HCLK/2 */ /* Смотри на схеме APB1 Prescaler. Частота делится на 2 (RCC_HCLK_Div2)
        потому что на выходе APB1 должно быть не более 36МГц (смотри схему) */
        RCC_PCLK1Config( RCC_HCLK_Div2);

        /* PLLCLK = 8MHz * 9 = 72 MHz */
        /* Указываем PLL от куда брать частоту (RCC_PLLSource_HSE_Div1) и на сколько ее умножать (RCC_PLLMul_9) */
        /* PLL может брать частоту с кварца как есть (RCC_PLLSource_HSE_Div1) или поделенную на 2 (RCC_PLLSource_HSE_Div2). Смотри схему */
        //RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
        RCC_PLLConfig(0x00010000, RCC_PLLMul_9);

        /* Включаем PLL */
        RCC_PLLCmd( ENABLE);

        /* Ждем пока PLL будет готов */
        while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) {
        }

        /* Переключаем системное тактирование на PLL */
        RCC_SYSCLKConfig( RCC_SYSCLKSource_PLLCLK);

        /* Ждем пока переключиться */
        while (RCC_GetSYSCLKSource() != 0x08) {
        }
    }
    else {
    	/* Проблемы с HSE. Тут можно написать свой код, если надо что-то делать когда микроконтроллер не смог перейти на работу с внешним кварцом */

        /* Пока тут заглушка - вечный цикл*/
        // while (1) {
        //}
    }
}

void init_uart(void) {
    /* Enable USART1 and GPIOA clock */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA, ENABLE);

    /* Configure the GPIOs */
    GPIO_InitTypeDef GPIO_InitStructure;

    /* Configure USART1 Tx (PA.09) as alternate function push-pull */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    /* Configure USART1 Rx (PA.10) as input floating */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    /* Configure the USART1 */
    USART_InitTypeDef USART_InitStructure;

    /* USART1 configuration ------------------------------------------------------*/
    /* USART1 configured as follow:
        - BaudRate = 115200 baud
        - Word Length = 8 Bits
        - One Stop Bit
        - No parity
        - Hardware flow control disabled (RTS and CTS signals)
        - Receive and transmit enabled
        - USART Clock disabled
        - USART CPOL: Clock is active low
        - USART CPHA: Data is captured on the middle
        - USART LastBit: The clock pulse of the last data bit is not output to
            the SCLK pin
     */
    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);

    /* Enable USART1 */
    USART_Cmd(USART1, ENABLE);

    /* Enable the USART1 Receive interrupt: this interrupt is generated when the
    USART1 receive data register is not empty */
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
    /* NVIC Configuration */
    NVIC_InitTypeDef NVIC_InitStructure;
    /* Enable the USARTx Interrupt */
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
    //NVIC_EnableIRQ(USART1_IRQn);
}

void clear_RXBuffer(void) {
    for (RXi=0; RXi<RX_BUF_SIZE; RXi++)
        RX_BUF[RXi] = '\0';
    RXi = 0;
}

void USARTSend(const char *pucBuffer) {
    while (*pucBuffer) {
        USART_SendData(USART1, *pucBuffer++);
        while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {
        }
    }
}

 

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

2 hours ago, Тимур1992 said:

/* Enable USART1 */ USART_Cmd(USART1, ENABLE);

Попробуй перенести в конец, после инициализации NVIC.

Сейчас при разрешении USART сразу происходит прерывание, а NVIC не инициализирован.

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

@Тимур1992 Я вот бегло почитал эту страшную мешанину, но так и не нашел того места, где у тебя происходит, собственно, запуск порта на прием. А сам порт включаться не умеет и никакого прерываний естественно не вызовет

у тебя в папке документов есть папка куба. Там лежат примеры работы со всеми портами в разных режимах. Очень просто и понятно написанные. Твой случай там тоже есть, прям один в один как надо. Прочитай для начала, потом спроси, если что не ясно будет.

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

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

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

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

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

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

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

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

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

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

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

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

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

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

Спасибо все, кто отозвался. Проблема оказалась очень простой - я кретин. Когда я создавал проект, я подумал: хм... круто же и функционально писать код на си++. Вообщем код постоянно попадал в функцию NMI_Handler. Но не суть, когда я создал проект на чистом си, и скопировал туда свои код, то почти все сразу завелось! :D

Вообщем, на обратную совместимость надейся, а сам не плошай ХD

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

@Тимур1992 обрамляй прерывание

#ifdef __cplusplus
 extern "C" {
#endif


void xxx_IRQHandler(void)
{
}

#ifdef __cplusplus
}
#endif

и тогда обработчики станут видны в С++

И бросай SPL, на регистрах USART не сложно запустить

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

Кину свой вопрос сюда, сколько не пытался по ЮАРТу принять данные через прерывания через HAL и регистры, ничего не работает, что не так делаю? Без прерывания работает, скорость 250000

void UART1_Init(){
     
  RCC->APB2ENR|= RCC_APB2ENR_USART1EN | RCC_APB2ENR_IOPAEN | RCC_APB2ENR_AFIOEN;
  GPIOA->CRH &= !GPIO_CRH_CNF9;
  GPIOA->CRH  |= GPIO_CRH_CNF9_1 | GPIO_CRH_MODE9_0 | GPIO_CRH_CNF10_0;
  USART1->BRR = 0x120;
  USART1->CR1 |= USART_CR1_TE | USART_CR1_RE;
  USART1->CR1 |= USART_CR1_UE;
  USART1->CR1 |= USART_CR1_RXNEIE;
 
  NVIC_EnableIRQ(USART1_IRQn);
  __enable_irq ();

}
 

void USART_IRQHandler(void)
{
     // Выясняем, какое именно событие вызвало прерывание. Если это приём байта в RxD - обрабатываем.
if (USART1->SR & USART_SR_RXNE) {
   

    // Получаем принятый байт
      data30=USART1->DR;

if(data30==1){
  jk++;
}
else if(data30==2){
  jk--;
}
 if(data30==3){
  nj++;

}
else if(data30==4){
  nj--;
}

// Сбрасываем флаг прерывания
    USART1->SR&=~USART_SR_RXNE; }

 

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

А в чем "не работа" выражается? Не запускается прерывание, или запускается но не читаются данные, или еще что-то?

Ну и тут логическое отрицание нужно на побитовую инверсию заменить:

GPIOA->CRH &= !GPIO_CRH_CNF9;

 

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

в случае с ХАЛ надо весь код смотреть. Те куски что у вас, рабочие, но контекст не понятен.

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

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

А в чем "не работа" выражается? Не запускается прерывание, или запускается но не читаются данные, или еще что-то?

Не запускается прерывание, так как пробовал отслеживать флажок при входе в прерывание, он не взводится когда я присылаю какие-либо - данные, причем отладчиком все регистры настроены как нужно.

Камень f103C8T6, заметил с ним много проблем, выяснил что SPI2 почему-то не работает, или работает иногда, а одновременно два настроенных SPI не работают, причем как HAL так и регистрами. Может то что беру эти камни с платкой за 65-85грн., может это ширпотреб

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

для начала надо почитать код примеров, который лежит в папке c:\пользователи\[user]\STM32Cube\Repository\[lib]\Projects\и там по смыслу

Это применительно к ХАЛ. По вашему вопросу там как раз код есть. Очень подробно и качественно прокомментированный. Код 100% рабочий. Посмотрите внимательно как там происходит инициализация, запуск приема по прерываниям и как прописан обработчик. имхо - вам надо не обработчик курочить, а колбэк на предмет парсинга байта. И вообще лучше это делать по ДМА

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

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

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

void USART_IRQHandler(void)
{
 
data30=2;
if (USART1->SR & USART_SR_RXNE) {
   
    // Получаем принятый байт
      data31=USART1->DR;
  
USART1->SR&=~USART_SR_RXNE; 
}
}

Сейчас так вот написал, чтобы понять срабатывает ли прерывание, если какие-нибудь данные придут в приемник, должен я провалиться в обработчик прерываний USART_IRQHandler, и data30 станет равна 2, соответсвено зажигаю светик в основном цикле, но этого не происходит

Вот после инициализации, как проверить в реальном времени флаг RXNE, отладчиком я не знаю

Screenshot_1.thumb.jpg.3af98a3202fd0d68f1d302b5cb9d3954.jpg

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

Может так: USART1_IRQHandler IDE какая? покажи стартап

ну как проверить послал байт, нажал на паузу и смотришь и точку останова в обработчик

я сейчас как раз пример буду делать по USART

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

Я и с DMA вчера игрался для UART ничего не работает, кто-то скажет нужно, или регистры или HAL использовать, одновременно нельзя, но так то удобнее, особенно когда по регистрам не настраивается, взял HAL, я таким образом в ардуино ИДЕ, писал на С + иногда функции writing, быстро и удобно, и никаких конфликтов.

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

ты эту ошибку кстати исправил? GPIOA->CRH &= !GPIO_CRH_CNF9; нужно так: GPIOA->CRH &= ~GPIO_CRH_CNF9;

@Электронщик Зачем тебе то ардуино, на все есть ответы, там не так все и сложно.

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

В ардуино ИДЕ быстро можно набросать как по регистрам, так и используя функции ардуино, удобнее чем в codevision, и когда нужно быстро для проверки, то нормально, а дальше потом можно перевести все на регистры.

Исправил, но все равно не то, если оно и с HAL не работает, и по регистрам, может чистый проект сделать и в нем попробовать. Мало ли что там куб наворотил, или я где-то что - то.

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

думаю второе

и не натворил, а недотворил скорее ) Выкладывал бы уже весь код

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

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

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

Набросал по быстрому, правда тактирование самого проца оставил в кубе, но думаю это не влияет, и вот ничего

Скрытый текст

/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  ** This notice applies to any and all portions of this file
  * that are not between comment pairs USER CODE BEGIN and
  * USER CODE END. Other portions of this file, whether 
  * inserted by the user or by software development tools
  * are owned by their respective copyright owners.
  *
  * COPYRIGHT(c) 2018 STMicroelectronics
  *
  * Redistribution and use in source and binary forms, with or without modification,
  * are permitted provided that the following conditions are met:
  *   1. Redistributions of source code must retain the above copyright notice,
  *      this list of conditions and the following disclaimer.
  *   2. Redistributions in binary form must reproduce the above copyright notice,
  *      this list of conditions and the following disclaimer in the documentation
  *      and/or other materials provided with the distribution.
  *   3. Neither the name of STMicroelectronics nor the names of its contributors
  *      may be used to endorse or promote products derived from this software
  *      without specific prior written permission.
  *
  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  ******************************************************************************
  */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "stm32f1xx_hal.h"

/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);

/* USER CODE BEGIN PFP */
/* Private function prototypes -----------------------------------------------*/

/* USER CODE END PFP */

/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  *
  * @retval None
  */
void GPIOs(){
 RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;//|RCC_APB2ENR_AFIOEN;//включаем тактирование GPIO

GPIOB->CRH |= (GPIO_CRL_MODE4_1);// настроены на 2МГц 
}





void UART1_Init(){
     
  RCC->APB2ENR|= RCC_APB2ENR_USART1EN | RCC_APB2ENR_IOPAEN | RCC_APB2ENR_AFIOEN;
  GPIOA->CRH &= ~GPIO_CRH_CNF9;
  GPIOA->CRH  |= GPIO_CRH_CNF9_1 | GPIO_CRH_MODE9_0 | GPIO_CRH_CNF10_0;
  USART1->BRR = 0x120;//250000
  USART1->CR1 |= USART_CR1_TE | USART_CR1_RE;
  // Запускаем модуль USART
  USART1->CR1 |= USART_CR1_UE;
  
  USART1->CR1 |= USART_CR1_RXNEIE;

  // Назначаем обработчик для всех прерываний от USART1
  NVIC_EnableIRQ(USART1_IRQn);
  NVIC_SetPriority (USART1_IRQn, 2);

  __enable_irq ();

}

uint8_t nj=0;
uint8_t data30=0;

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration----------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
 // MX_GPIO_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */
GPIOs();
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
   
  while (1)
  {
if(nj==1){
 GPIOB->BSRR = GPIO_BSRR_BS4;
}
else if(nj==0){
 GPIOB->BSRR = GPIO_BSRR_BR4;
}

  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */

  }
  /* USER CODE END 3 */

}

/**
  * @brief System Clock Configuration
  * @retval None
  */

void USART_IRQHandler(void)
{
 
  // Выясняем, какое именно событие вызвало прерывание. Если это приём байта в RxD - обрабатываем.
if (USART1->SR & USART_SR_RXNE) {
   
    // Получаем принятый байт
      data30=USART1->DR;
  

 if(data30==3){
  nj++;

}
else if(data30==4){
  nj--;
}
    


USART1->SR&=~USART_SR_RXNE; 
}
}

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{

  RCC_OscInitTypeDef RCC_OscInitStruct;
  RCC_ClkInitTypeDef RCC_ClkInitStruct;

    /**Initializes the CPU, AHB and APB busses clocks 
    */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

    /**Initializes the CPU, AHB and APB busses clocks 
    */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

    /**Configure the Systick interrupt time 
    */
  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

    /**Configure the Systick 
    */
  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

  /* SysTick_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}

/** Configure pins as 
        * Analog 
        * Input 
        * Output
        * EVENT_OUT
        * EXTI
*/
static void MX_GPIO_Init(void)
{

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOD_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();

}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @param  file: The file name as string.
  * @param  line: The line in file as a number.
  * @retval None
  */
void _Error_Handler(char *file, int line)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */
  while(1)
  {
  }
  /* USER CODE END Error_Handler_Debug */
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t* file, uint32_t line)
{ 
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
     tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

/**
  * @}
  */

/**
  * @}
  */

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

 

Этот код работает без прерываний, но по сути ничего не меняется. 

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

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

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

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

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

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

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

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

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

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

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