标签: stm32f4

STM32在HAL中实现单按、长按、双按功能

我正在尝试实现单按、双按和长按功能来执行不同的功能。到目前为止,我已经理解了单按和长按的逻辑,但我不知道如何检测双按。至于代码,我已经使用计数器实现了单按和长按,但代码只停留在第一个 if 条件上。

          bool single_press = false;
      bool long_press = false;

      if (HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13))
      {

          HAL_TIM_Base_Start(&htim2);
          if ((TIM2->CNT == 20) && (HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13)))
          {
              single_press = true;
              long_press = false;
          }
          else if ((TIM2->CNT == 799) && (HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13)))
          {
              single_press = true;
              long_press = true;
          }
          HAL_TIM_Base_Stop(&htim2);
      }

      if (single_press == true && long_press == false)
      {
          HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, 1);
          HAL_Delay(1000);
          HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, 0);
      }
      else if (single_press == true && long_press == true)
      {
          HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, 1);
          HAL_Delay(1000); …
Run Code Online (Sandbox Code Playgroud)

c embedded hal stm32 stm32f4

2
推荐指数
1
解决办法
334
查看次数

FreeRTOS vTaskDelayUntil()立即完成

我有一个问题,vTaskDelayUntil()函数没有延迟,但立即完成.这是代码:

TickType_t xLastWakeTime = xTaskGetTickCount();
while(1){
    if (xSemaphoreTake(xSemaphoreRS485, portMAX_DELAY) == pdTRUE) {
        printf("S display data %d\n", xTaskGetTickCount());
        sendDisplayData();
        printf("E display data %d\n", xTaskGetTickCount());
        xSemaphoreGive(xSemaphoreRS485);
        printf("W display data %d\n", xLastWakeTime);
        vTaskDelayUntil(&xLastWakeTime, 2000);
    }
}
Run Code Online (Sandbox Code Playgroud)

从这里我得到以下输出:

S display data 29928
E display data 30534
W display data 3919
S display data 30534
E display data 31140
W display data 5919
S display data 31140
E display data 31746
W display data 7919
S display data 31746
E display data 32352
W display …
Run Code Online (Sandbox Code Playgroud)

c freertos stm32f4

1
推荐指数
1
解决办法
1659
查看次数

STM32F401RE Nucleo板,无法切换用户LED

我试图弄清楚如何在Nucleo板上切换LED,我只是看不到用户LED切换.在网上看来,这就是你要做的一切.还有其他人遇到过这个问题吗?

#include "stm32f4xx.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_rcc.h"

int main(void)
{
    int counter = 0;
    SystemInit();

    GPIO_InitTypeDef temp;
    temp.GPIO_Mode = GPIO_Mode_OUT;
    temp.GPIO_OType = GPIO_OType_PP;    // Push Pull
    temp.GPIO_Pin = GPIO_Pin_5;
    temp.GPIO_Speed = GPIO_Low_Speed;
    temp.GPIO_PuPd = GPIO_PuPd_NOPULL;

    RCC_APB2PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

    GPIO_Init( GPIOA, &temp );

    while( 1 )
    {
        if ( counter++ > 10000 )
        {
            GPIO_ToggleBits( GPIOA, GPIO_Pin_5 );
            counter = 0;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

c microcontroller stm32 stm32f4 nucleo

1
推荐指数
1
解决办法
191
查看次数

如何使用适用于2个微控制器的嵌入式C语言为嵌入式系统编写可移植代码?

我有 STM32F4 DISC-1 的 UART 代码,我希望它也能在其他微控制器上工作。如何开始?

c embedded microcontroller stm32f4

1
推荐指数
1
解决办法
390
查看次数

HAL驱动程序在STM32F4核上擦除/读取/写入闪存

uint32_t PAGEError = 0;
FLASH_EraseInitTypeDef EraseInitStruct;
EraseInitStruct.TypeErase   = FLASH_TYPEERASE_SECTORS ;
EraseInitStruct.Sector   = FLASH_SECTOR_0;
EraseInitStruct.VoltageRange = FLASH_VOLTAGE_RANGE_3;

HAL_FLASH_Unlock();
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR);
HAL_FLASHEx_Erase(&EraseInitStruct, &PAGEError);
HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, 0x08000000, counter)
HAL_FLASH_Lock();

counter2 = *(__IO uint32_t *)0x08000000;
counter3 = *(__IO uint32_t *)0x08000001;
counter4 = *(__IO uint32_t *)0x08000002;

sprintf(buf, "%d", counter2); //gets send to the OLED with I2C
sprintf(buf2, "%d", counter3);
sprintf(buf3, "%d", counter4);
Run Code Online (Sandbox Code Playgroud)

我想将变量计数器写入闪存,然后将其读取为counter2。第一个闪存扇区始于0x08000000

counter234通过OLED屏幕显示。显示counter2作品并向我显示的值counter-1,但仅能显示一次。如果我再次写闪存,似乎什么也没发生。 …

c stm32f4

0
推荐指数
1
解决办法
1万
查看次数

IRQ Handler 和 Callback 函数有什么区别?

我们正在使用 STM32F429I 并尝试通过不同的方式使用定时器(TIM2 和 TIM5)。在我们的代码中启用计时器并调用后;

HAL_TIM_Base_Start_IT(&htim5);
Run Code Online (Sandbox Code Playgroud)

我们可以通过调用TIM5_IRQHandler函数来更新变量。我们注意到HAL_TIM_PeriodElapsedCallback函数已完成相同的过程。

那么我们的问题是:这两个函数有什么区别吗?

embedded interrupt stm32f4

0
推荐指数
1
解决办法
8689
查看次数

使用strstr()之后,子串也通过uart传输

我正在尝试UART使用STM32F407V6T6CubeMx.

因为我已经发布了一些strstr()功能问题.这是一些新问题.

这是代码:

char rxBuff[10];
int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_USART2_UART_Init();
  Green_Blink(100);
  Orange_Blink(100);
  Blue_Blink(100);
  Red_Blink(100);
  while (1)
  {

        HAL_UART_Transmit_IT(&huart2,(uint8_t*)"hello\r\n",10);
        HAL_Delay(1000);
        Orange_Blink(100);
        if (strstr(rxBuff,"hi"))
        {

        }
   }
}
Run Code Online (Sandbox Code Playgroud)

这里我正在做的是我正在hello\r\n使用发送中断进行传输.发射后,我检查了像某些值hirxBuff[10].

在这个特定的代码中,我没有收到任何我刚创建缓冲区并检查它是否包含的内容hi.

请注意,在传输时我只发送7个字节的数据.但是在HAL_UART_Transmit_IT()大小的地方,我给了10.

HAL_UART_Transmit_IT(&huart2,(uint8_t*)"hello\r\n",10);

将此代码刷新到我的stm32后,我可以在终端中看到各种输出

你好\ r\NHI

如果我将txt hi改为其他类似行星的东西,那么输出就像

你好\ r\NPL

但是当我给出这样的完美尺寸时

HAL_UART_Transmit_IT(&huart2,(uint8_t*)"hello\r\n",7);

我得到了应该得到的实际输出

你好\ r \n

通过UART传输数据并查找某个缓冲区中是否存在子串是完全不同的任务.

有什么建议为什么会发生这种情况?

PS:基本上我的项目是GSM MODULE SIM800c和STM32f407VGt6我想从stm32发送各种AT命令并检查响应,以便我可以相应地工作.

以前我用AVR系列mcus尝试过这个项目,我可以发送短信,接收特定的短信,使用post和get方法向服务器发送数据,一切都运行得很好.

转移到ARM后,我没有得到STM32的表现.

c strstr stm32f4 sim800

-4
推荐指数
1
解决办法
134
查看次数

标签 统计

stm32f4 ×7

c ×6

embedded ×3

microcontroller ×2

stm32 ×2

freertos ×1

hal ×1

interrupt ×1

nucleo ×1

sim800 ×1

strstr ×1