Jump to content
Nicollo

stm32f103c8t6 прерывание по приему USART1

Recommended Posts

Добрый вечер.

Решил недавно поиграться с микроконтроллерами, ибо были в загашнике такие платы: 

Ayx1N.png

Ппробовал погонять данные по USART. В обычном режиме - все работает нормально, но вот с прерываниями - немного не получается. 

Я взял пример из стандартной библиотеки, скомпилил, залил и прерывание не срабатывает.

#include <stm32f10x.h>
#include <misc.h>

volatile char received_string[MAX_STRLEN+1];

void Delay(__IO uint32_t nCount) {
  while(nCount--) {
  }
}

void init_USART1(uint32_t baudrate){

   GPIO_InitTypeDef GPIO_InitStruct;
   USART_InitTypeDef USART_InitStruct;
   NVIC_InitTypeDef NVIC_InitStructure;

   RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);


   GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
   GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
   GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_Init(GPIOA, &GPIO_InitStruct);

   GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
   GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; 
   GPIO_Init(GPIOA, &GPIO_InitStruct);

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

   USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);


   NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  
   NVIC_Init(&NVIC_InitStructure);      

   USART_Cmd(USART1, ENABLE);
}

void USART_puts(USART_TypeDef* USARTx, volatile char *s){

   while(*s){
      while( !(USARTx->SR & 0x00000040) );
      USART_SendData(USARTx, *s);
      *s++;
   }
}

int main(void) {

  init_USART1(9600); // initialize USART1 @ 9600 baud

  USART_puts(USART1, "Init complete! Hello World!\r\n"); // just send a message to indicate that it works

   while (1){
     /*
      * You can do whatever you want in here
      */
   }
}

void USART1_IRQHandler(void){

    // check if the USART1 receive interrupt flag was set
    if( USART_GetITStatus(USART1, USART_IT_RXNE) ){

        static uint8_t cnt = 0; // this counter is used to determine the string length
        char t = USART1->DR; // the character from the USART1 data register is saved in t

        // check if the received character is not the LF character (used to determine end of string)
        // or the if the maximum string length has been been reached
        if( (t != '\n') && (cnt < MAX_STRLEN) ){
            received_string[cnt] = t;
            cnt++;
        }
         else{ // otherwise reset the character counter and print the received string
           cnt = 0;
           USART_puts(USART1, received_string);
        }
    }
}

Решил упростить задачу и поморгать светодиодом:
 

void USART2_IRQHandler(void){
	USART_ClearITPendingBit(USART2, USART_IT_TC);
	USART_ClearITPendingBit(USART2, USART_IT_RXNE);
	static uint8_t isSet = SET;
	GPIO_WriteBit(GPIOC , GPIO_Pin_13 , isSet);
	isSet = !isSet;
}

Оно в обработчик вообще не попадает. 

Подскажите, может что не так делаю?
Отладчика пока нету, заказал - жду.

Есть FTD USB-UART преобразователи, через них прошиваю и проверяю. 

А еще я в основной цикл добавил постоянную отправку строки, и оно таки прерывается, когда я шлю байт с компа, но в обработчик оно, походу, не попадает. Пробовал на USART2 - такая же фигня.

Share this post


Link to post
Share on other sites

помимо чтения USART1->DR

еще надо и

USART1->SR

в конце не хватает очистки флага прерывания

//очистка флага прерывания
USART_ClearITPendingBit(USART1, USART_IT_RXNE);

как то так стоит попробовать:

void  USART1_IRQHandler(void)
{
	if(USART_GetFlagStatus(USART1, USART_IT_RXNE) == SET)
	{
		if ((USART1->SR & (USART_FLAG_NE|USART_FLAG_ORE)) == 0)
		{
			recive_UART1 = USART1->DR;
		}
		//очистка флага прерывания
    	USART_ClearITPendingBit(USART1, USART_IT_RXNE);
	}
}

 

если не заработает смотреть инициализацию

слепой или нету))

  USART_Init(USART1, &USART_InitStructure); 
  USART_ClearFlag(USART1,USART_FLAG_TC);
  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
  USART_ITConfig(USART1, USART_IT_TXE, ENABLE);
  USART_Cmd(USART1, ENABLE);

 

Edited by Mishany

Share this post


Link to post
Share on other sites

Изготовление 2-х слойных плат от 2$, а 4-х слойных от 5$!

Быстрое изготовление прототипа платы всего за 24 часа! Прямая доставка с нашей фабрики!

Смотрите видео о фабрике JLCPCB: https://youtu.be/_XCznQFV-Mw

Посетите первую электронную выставку JLCPCB https://jlcpcb.com/E-exhibition чтобы получить купоны и выиграть iPhone 12, 3D-принтер и так далее...

7 часов назад, Mishany сказал:

//очистка флага прерывания
USART_ClearITPendingBit(USART1, USART_IT_RXNE);

Зачем? Объяснить можем?

Share this post


Link to post
Share on other sites

Вебинар «Параметры выше, цена ниже. Обновление в линейке AC/DC- и DC/DC-преобразователей MORNSUN» (26.01.2021)

Приглашаем 26 января на бесплатный вебинар, посвящённый преимуществам и отличиям новых источников питания и DC/DC-преобразователей Mornsun. На вебинаре будут рассмотрены изолированные и неизолированные DC/DC-преобразователи последнего, четвертого, поколения (R4) и компактные модульные источники питания второго и третьего поколений (семейства LS/R3 и LD/R2) на плату. Рассмотрим новую группу продукции – встраиваемые источники питания в кожухе.

Подробнее

7 minutes ago, dosikus said:

Зачем? Объяснить можем?

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

2Mishany: я так делал, не помогло

Инициализация у меня есть вот такая: 

	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

	NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
   	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
   	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  
   	NVIC_Init(&NVIC_InitStructure);      

Т.е. я хочу чтоб прерывание сработало ТОЛЬКО на приеме.

И мне кажется что прерывание происходит, но в обработчик оно почему-то не попадает

Share this post


Link to post
Share on other sites

Вебинар "Новый BlueNRG-LP с Bluetooth 5.2 и Long Range — волшебная палочка разработчика IoT" (04/02/2021)

Приглашаем 4 февраля на бесплатный вебинар о BlueNRG-LP - новом программируемом чипе SoC STMicroelectronics. На вебинаре будут детально рассмотрены новые возможности, особенности подключения, аппаратные и программные средства для разработки, а также практические примеры работы с микросхемой.

Подробнее

Только что, dosikus сказал:

Зачем?

Открываем умный документ и смотрим. Там на чисто англицком сказано, что бит прерывания USART не сбрасывается аппаратно и его требуется сбросить программно (это, кстати, ко многим прерываниям STM относится). В противном случае при попадании в прерывание программа никогда из него не выйдет.

Цитата

This bit is set by hardware when the content of the RDR shift register has been transferred to
the USART_DR register. An interrupt is generated if RXNEIE=1 in the USART_CR1 register.
It is cleared by a read to the USART_DR register. The RXNE flag can also be cleared by
writing a zero to it.

 

Edited by BARS_

Share this post


Link to post
Share on other sites

Плата STEVAL-IDB011V1 – тестируем идеи на новом BLE 5.2-чипе BlueNRG-LP

Новая система на кристалле BlueNRG-LP производства STMicroelectronics предназначена для устройств интернета вещей(IoT ) и не только, отвечает стандарту BLE 5.2 и поддерживает MESH-сети. Микросхема содержит малопотребляющий MCU Cortex-M0+. Отладка STEVAL-IDB011V1 позволит сэкономить время на разработку новых устройств.

Подробнее

6 минут назад, Nicollo сказал:

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

Где что вы читали ? Кто вообще эту хрень выдвинул?

Читайте RM , а не кухаркины статьи 

RXNE сбрасывается чтением SR с последующим чтением DR .

Причем чтение SR происходит при проверке флага.

И не надо лепить горбатого - все проверенно и работает

BARS_, ту да же - читать RM .

Edited by dosikus

Share this post


Link to post
Share on other sites
Только что, dosikus сказал:

RXNE сбрасывается чтением SR с последующим чтением DR .

Тогда читайте даташит ВНИМАТЕЛЬНО. Выше я привел абзац, где черным по белому написано, что RXNE очищается записью нуля в него.

Share this post


Link to post
Share on other sites
1 minute ago, BARS_ said:

Тогда читайте даташит ВНИМАТЕЛЬНО. Выше я привел абзац, где черным по белому написано, что RXNE очищается записью нуля в него.

Тут и вы и он равы 

Quote

It is cleared by a read to the USART_DR register. The RXNE flag can also be cleared by
writing a zero to it.

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

В любом случае, мою проблему это не решает.

Share this post


Link to post
Share on other sites

 

BARS_,

Читаем внимательно - то что нужно выделил 

Цитата

Bit 5 RXNE: Read data register not empty
This bit is set by hardware when the content of the RDR shift register has been transferred to
the USART_DR register. An interrupt is generated if RXNEIE=1 in the USART_CR1 register.
It is cleared by a read to the USART_DR register. The RXNE flag can also be cleared by
writing a zero to it.
This clearing sequence is recommended only for multibuffer
communication.

Да для сброса RXNE не надо читать SR , но сбрасывается он чтением DR  а также может быть сброшен записью 0 .
BARS_, я удивлен тобой , разве можно читать документацию частями????

Nicollo,  ваша проблема решается элементарно - выкашивается на SPL и все прекрасно работает.

 

#define USARTCLK 72000000UL

#define BAUDRATE 115200UL


void USART1_IRQHandler (void)
 {
 
   if(USART1->SR & USART_SR_RXNE)
   {
     UsartBuf =USART1->DR;
    
   }
   
 }



 void UsartInit(void)
 {
   RCC->APB2ENR |=RCC_APB2ENR_USART1EN | RCC_APB2ENR_IOPAEN;
    
    GPIOA->CRH &=~ (GPIO_CRH_CNF10 |GPIO_CRH_CNF9|GPIO_CRH_MODE10);
    GPIOA->CRH |= GPIO_CRH_CNF10_0 |GPIO_CRH_CNF9_1 | GPIO_CRH_MODE9;
    
    USART1->CR1 |= USART_CR1_TE |USART_CR1_RE |USART_CR1_RXNEIE;
    USART1->BRR =(USARTCLK+BAUDRATE/2)/BAUDRATE;
    USART1->CR1 |=USART_CR1_UE;
    
    NVIC_SetPriority(USART1_IRQn,15);
    NVIC_EnableIRQ(USART1_IRQn);
   
   
 }

void USART_write (char data)
  {
    while(!(USART1->SR & USART_SR_TXE));
    USART1->DR=data;
  }
	
void  USART_WR_String(const char *s)
{	int i = 0;
	while (s [i] != 0) {

	USART_write (s[i++]);
	}
}



 

Edited by dosikus

Share this post


Link to post
Share on other sites

Причем сброс флага записью 0 рекомендован только при multibuffer communication, а сие доступно только при работе с DMA .

Share this post


Link to post
Share on other sites
23 minutes ago, dosikus said:

Nicollo,  ваша проблема решается элементарно - выкашивается на SPL и все прекрасно работает.

void init_USART1(uint32_t baudrate){

	RCC_ClocksTypeDef RCC_ClocksStatus;
	RCC_GetClocksFreq(&RCC_ClocksStatus);

	RCC->APB2ENR |=RCC_APB2ENR_USART1EN | RCC_APB2ENR_IOPAEN;

	GPIOA->CRH &=~ (GPIO_CRH_CNF10 |GPIO_CRH_CNF9|GPIO_CRH_MODE10);
	GPIOA->CRH |= GPIO_CRH_CNF10_0 |GPIO_CRH_CNF9_1 | GPIO_CRH_MODE9;

	USART1->CR1 |= USART_CR1_TE |USART_CR1_RE |USART_CR1_RXNEIE;
	USART1->BRR =(RCC_ClocksStatus.PCLK2_Frequency+baudrate/2)/baudrate;
	USART1->CR1 |=USART_CR1_UE;


	NVIC_SetPriority(USART1_IRQn,15);
	NVIC_EnableIRQ(USART1_IRQn);
}

void USART_write (char data)
{
	while(!(USART1->SR & USART_SR_TXE));
	USART1->DR=data;
}

void  USART_WR_String(const char *s)
{	int i = 0;
	while (s [i] != 0) {
		USART_write (s[i++]);
	}
}

int main(void) {

  init_USART1(9600); // initialize USART1 @ 9600 baud

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
  GPIO_InitTypeDef GPIO_InitStructure;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  GPIO_Init(GPIOC , &GPIO_InitStructure);
  GPIO_WriteBit(GPIOC , GPIO_Pin_13 , RESET);

  USART_WR_String("Init complete! Hello World!\r\n"); // just send a message to indicate that it works

  while (1){
    /*
     * You can do whatever you want in here
     */
  }
}

// this is the interrupt request handler (IRQ) for ALL USART1 interrupts
void USART1_IRQHandler(void)
{
	if(USART1->SR & USART_SR_RXNE)
	{
		char recive_UART1 = USART1->DR;
		USART_write(recive_UART1);
	}
}

Не интераптит

Share this post


Link to post
Share on other sites
void USART1_IRQHandler(void)
{
	static uint8_t isSet = SET;
	GPIO_WriteBit(GPIOC , GPIO_Pin_13 , isSet);
	isSet = !isSet;

	if(USART1->SR & USART_SR_RXNE)
	{
		char recive_UART1 = USART1->DR;
		USART_write(recive_UART1);
	}
}

Сделал даже так, помограть диодом - оно в обработчик даже не заходит

Share this post


Link to post
Share on other sites
14 минуты назад, Nicollo сказал:

Не интераптит

А к чему ваши правки ? 

 

Подсказываю метод проверки :

Создаем проект с моим и неправленным кодом , тактовая чипа должна быть 72МГц  если тактовая иная правим здесь 

#define USARTCLK 72000000UL

Подсоединяем через адаптер UART -USB к ББ   и добиваемся устойчивого приема на стороне ББ отправляемых нами строк .

И только потом пробуем отправить с ББ и брякнуться в прерывании.

Да, сперва проверяем адаптер UART -USB замкнув RX и TX адаптера( без подсоединения отлаживаемой платы) и проверяя эхо в терминальной программе.

14 минуты назад, Mishany сказал:

у меня и без выкашивания SPL все прекрасно работает

А у нас в квартире газ...

Edited by dosikus

Share this post


Link to post
Share on other sites
8 minutes ago, dosikus said:

Подсоединяем через адаптер UART -USB к ББ   и добиваемся устойчивого приема на стороне ББ отправляемых нами строк .

И только потом пробуем отправить с ББ и брякнуться в прерывании...

Подсоединил, сделал как вы написали, на компе строку получил. прерывание не сработало

Share this post


Link to post
Share on other sites

Сперва 

Цитата

Да, сперва проверяем адаптер UART -USB замкнув RX и TX адаптера( без подсоединения отлаживаемой платы) и проверяя эхо в терминальной программе.

Кстати какой адаптер и какая терминальная программа?

И здесь крайне желательно наличие лог. анализатора - сокращает подобные танцы с бубном до минимума...

Edited by dosikus

Share this post


Link to post
Share on other sites
4 minutes ago, dosikus said:

Кстати какой адаптер и какая терминальная программа?

Адаптер: FT232RL. PUTTY

RX и TX работают. Прием-передачу делал без прерываний в основном цикле - работало без проблем. 

 

Share this post


Link to post
Share on other sites

Вы проверили эхо?

У меня так же все работает и с прерываниями и с DMA , так что ваша реплика -ниАчем ...

Share this post


Link to post
Share on other sites
2 minutes ago, dosikus said:

Вы проверили эхо?

У меня так же все работает и с прерываниями и с DMA , так что ваша реплика -ниАчем ...

Работает эхо, и адаптеры я менял. Оно просто не входит в обработчик, прерывание случается.

Share this post


Link to post
Share on other sites
4 минуты назад, Nicollo сказал:

Оно просто не входит в обработчик, прерывание случается.

Что сие означает? Как вы это проверяете? Что за IDE?

Например Keil - запускаете дебаг , ставите бряк на строку 

if(USART1->SR & USART_SR_RXNE)

Запускаете процесс, жмете кнопку на клаве когда окно putty в фокусе - должно сработать прерывание.

Edited by dosikus

Share this post


Link to post
Share on other sites

я думаю, я нашел причину. Я использую OpenSTM32 IDE

Оно, при создании проекта, само подгружает SPL так вот, там есть файлик: sturtup_stm32.s

насколько я понял в нем мапятся прерывания с обработчиками, и он не проинициализирован до конца

g_pfnVectors:
	.word	_estack
	.word	Reset_Handler
	.word	NMI_Handler
	.word	HardFault_Handler
	.word	MemManage_Handler
	.word	BusFault_Handler
	.word	UsageFault_Handler
	.word	SVC_Handler
	.word	DebugMon_Handler
	.word	PendSV_Handler
	.word	SysTick_Handler

Я скачал библиотеку с сайта и посмотрел в этот файлик, и он немного отличается. Сейчас попытаюсь запустить проект с новой либой.

Added:

Да, все верно, подменил файл, все заработало. Спасибо всем.

Edited by Nicollo

Share this post


Link to post
Share on other sites

я обычно предпочитаю в обработчик писать только это

void USART1_IRQHandler(void)
{
  HAL_UART_IRQHandler(&huart1);
}

а остальное уже делать в колбэке. Хотя по сути это одно и то же, но зато вероятность ошибиться меньше. Потому как HAL_UART_IRQHandler все флаги сам позсбрасывает там где надо и вызовет нужный колбэк

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if (huart->Instance == USART1)
	{		
		xQueueSendToBackFromISR( displayQueueHandle, &UART1_rxBuffer, 0 );
	}
}

 

Edited by mail_robot

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

Share this post


Link to post
Share on other sites

Здесь не хватало скорости в прерывание из-за SPL http://www.microchip.su/showpost.php?p=231953&postcount=162

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

Edited by dosikus

Share this post


Link to post
Share on other sites

Если у вас руки из жопы кодят, то куб то тут при чем?

STM1_WIFI_TEST.ZIP

Edited by mail_robot

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

Share this post


Link to post
Share on other sites

Во первых сперва почитай кого ты в говнокодерстве обвиняешь, а во вторых причем здесь бездумнонатыканнаяхрень в калокубе????

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...

  • Сообщения

    • @colorad Спасибо изучу эти исходники. Надеюсь получится перенести из них эти скрипты для 16 командной системы. Смотрел этот сайт долго и несколько раз, но я так и не нашёл более систем дистанционного управления кроме тех что были в самом начале. Видимо сказывается незнание языка. Сложно искать что то на таких сайтах. И да спасибо за подсказку с инверсией попробую сделать.
    • D1 на плате сгорел в уголь. Правда, не совсем понятно, зачем он вообще там стоит, если блок питания выдаёт постоянку. Сгореть мог из -за замыкания в гирлянде, например, или просто так. Попробовать заменить на обычный диод,  Судя по тому, что на саму гирлянду идёт всего два провода, есть подозрение, что микросхема контроллёра ещё и меняла полярность подаваемого на гирлянду тока. Т.е., без контроллёра полноценно запитать гирлянду не получится. Но это неточно и надо проверять.
    • Вообще должен быть технологический запас. Но у китайцев бывает, как это говориться, "он есть, но он отрицательный". Я бы просто последовательно стабилитроном отнял несколько вольт для уверенности. Теоретически можно и резистором, но тогда считать нужно.
    • Конспиролог из МГИМО  прогноз погоды, по вашему, так же конспирология. А схемы, срисованные из 196х, 197х, и публикуемые за свои, так же https://ru.m.wikipedia.org/wiki/Теория_заговора ? Бафи, ну, ты же взрослый мальчик, зачем повелся на троллинг? С нем0 и СтаричОк у тебя лучше получается и нам, начинающим, поучиться - польза. Бот и шекель, каждый пост это его зарплата, не давай ему заРАБотать на тебе и цени Свое Время (в ККМ Его вложи). Если оно просто Робот, так же, - в игнор (пора различать "прошитых" и "заблудившихся")
    • От ты смешной !  Да я не тороплюсь. Цена копеечная- ничего в моём бюджете не решает. Кстати ключ с памятью уже покупают . И опять с этого форума. Отправил потенциалу атрибуты. Вот ты загорюешь ! Челюсть точно выпадет . Ну ничего , я ещё что -нибудь склепаю никому не нужное. Будет стариканам о чём побазлать. 

  • Трубка J305 для счетчика Гейгера

  • Similar Content

    • By Карен Григорян
      Здравствуйте, товарищи форумчане!
      У меня вот такая проблемка: есть такая схема:

      По сути тут stm32 на который подаётся некоторое постоянное напряжение, а именно на вход PA1. МК получает его, приводит в цифровую форму (разрядность АЦП равна восьми) и выводит их при помощи восьми GPIO выводов, а именно PB0-PB7. Эти выводы соединены со схемой ЦАП, которая преобразует значение, полученное от stm32 обратно в аналоговую форму и выводит в пробнике R2(1).
      Проблема в том результат выводится не верный. Точнее говоря не всегда верный. Когда я подаю 1В, то на выходе получаю 0,99В, что верно. Но когда, например, подаю 300мВ, то получаю 1.8В, что совсем не верно. Код прошивки предельно прост:
        while (1)
        {
              HAL_ADC_Start_IT(&hadc1);
              HAL_Delay(10);
      }
      Код колбека прерывания:
      void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
      {
          if(hadc->Instance == ADC1) //check if the interrupt comes from ACD1
          {
            int adc = HAL_ADC_GetValue(&hadc1);
                  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,(adc>>0)&1);
                  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,(adc>>1)&1);
                  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,(adc>>2)&1);
                  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,(adc>>3)&1);
                  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,(adc>>4)&1);
                  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,(adc>>5)&1);
                  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,(adc>>6)&1);
                  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,(adc>>7)&1);
          }
              }
      На всякий случай вот настройка АЦП в stm32:

      Вот пример неправильного вычисления:

    • By Vladimir Rubtsov
      Здраствуйте) Подскажите мне балбесу что я делаю не так. Хочу сделать чтобы при нажатии кнопки (PB13) срабатывал светодиод (PE1), но не работает, я как понял что я не правильно инициализирую режим работы порта кнопки, должен быть режим Input mode, но я не пойму как это сделать. У меня просто горит светодиод, но при нажатии кнопки ничего не происходит. Плата у меня stm32h743zi. Подскажите пожалуйста что я делаю не так, все сайты прочекал, но так ничего и не нашел. p.s. Пробовал через HAL писать тоже самое, там естественно все работает, но я хочу понять как работать с кнопкой без HAL.
      #include "stm32h7xx.h" void GPIO_Init(void); int main(void) { GPIO_Init(); if((GPIOC->IDR & GPIO_IDR_ID13) != 0) { GPIOE->BSRR |= GPIO_BSRR_BR1; }else{ GPIOE->BSRR |= GPIO_BSRR_BS1; } } void GPIO_Init () { RCC->AHB4ENR |= RCC_AHB4ENR_GPIOEEN; RCC->AHB4ENR |= RCC_AHB4ENR_GPIOCEN; GPIOE->MODER = GPIO_MODER_MODE1_0; GPIOC->MODER &= ~GPIO_MODER_MODE13; }


    • By Денисов Никита
      Здравствуйте. Решил я таки попробовать перебраться с Arduino AVR на STM32 и для начала решил полностью скопировать Arduino проект, но появилась проблема. Код который на AVR занимал 7кбайт и свободно вмещался на Atmega8, на STM32 занимает 26кбайт. В проекте используется 2 канала ацп + прерывания по DMA, дисплей 1602 по i2c и 4 GPIO. Конечно это занимает только 42% памяти STM32F103C8T, но для такого проекта она избыточна и я хотел использовать STM32F030F4P, но там только 16 кб памяти и прошивка не влезает. Что я не так делаю? Может нужно какую-то оптимизацию включить или что-то подобное(выбран уровень оптимизации for size)? Или у меня просто код никчёмный? Но там так мало написано, что сомневаюсь что я мог где-то накосячить 
    • By Любовь Бертулите
      Компания производитель вендинговых автоматов для розлива питьевой воды в поисках инженера-системотехника/инженера электронщика.
      График 5/2 с 9 до 18, здесь удаленный формат не рассматриваем.
      Место работы – г. Екатеринбург.
      Мы ищем специалиста, который будет делать прототипы нового для контроллера, курировать производство, проверять, дорабатывать, перепаивать, а также:
      Переписывать текущие программы на С++; Создавать программу для Android для конфигурации параметров контроллера через bluetooth. (т.е. предлагать новые, современные идеи и подходы для развития имеющихся контроллеров, которыми вы владеете); Предлагать новые программные продукты, среды разработки. Будет в тренде мира микроэлектроники, китайского контрактного производства. Может предложить совершенно новую реализацию наших текущих задач, чтобы это было лучше и эффективнее. В идеале, нам нужен специалист, который имеет:
      Опыт программирования микроконтроллеров Atmega, STM32, ESP32; Опыт работы в Altium Designer; Опыт работы в c++ (IAR, QT); Опыт работы с modbus, rs485/232, SPI. Готовы рассматривать специалистов с разным опытом, поэтому пишите, задавайте вопросы.
      Резюме можно отправить на почту lb@ktekt.ru (да, мы кадровое агентство), позвонить можно по следующему тел. 89068001212 - Любовь. 
       
    • By xrou
      Здравствуйте, пытаюсь подключить USB флешку к STM32F767ZI
       
      Включаю USB_OTG_FS - host only, (V bus и SOF  не включаю), USB HOST Class for fs ip - Mass Storage host class, FATFS (USE_LFN - в стеке) - USB_Disk
      В настройках USB_HOST требует, как я понял, пин отвечающий за питание устройства - PC1
      Код простейший, должен работать 100% а может нет. Внутренние файлы библиотек не менял
      Думаю что нет питания на USB устройство т.к. пробовал вставить туда ttl конвертер на котором есть светодиод питания и он не горит
       
      Ваши идеи и предположения? 
       
×
×
  • Create New...