标签: stm32

擦除后无法写入闪存

所以擦除后我不能直接写入内部闪存.如果在写操作之前没有擦除操作,那么我可以.任何想法为什么?

编程功能返回"成功写入"值,但在查看内存时,不会写入任何数据.这是代码:

uint32_t pageAddress = 0x08008000;
uint16_t buffer = 0xAAAA;

HAL_FLASH_Unlock();
FLASH_PageErase(pageAddress);
HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, pageAddress, buffer);
HAL_FLASH_Lock();
Run Code Online (Sandbox Code Playgroud)

我已经尝试在擦除和编程之间锁定内存,在这些操作之间创建延迟,这没有帮助.

c memory arm stm32 flash-memory

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

FreeRTOS:osDelay vs HAL_delay

在使用STM32CubeMx创建FreeRTOS应用程序项目时,有两种方法可以用来引入延迟,即osDelayHAL_Delay.

它们之间有什么区别,应该首选哪一个?

osDelay代码:

/*********************** Generic Wait Functions *******************************/
/**
* @brief   Wait for Timeout (Time Delay)
* @param   millisec      time delay value
* @retval  status code that indicates the execution status of the function.
*/
osStatus osDelay (uint32_t millisec)
{
#if INCLUDE_vTaskDelay
  TickType_t ticks = millisec / portTICK_PERIOD_MS;

  vTaskDelay(ticks ? ticks : 1);          /* Minimum delay = 1 tick */

  return osOK;
#else
  (void) millisec;

  return osErrorResource;
#endif
}
Run Code Online (Sandbox Code Playgroud)

HAL_Delay代码: …

c embedded stm32 freertos

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

初始化期间STM32 RTC超时

我正在尝试在STM32F469I-DISCO板上初始化RTC。由于我仍在学习,所以我尝试使用HAL API,使我可以完成一些项目,直到我对这种微控制器有了足够的了解,可以直接与寄存器一起使用。

无论如何,我的代码使用了CubeF4的STM32F469I-DISCO模板,该模板允许直接加载HAL层和系统时钟(通过8 MHz HSE振荡器获得180 MHz)。

为了初始化RTC,我遵循了UM1725中给出的说明:STM32F4 HAL和LL驱动程序说明。在页面715,第55.2.4节中,您具有使用HAL_RTC API的说明。

第一点说,有必要启用“ RTC域访问”。在上一节(55.2.3,同一页)中解释了这一点。

我做了要求做的事情。这是我的代码(简化后,我只允许RTC Init部分和系统时钟配置):

#include "main.h"

RTC_HandleTypeDef rtcHandle;
RTC_InitTypeDef rtcInit;
RTC_TimeTypeDef rtcTime;
RTC_DateTypeDef rtcDate;

static void SystemClock_Config(void);
static void Error_Handler(void);


int main(void)
{
  HAL_Init();
  SystemClock_Config();

  ////////////////// RTC 

  HAL_PWR_EnableBkUpAccess();
  __HAL_RCC_RTC_CONFIG(RCC_RTCCLKSOURCE_LSE);
  __HAL_RCC_RTC_ENABLE();

  rtcInit.HourFormat = RTC_HOURFORMAT_24;
  rtcInit.AsynchPrediv = 0x7F;
  rtcInit.SynchPrediv = 0xFF;
  rtcInit.OutPut = RTC_OUTPUT_DISABLE;
  rtcInit.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
  rtcInit.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;

  rtcHandle.Instance = RTC;
  rtcHandle.Init = rtcInit;

  HAL_RTC_Init(&rtcHandle);

  rtcTime.Hours = 12;
  rtcTime.Minutes = 30;
  rtcTime.Seconds = 40;

  rtcDate.WeekDay = RTC_WEEKDAY_WEDNESDAY; …
Run Code Online (Sandbox Code Playgroud)

timer stm32 real-time-clock

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

这句话在C中意味着什么:"(void)ptr;"

从标题中可能不清楚.我在嵌入式STM32项目中遇到了以下代码.我不明白函数里面的行.

    static void txend1(UARTDriver *uartp) {
        (void)uartp; // what does this do? Is it a statement?
    }
Run Code Online (Sandbox Code Playgroud)

我已经尝试在网上搜索其他地方,但大多数结果是指向void指针的指针,我不认为这是.谢谢您的帮助!

c embedded stm32

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

设置引脚后触发外部中断

我试图让外部中断在 Nucleo-F030R8上运行 ,但遇到了困难。

一切都已配置并在单步模式下运行得很好,但是当我使用简单的跳线将我的板连接到另一个测试板并运行相同的代码时,即使该测试板(第二个 Nucleo-F302R8,应该只产生一个我想用第一个信号峰值来测量的信号峰值)未打开。

我混合使用了 STM 的 HAL 库和我自己的一些代码。

有人最终遇到过类似的问题吗?我正在使用 STM32 的系统工作台。

部分ISR、Interrupthandler被删掉

void EXTI0_1_IRQHandler(void)
{
   /* USER CODE BEGIN EXTI0_1_IRQn 0 */
   if ((EXTI->IMR & EXTI_IMR_MR0) && (EXTI->PR & EXTI_PR_PR0))
   {
       int_flag_pin.copen = 1;
   }
   if ((EXTI->IMR & EXTI_IMR_MR1) && (EXTI->PR & EXTI_PR_PR1))
   {
      int_flag_pin.ma1 = 1;
   }

   /* USER CODE END EXTI0_1_IRQn 0 */
   HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
   HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_1);
   /* USER CODE BEGIN EXTI0_1_IRQn 1 */

   /* USER CODE END EXTI0_1_IRQn 1 */
}
Run Code Online (Sandbox Code Playgroud)

在将引脚设置为低电平和改变上升电平之间,中断被触发。

TEST_GPIO_Port->BSRR = (uint32_t) …
Run Code Online (Sandbox Code Playgroud)

c stm32 stm32f0 stm32f3

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

无法让STM32F103RB usart1与hc-05通信

我无法将USART_1与蓝牙hc-05连接.微控制器是STM32F103RB.这是代码(我没有使用任何库)

#define APB2_FREQ 72000000

void USART1_Send(char* data)
{   
    unsigned int length = 0;
    while(data[length] != '\0')
        ++length;       

    int i = 0;
    while(i < length)
    {
        while((USART1_SR & 0x00000080) == 0); // wait if transmit data register is not empty
        USART1_DR = data[i];
        ++i;
    }
}

char USART1_Receive()
{
    while((USART1_SR & 0x00000020) == 0);     //wait for data to arrive
    return USART1_DR;
}

void USART1_Init(int baudrate, short parity, short stop)
{
    RCC_APB2ENR |= 0x00004004;                // enable Port A, enable usart1 clock

    GPIOA_CRH …
Run Code Online (Sandbox Code Playgroud)

stm32 keil uart hc-05

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

uint32_t 未命名类型 - Windows 中使用 STM32 的 VSCode

我目前正在为一个项目编写代码,特别是通过 STM32 Nucleo F411RE 板与传感器连接。我使用 STM32CubeMX 设置引脚/外设等,然后使用 Makefile 工具链生成代码,以便在 Visual Studio Code 中进行编程。一切都编译得很好,但 IDE/Intellisense 由于某种原因没有使用uint32_t; 任何发生的情况都会以红色波浪线显示,错误读数为variable "uint32_t" is not a type name

#include <stdint.h>在顶部, 和uint16_tuint8_t在同一个文件中被识别。偷看这些定义会揭示它们的行stdint.h,而同样不适用于uint32_t. 我已经尝试了此处此处建议的解决方案,但都不起作用。

我正在 Windows 上使用 C11(不是 c++,这不是我的项目的选项),这是我的c_cpp_properties.json文件(为了紧凑性,所有额外的定义都被删除):

{
    "configurations": [
        {
            "name": "Win32",
            "includePath": [
                "${workspaceFolder}/**"
            ],
            "defines": [
                "_DEBUG",
                "UNICODE",
                "_UNICODE"
            ],
            "databaseFilename": "${workspaceFolder}/.vscode/browse.vc.db",
            "windowsSdkVersion": "10.0.17763.0",
            "compilerPath": "C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/VC/Tools/MSVC/14.16.27023/bin/Hostx64/x64/cl.exe",
            "cStandard": "c11",
            "cppStandard": "c++17", …
Run Code Online (Sandbox Code Playgroud)

c intellisense stm32 uint32 visual-studio-code

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

Qemu:致命:锁定:无法将 3 升级为硬故障(当前优先级 -1)错误 - 核心转储

我正在尝试在 QEMU 上使用 Cortex M4 处理器模拟 STM32F407XX 控制器。我编写了 .ld 文件,如下所示:

ENTRY(_Reset)

MEMORY
{
  FLASH (rx)      : ORIGIN = 0x08000000, LENGTH = 512K
  RAM (xrw)       : ORIGIN = 0x20000000, LENGTH = 128K
  CCMRAM (rw)     : ORIGIN = 0x10000000, LENGTH = 64K
  PERIPHERALS(rw) : ORIGIN = 0x40000000, LENGTH = 128K
}

SECTIONS
{

 .startup . : { stm32.o(.text) } >FLASH
 .text : { *(.text) } 
 .data : { *(.data) } >RAM AT> FLASH
 .bss : { *(.bss COMMON) } >RAM
 . = …
Run Code Online (Sandbox Code Playgroud)

c linux embedded qemu stm32

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

为什么即使禁用时钟 D2 RAM 也能正常工作?

TL;DR:文档说明我必须先在微控制器中启用特定的内存区域,然后才能使用它。但是,我可以在启用它之前使用它,甚至可以在禁用它之后使用它。这怎么可能?


我目前正在为 STM32H743 微控制器开发一个应用程序。我不明白当时钟被禁用时 RAM 似乎如何正常工作。

该 MCU 具有多个存储器,分布在多个电源域中:

  • 在 D1 域中,它具有 ITCMRAM + DTCMRAM + AXI SRAM (64 + 128 + 512 kB)
  • 在 D2 域中,它有 SRAM1 + SRAM2 + SRAM3 (128 + 128 + 32 kB)
  • 在 D3 域中,它具有 SRAM4 + 备份 SRAM (64 + 4 kB)

我想使用SRAM1。在参考手册 ( RM0433 Rev. 7) 中,第 366 页指出:

如果 CPU 要使用位于 D2 域(SRAM1、SRAM2 和 SRAM3)中的存储器,则必须启用它们。

在第 452 页的寄存器设置中描述了如何执行此操作:

RCC AHB2 时钟寄存器(RCC_AHB2ENR):

SRAM1EN: SRAM1 块使能
由软件置位和复位。置位时,该位表示 SRAM1 由 CPU 分配。它使 D2 …

microcontroller clock stm32 stm32-hal stm32h7

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

测量 ARM MCU 中断延迟的问题

介绍

\n

我是一名学生,想在不使用示波器的情况下粗略测量ARM Cortex-M系列芯片的中断延迟。然而,我遇到了一个非常奇特的问题,让我非常困惑。

\n

首先,让我简要概述一下我的测量方法。我尝试使用MCU的内置定时器粗略地测量中断延迟。我的基本想法如下:在进入中断服务程序(ISR)之前,我将计时器重置为零。然后,我将生成一个中断请求并进入 ISR。进入 ISR 后,我会立即读取计时器的值。此时,计时器值可以作为中断延迟的非常粗略的估计。

\n

由于某些原因,我需要使用汇编语言编写上述ISR函数。在主函数中,我使用 SWIER 寄存器生成一个软件中断,这允许我进入我编写的 ISR。

\n

I encountered a peculiar issue during this process. When writing an ISR in Assembly language, it is customary to push several registers onto the stack upon entering the function, such as R4 to R11, and pop them back when exiting the function. Therefore, in theory, if I don\'t push the registers onto the stack upon entering the ISR (assuming I don\'t use those registers within …

c assembly arm stm32 cortex-m

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