标签: stm32

STM32F411:是否真的需要清除外部中断标志?

我已经购买了STM32F411核板,现在我正在尝试了解HAL的各种零碎.从外部中断开始似乎是一个好主意,因为电路板有一个连接到PC13的按钮.所以我设置了一个简单的切换频率闪烁.下面的代码有点简化:

#define LED_PIN GPIO_PIN_5
#define BTN_PIN GPIO_PIN_13

static uint32_t blink_period = 250;

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

  __GPIOA_CLK_ENABLE();
  GPIO_InitTypeDef pinConfig;
  pinConfig.Pin = (LED_PIN);
  pinConfig.Pull = GPIO_NOPULL;
  pinConfig.Mode = GPIO_MODE_OUTPUT_PP;
  pinConfig.Speed = GPIO_SPEED_FAST;
  HAL_GPIO_Init(GPIOA, &pinConfig);

  __GPIOC_CLK_ENABLE();
  pinConfig.Pin = (BTN_PIN);
  pinConfig.Pull = GPIO_NOPULL;
  pinConfig.Mode = GPIO_MODE_IT_FALLING;
  pinConfig.Speed = GPIO_SPEED_LOW;
  HAL_GPIO_Init(GPIOC, &pinConfig);
  HAL_NVIC_SetPriority(EXTI15_10_IRQn, 0x0F, 0x00);
  HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);

  while (1)
  {
    HAL_GPIO_TogglePin(GPIOA, LED_PIN);
    HAL_Delay(blink_period);
  }
}

void EXTI15_10_IRQHandler(void)
{
  HAL_GPIO_EXTI_IRQHandler(BTN_PIN);
}

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
  if(GPIO_Pin == BTN_PIN)
  {
    if (blink_period == 500)
    {
      blink_period …
Run Code Online (Sandbox Code Playgroud)

interrupt stm32 interrupt-handling

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

Ubuntu:在为STM32(Cortex-M3)进行交叉编译时使用什么gcc?

我正在尝试开始使用STM32(Cortex-M3),我的计划是从Ubuntu(9.04/AMD64)开始使用它.

首先,我得到了Olimex stm32-h103标题板和Olimex ARM-USB-OCD jtag,并且我可能会使用OpenOCD,gcc和Eclipse.

但是现在我正在研究使用什么版本的gcc以及如何设置它以便能够交叉编译代码.

似乎有一些手臂项目,但我不知道从什么开始,有人可以推动我朝着正确的方向前进吗?

谢谢约翰


更新:似乎几乎是什么,我想从CodeSourcery的,但他们似乎把重点放在IA32和AMD64没有.

但是在支持的设备中,我找到了Cortex-M3

  • ARM EABI,ARM M-profile Simulator -mcpu = cortex-m3 -mthumb

更新:有可能在AMD64上安装IA32,因此标记的答案可能已经过时了.

更新:找到有关Cortex-M3的交叉编译的链接.

ubuntu gcc arm cortex-m3 stm32

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

删除未使用的模板实例化的静态成员

我目前在STM32平台上参与嵌入式C++开发.我们的团队正在评估模板的使用,以便为各种低级硬件设备参数化驱动程序.

所有有效的模板特化都是事先已知的,因此我们可以在实现文件中明确地给出所有有效的特化(实现和声明分离).事实上,对我们来说,显式专业化非常有用,因为它有助于记录可行的参数集.

// file i2c_dev.h

template<typename traits>
struct i2c_dev
{
public:
   static void init();
   static void send();
   static bool busy();
   ...
private:
   static i2c_transfer periodic_transfer; // class with used-defined constructor
};

// traits class for configuration A
struct i2c_dev_traitsA
{
   enum 
   { 
       I2Cx_BASE    = I2C1_BASE
     , PORTx_BASE   = GPIOB_BASE
     , PORTx_PIN_TX = PB08
     , PORTx_PIN_RX = PB09
   };
};

// traits class for configuration B, different I2C peripherial and pinout
struct i2c_dev_traitsB
{
   enum 
   { 
       I2Cx_BASE    = I2C2_BASE
     , PORTx_BASE …
Run Code Online (Sandbox Code Playgroud)

c++ embedded templates stm32

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

i2c中断处理程序stm32

我有一些I2C2中断的问题,我启用了中断,但处理程序中断从不执行.

这是i2c2的初始化:

void i2c2InitSlave(void)
{
    I2C_DeInit(I2C2);
    GPIO_InitTypeDef GPIO_InitStructure;
    I2C_InitTypeDef I2C_InitStructure;

    /*I2C2 Peripheral clock enable */
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2, ENABLE);

    /* Enable GPIO clock */
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOH, ENABLE);

    // I2C2 SCL and SDA Pin configuration
    GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOH, &GPIO_InitStructure);

    GPIO_PinAFConfig(GPIOH, GPIO_PinSource4, GPIO_AF_I2C2);
        GPIO_PinAFConfig(GPIOH, GPIO_PinSource5, GPIO_AF_I2C2);

    /* Initialize I2C peripheral */
    /* I2C Init */
    I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
    I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
    I2C_InitStructure.I2C_OwnAddress1 = SLAVE_ADDRESS;
    I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
    I2C_InitStructure.I2C_ClockSpeed = 100000; …
Run Code Online (Sandbox Code Playgroud)

stm32 i2c

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

STM32F030启动时出现严重错误,__ libc_init_array

我正在尝试使用arm-none-eabi-gcc和Makefile编译STM32Cube项目.我已经指定:

CFLAGS = -mthumb\
         -march=armv6-m\
         -mlittle-endian\
         -mcpu=cortex-m0\
         -ffunction-sections\
         -fdata-sections\
         -MMD\
         -std=c99\
         -Wall\
         -g\
         -D$(PART)\
         -c
Run Code Online (Sandbox Code Playgroud)

和:

LDFLAGS = -Wl,--gc-sections\
          -Wl,-T$(LDFILE)\
          -Wl,-v
Run Code Online (Sandbox Code Playgroud)

FW构建没有问题.但是当我启动MCU时,我陷入了Hard Fault.堆栈跟踪是:

#0  HardFault_Handler () at ./Src/main.c:156
#1  <signal handler called>
#2  0x0800221c in ____libc_init_array_from_thumb ()
#3  0x080021be in LoopFillZerobss () at Src/startup_stm32f030x8.s:103
#4  0x080021be in LoopFillZerobss () at Src/startup_stm32f030x8.s:103
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
Run Code Online (Sandbox Code Playgroud)

当我踩到bl __libc_init_array启动文件时,我会直接进入Hard Fault .

/* Zero fill the bss segment. */
FillZerobss:
  movs r3, #0
  str  r3, …
Run Code Online (Sandbox Code Playgroud)

gcc arm stm32 cortex-m

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

原因 7 - 目标需要重置 - 不可靠的调试设置

我无法获得可靠的调试设置。我在网络上的一些论坛上看到过类似标题的其他主题,但情况似乎不同。

设置:

  • Linux (Xubuntu) 64 位
  • Eclipse CDT,霓虹灯 4.6.0
  • 来自eclipse“安装新软件”的“GDB硬件调试”插件,配置为重置&延迟3秒,暂停;加载符号(所有复选框,无自定义命令)
  • arm-none-eabi-gcc 4.8.3 工具链
  • OpenOCD,最近下载,在自己的控制台中运行,使用他们提供的脚本和 st-link 为我的确切 MCU 配置
  • STM32L476RG 带硬浮点的 MCU,使用。
  • ST-Link V2 调试器(独立)

现在,有一个序列,每次经过一番挣扎后,我都能够与调试器连接,但是单步执行和读取变量的工作并不那么可靠,以至于我暂时相信我所看到的。但是,即使到了调用堆栈不会充满明显的无意义条目并且只有很少的地方的地步,也是很累的。

例子:

  • 使用固件刷新设备。这通常没有问题。
  • 启动openocd。
  • 在 Eclipse 中开始调试。
  • OpenOcd 显示连接,然后说:“未定义的调试原因 7 - 目标需要重置”
  • 我无论如何按 Eclipse 中的“继续”按钮使程序运行通过它显示的虚假顶部堆栈帧。
  • 按“暂停”(在调用堆栈中仍然是假的),然后“终止”。
  • Ctrl+C 退出 OpenOcd。
  • 手动(硬件)重置 stm32 MCU。
  • 重新启动 OpenOcd。
  • 再次在 Eclipse 中开始调试。

OpenOCD 输出:

GNU ARM Eclipse 64 位开放式片上调试器 0.10.0-dev-00287-g85cec24-dirty (2016-01-10-10:31)
根据 GNU GPL v2 许可
有关错误报告,请阅读
    http://openocd.org/doc/doxygen/bugs.html
信息:自动选择第一个可用的会话传输“hla_swd”。要覆盖使用“传输选择”。
信息:选定的传输接管了低级目标控制。与普通 JTAG/SWD 相比,结果可能有所不同
适配器速度:500 kHz
适配器_nsrst_delay:100
没有分开
没有分开
信息:无法匹配请求的速度 500 kHz,使用 480 …

embedded gdb eclipse-cdt stm32 openocd

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

HAL_GetTick()是返回刻度还是毫秒?(以及如何以微秒为单位测量)

我是新手使用HAL功能.函数的描述HAL_GetTick()表明它" 以毫秒为单位提供刻度值".

我不明白这个函数是返回tick还是毫秒.当然,要从ticks转换为毫秒,我需要知道一毫秒内有多少刻度,并且它是CPU特定的.

HAL_GetTick()究竟又回归了什么?


编辑:

我真正的问题是知道如何以微秒为单位测量时间.所以我想从中获取滴答HAL_GetTick()并将它们转换为微秒.这在评论和至少其中一个答案中得到了解决,所以我在这里也提到了这个,我编辑了标题.

stm32

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

刷新 uC 时更新 STM32F4 上的 RTC

有没有办法在STM32F4上上传程序时用计算机信息更新RTC?例如,计算机上的日期和时间信息是:12h40 11/09/2018,当我用IAR/AC6刷新微控制器时,RTC被设置为这些信息?

stm32 iar

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

在 STM32 微控制器中禁用和重新启用中断以实现原子访问防护的各种方法有哪些?

通过“原子访问防护”或“中断防护”强制对与 ISR 共享的易失性变量进行原子访问的标准技术,特别是在没有操作系统的情况下运行裸机、单线程协作多任务应用程序时,如下所示:

// 1. save interrupt state
// 2. disable only the interrupts necessary

// You get atomic access to volatile variables shared with ISRs here,
// since ISRs are the only other "context" or running "thread" which
// might attempt to modify a shared memory block or variable.

// 3. restore interrupt state
Run Code Online (Sandbox Code Playgroud)

另请参阅我在这里详细描述的地方,包括最佳实践(在短时间内保持中断关闭)以及如何通过我的doAtomicRead()重复读取循环函数进行原子读取而不首先禁用中断:读取 64 位变量,即由 ISR 更新

我之前已经记录过如何对 AVR 微控制器/Arduino 执行此操作:How do I Forceatomity in Atmel AVR mcus/Arduino? …

c atomic interrupt stm32 isr

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

安装cargo-flash时如何解决“找不到系统库libudev”?

操作系统:Ubuntu

  • 命令1:rustup update-->成功
  • 命令2:rutstup target install thumbv7m-none-eabi-->成功
  • 命令3:cargo install cargo-flash
error: failed to run custom build command for `hidapi v1.4.2`
process didn't exit successfully: `/tmp/cargo-installgobLzf/release/build/hidapi-aad2646622c847a4/build-script-build` (exit status: 101)
error: could not find system library 'libudev' required by the 'hidapi' crate
error: failed to compile `cargo-flash v0.13.0`, intermediate artifacts can be found at `/tmp/cargo-installgobLzf`
Run Code Online (Sandbox Code Playgroud)

stm32 rust rust-cargo

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