Jump to content
Тимур1992

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

Recommended Posts

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

Решил пробудить свои скилы по написанию программ под 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) {
        }
    }
}

 

Share this post


Link to post
Share on other sites
2 hours ago, Тимур1992 said:

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

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

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

Share this post


Link to post
Share on other sites

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

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

Edited by mail_robot

Share this post


Link to post
Share on other sites

Литиевые батарейки Fanso для систем телеметрии и дистанционного контроля

Системы телеметрии находят все более широкое применение во многих отраслях на промышленных и коммунальных объектах. Требования, предъявляемые к условиям эксплуатации приборов телеметрии и, как следствие, источников питания для них, могут быть довольно жесткими. Fanso предоставляет широкую линейку продукции, рассчитанной на различные условия эксплуатации, что позволяет подобрать батарейку для каждого конкретного применения, в том числе и для устройств телеметрии.

Подробнее

                     

Приглашаем на вебинар Решения для построения ультразвуковых счетчиков жидкостей и газов на базе MSP430

Компэл совместно с Texas Instruments 23 октября 2019 приглашают на вебинар, посвященный системам-на-кристалле для построения ультразвуковых расходомеров жидкостей и газов на базе ядра MSP430. Вебинар проводит Йоханн Ципперер – эксперт по ультразвуковым технологиям, непосредственно участвовавший в создании данного решения. На вебинаре компания Texas Instruments представит однокристальное решение, позволяющее создавать точные недорогие счетчики жидкостей и газов.

Подробнее...

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

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

Share this post


Link to post
Share on other sites

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

#ifdef __cplusplus
 extern "C" {
#endif


void xxx_IRQHandler(void)
{
}

#ifdef __cplusplus
}
#endif

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

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

Share this post


Link to post
Share on other sites

Кину свой вопрос сюда, сколько не пытался по ЮАРТу принять данные через прерывания через 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; }

 

Edited by Электронщик

Share this post


Link to post
Share on other sites

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

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

GPIOA->CRH &= !GPIO_CRH_CNF9;

 

Share this post


Link to post
Share on other sites

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

Share this post


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

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

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

Edited by Электронщик

Share this post


Link to post
Share on other sites

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

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

Edited by mail_robot

Share this post


Link to post
Share on other sites
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

Edited by Электронщик

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

думаю второе

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

Edited by mail_robot

Share this post


Link to post
Share on other sites

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

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

/**
  ******************************************************************************
  * @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****/

 

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

Edited by Электронщик

Share this post


Link to post
Share on other sites

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Similar Content

    • By svd
      Предлагаю печатные платы для паяльной станции на STM32 и OLED дисплее 1,3" версии 2.1S
      Плата делалась под китайский алюминиевый корпус.
      Тема, где обсуждается данная станция T12 , опубликована на сайте radiokot.ru
      Фото платы


      Схема немного доработана:
      1) добавлены блокировочные конденсаторы 0,1 мкФ в цепях микроконтроллера;
      2) добавлен резистор в цепи буззера для возможности снижения громкости;
      3) есть возможность подключать жала JBC (для Т12 в разъеме паяльника запаивается перемычка)

      Большинство элементов типоразмера 0603. DC/DC преобразователь PSR-7805LF можно заменить на любой китайский аналог или микросхему 7805
      Ссылки на возможные замены:
      DC/DC аналог 7805 №1
      DC/DC аналог 7805 №2

      Во вложениях схема и расположение элементов на ПП, чертеж передней панели и прошивка под дисплей 1.3" с контроллером SH1106.

      Цена за одну плату 400 руб c учетом стоимости пересылки по РФ. Количество плат ограничено.
      По всем вопросам просьба обращаться в личку.
       
      STM32_T12_2.1S_SSH1106_1.3_v2_.pdf передняя панель.pdf T12_HW21S_Encryption-SH1106.zip
    • By ART_ME
      Здравствуйте.
      Рискну спросить: не завалялась ли у кого в хозяйстве для STM32F103xx: 
      - AC induction motor IFOC software library V1.0
      либо 
      - ACIM and PMSM motor control software libraries release 2.0
      ?
      Просьба поделиться если вдруг такой раритет найдется. 
       
    • By Илья Юрченко
      Добрый день, уважаемые форумчане! Для научной работы хотел собрать данные о том, насколько микроконтроллеры stm32 удовлетворяют нужды и требования программистов и разработчиков продуктов на нем. Если не сложно, ответьте, пожалуйста, важны данные)
      Разумеется "очень средне" неадекватная метрика, но в рамках работы нужна именно средняя удовлетворённость, и определение существует ли необходимость в создании другой серии универсальных плат на базе МК.
    • By n_angelo
      Привет. Хочу узнать ваше мнение. Я новичок в embedded. Можно сказать, что пришел с веба. Малость Python, JS, C. Меня, конечно, предупреждали начать с AVR, но я уверенный в себе решил сразу залезть на STM32. Вынашивая идею для проекта, параллельно курив Reference Manual и Data Sheet по STM32, я понял что его будет слишком жирно для проекта. Я перескочил на STM8L. И тут меня начал огорчать мир embedded. При переходе между stm8 и stm32 нужно менять IDE (TrueStudio на STVD). Во избежание таких курьёзов я пересаживаюсь на IAR. В процессе подключения родной библиотеки от ST, понимаю что библиотека от IAR для того же самого STM8L152C6T6 дико отличается (макросы, структуры). Привет веб-разработка. Как такое могло произойти, что под один и тот же контроллер ST даёт одну библиотеку, а IAR другую. И нигде в уроках тебя не предупредят об этом. Ну, ребят, у меня всего одна жизнь. Вы уже договоритесь там между собой? Придите к единому стандарту. Или они так решили новичков завендерлочить? Моё мнение (не претендует на правильное): пробираясь сквозь тернии популярной архитектуры ARM, инфраструктуры, инструментария, забываешь про бизнес-логику устройств. А еще просто пропасть между "я ничего не понимаю" и "господи, я зажег светодиод". Речь не о копипастерах с уроков, а действительно понимая что ты делаешь, в каком регистре, что меняешь. Это путь в 2000 (а то и больше) страниц на английском перечитанных по несколько раз, чтобы отоложилось. И в конце тебя ждут разные версии одной и той же библиотки в разных IDE. И сидишь вдупляешь... ну почему... я же в правильный регистр кладу правильную маску... ох, наболело. Такое ощущение что не для людей это всё делали, не для людей.
      Ваше мнение?
    • By Sofia Vin
      Предлагаем проектную работу в Москве:
      Микроконтроллер STM32F103.
        
      Есть встроенный код с использованием функций библиотеки FreeRTOS, код имеет описанный протокол для связи с внешним миром.
        
      Необходимо проводить доработку кода под задачи программиста верхнего уровня и его тестирование в составе оборудования. 
      Работа в лаборатории (м.Университет) и удаленно. 
      Оплата по договоренности.
      Если Вы обладаете опытом схемотехнического проектирования и программирования микроконтроллеров, и Вас заинтересовала данная возможность, ждем Ваши отклики по контактным данным:
      8 (925) 023-60-02   Алексей
      E-mail: nassa@marathon.ru
       
×
×
  • Create New...