标签: stm32f0

Arduino millis()在stm32

我想尝试将一些Arduino库移植到stm32.在Arduino中,millis()返回自引导以来的毫秒数.在stm32中是否有等效的功能?我正在使用stm32f0 MCU.

microcontroller arduino stm32 milliseconds stm32f0

8
推荐指数
2
解决办法
8064
查看次数

使用HAL驱动程序在stm32上进行EEPROM仿真

我试图在stm32f0上模拟EEPROM.STM提供了一份应用说明.

在样本中main.c,

int main(void)
{
  /*!< At this stage the microcontroller clock setting is already configured, 
       this is done through SystemInit() function which is called from startup
       file (startup_stm32f0xx.s) before to branch to application main.
       To reconfigure the default setting of SystemInit() function, refer to
       system_stm32f0xx.c file
     */  
   /* Unlock the Flash Program Erase controller */
  FLASH_Unlock();

  /* EEPROM Init */
  EE_Init();

/* --- Store successively many values of the three variables in the EEPROM ---*/ …
Run Code Online (Sandbox Code Playgroud)

stm32 flash-memory eeprom stm32f0

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

设置引脚后触发外部中断

我试图让外部中断在 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
查看次数

如何更改闪存的起始地址?

我正在使用 STM32F746ZG 和 FreeRTOS。flash 的起始地址是 0x08000000。但我想把它改成 0x08040000。我已经通过谷歌搜索了这个问题,但没有找到解决方案。

我更改了链接器脚本,如下所示。

MEMORY
{
RAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 320K
/* FLASH (rx)      : ORIGIN = 0x8000000, LENGTH = 1024K */
FLASH (rx)      : ORIGIN = 0x8040000, LENGTH = 768K
}
Run Code Online (Sandbox Code Playgroud)

如果我只更改它并运行调试器,就会出现问题。如果我将 VECT_TAB_OFFSET 从 0x00 更改为 0x4000,它工作正常。

/* #define VECT_TAB_SRAM */
#define VECT_TAB_OFFSET  0x40000  /* 0x00 */

SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; 
Run Code Online (Sandbox Code Playgroud)

但是如果我不使用调试器,它就不起作用。这意味着它仅在使用 ST-Linker 时有效。

如果您知道解决方案,请告诉我。提前感谢您的回复。

stm32 stm32f4discovery stm32f7 stm32f0

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

为n个cpu周期添加延迟/什么都不做的最佳方法

我需要在n个CPU周期的代码中添加一个延迟(~30).我目前的解决方案是下面的解决方案,但有效但不是很优雅.

此外,必须在编译时知道延迟.我可以使用它,但如果我可以在运行时更改延迟,那将是理想的.(如果有一些开销可以,但我需要1个周期的分辨率.)

我没有任何外围定时器,我可以使用,所以它需要是一个软件解决方案.

do_something();
#define NUMBER_OF_NOPS   (SOME_DELAY + 3)
#include "nops.h"
#undef NUMBER_OF_NOPS
do_the_next_thing();
Run Code Online (Sandbox Code Playgroud)

nops.h:

#if NUMBER_OF_NOPS > 0
    __ASM volatile ("nop");
#endif
#if NUMBER_OF_NOPS > 1
    __ASM volatile ("nop");
#endif
#if NUMBER_OF_NOPS > 2
    __ASM volatile ("nop");
#endif
...
Run Code Online (Sandbox Code Playgroud)

c embedded arm stm32 stm32f0

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

校准 STM32 ADC (VREFINT)

我正在尝试在 STM32F042 微控制器上读取 VDDA。我在 VDD 为 3.29V 时得到了意想不到的结果。我一定缺少一些基本的东西。

输出:

VREFINT=1917; VREFINT_CAL=1524; VDDA=2623 mV
VREFINT=1885; VREFINT_CAL=1524; VDDA=2668 mV
VREFINT=1913; VREFINT_CAL=1524; VDDA=2628 mV
VREFINT=1917; VREFINT_CAL=1524; VDDA=2623 mV
VREFINT=1917; VREFINT_CAL=1524; VDDA=2623 mV
Run Code Online (Sandbox Code Playgroud)

adc_test.c:

VREFINT=1917; VREFINT_CAL=1524; VDDA=2623 mV
VREFINT=1885; VREFINT_CAL=1524; VDDA=2668 mV
VREFINT=1913; VREFINT_CAL=1524; VDDA=2628 mV
VREFINT=1917; VREFINT_CAL=1524; VDDA=2623 mV
VREFINT=1917; VREFINT_CAL=1524; VDDA=2623 mV
Run Code Online (Sandbox Code Playgroud)

数据表截图:

在此处输入图片说明

参考手册截图

请注意,这是指 .3V,但我认为这是一个错字,因为上面的数据表和下面更长的公式是指 3.3V,而 .3V 低于该部件的最低工作电压

在此处输入图片说明

stm32 adc stm32f0

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

无法通过UART传输每个字符

我正在使用stm32f0 MCU.

我想传输从uart收到的每个字节.我在从uart收到的每个字节上启用一个中断.

我的代码非常简单.

uint8_t Rx_data[5]; 

//Interrupt callback routine
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    if (huart->Instance == USART1)  //current UART
    {
        HAL_UART_Transmit(&huart1, &Rx_data[0], 1, 100);        
        HAL_UART_Receive_IT(&huart1, Rx_data, 1);   //activate UART receive interrupt every time on receiving 1 byte
    }
}
Run Code Online (Sandbox Code Playgroud)

我的PC将ASCII传输12345678到stm32.如果事情按预期工作,PC应该12345678收回.但是,PC收到了1357.代码有什么问题?

interrupt stm32 uart stm32f0 stm32-hal

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

为什么UART发送中断在这种情况下无效?

我正在使用stm32f0 MCU.

我有一个简单的UART回声代码,其中接收的每个字节都将被传输出去.我测试它是否有效.这里是;

uint8_t Rx_data[5]; 
uint32_t tx_timeout = 0;
//Interrupt callback routine
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    if (huart->Instance == USART1)  //current UART
    {
        HAL_UART_Transmit(&huart1, &Rx_data[0], 1, tx_timeout);        
        HAL_UART_Receive_IT(&huart1, Rx_data, 1);   //activate UART receive interrupt every time on receiving 1 byte
    }
}
Run Code Online (Sandbox Code Playgroud)

即使它有效,我对代码感到不舒服.首先,tx_timeout是0并且大多数代码示例都是非零的.我不知道副作用.其次,HAL_UART_Transmit()是一个阻塞调用,不建议在中断中使用阻塞调用.所以,我决定使用中断进行uart传输HAL_UART_Transmit_IT()而不是阻塞调用.这是修改后的代码;

uint8_t Rx_data[5]; 
uint32_t tx_timeout = 0;
//Interrupt callback routine
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    if (huart->Instance == USART1)  //current UART
    {
        HAL_UART_Transmit_IT(&huart1, &Rx_data[0], 1);        
        HAL_UART_Receive_IT(&huart1, Rx_data, 1);   //activate UART receive interrupt every …
Run Code Online (Sandbox Code Playgroud)

interrupt stm32 uart stm32f0 stm32-hal

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

HAL_SetDate 将年份设置为错误值

我将 STM32F030RCT6 与 CubeMX 一起使用。设备是一个数据记录器,RTC 是不能失败的主要因素。在勘误表上有一些关于 RTC Shadow Register 的内容。

我将CubeMX配置为不生成MX_RTC_Init()函数,到目前为止它一直正常工作。(我正在使用 LSE)

我需要从 GSM 时间更新时间/日期,但是当我将年份设置为18HAL_SetDate(),经过一段时间的延迟阅读HAL_GetDate()sDate.Year给了我20。除了Year,其他值都是正确的。

我试过的:

  • 二手LSI
  • 而 (HAL_SetDate != HAL_GetDate) HAL_SetDate(ActualDate)
  • HAL_GetDate然后HAL_SetDate

我没有任何进展,事情甚至变得更糟,例如Month= 56、Day= 45 等。

提前致谢。此致。

hal stm32 stm32f0 cubemx

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

STM32CubeIDE 在没有调试信息或程序代码之外的地址“xxx”处中断

我正忙着用 STM32F030C8 单片机开发一些新硬件。我正在使用带有 gcc 的 STM32CubeIDE。我对微控制器开发非常陌生,这是我使用 ST 及其工具的第一个项目。

这是一个非常基本的程序,它只触发一个 GPIO。其余的都是生成的代码。由于我在这方面的经验很少,我希望有人可以指出我可以查看的位置。我怀疑这可能是配置问题。

这是代码(我删除了所有生成的注释以使其更紧凑):

int main(void)
{
  HAL_Init();

  SystemClock_Config();

  MX_GPIO_Init();

  HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_2); //my code 1
  HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_2); //my code 2

  while (1)
  {
      HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_2);
      HAL_Delay(1000);
  }
}
Run Code Online (Sandbox Code Playgroud)

当我单步执行代码时,一旦我进入“我的代码 2”,它将触发“我的代码 1”上的 GPIO,这将导致问题。我什至尝试过只运行一个完全生成的程序而不做任何修改,但问题仍然存在。这是一个快速测试,看看程序是否确实在 mcu 上运行。它确实会触发 GPIO。

调试器控制台输出:

Temporary breakpoint 1, main () at ../Core/Src/main.c:74
74        HAL_Init();

Program received signal SIGTRAP, Trace/breakpoint trap.
0x1fffecec in ?? ()
Run Code Online (Sandbox Code Playgroud)

临时断点是程序开始的地方,然后我可以从那里运行。或者单步执行,结果都是一样的。

控制台输出:

Waiting for debugger connection...
Debugger connected
      -------------------------------------------------------------------
                        STM32CubeProgrammer v2.4.0                  
      -------------------------------------------------------------------

ST-LINK SN  : 34FF6E065250343816210143
ST-LINK …
Run Code Online (Sandbox Code Playgroud)

c microcontroller stm32f0 stm32cubeide

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