标签: stm32

STM32 I2C1 SR1寄存器的起始位未置1

我正在尝试编程stm32与我的i2c EEprom交谈,但似乎每次我说:

I2C_GenerateSTART(I2C1, ENABLE);
while( !(I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)) );  the code hangs here
Run Code Online (Sandbox Code Playgroud)

我经历了调试器,我发现SR1位0标志(它是起始位生成标志)未设置,这就是代码挂起的原因.我可以在示波器中看到生成了起始位,这有时会起作用.当我试图连续写几次时,它通常会中断.我检查了硬件是否一切看起来很好我检查了我在i2c总线上运行的频率它在24lc1025 eeprom内是100Khz.

有任何想法吗,

谢谢

c embedded stm32 i2c

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

Cortex-M3初始化

我写了(IMO)几乎最简单的ARM应用程序,它没有工作:)什么可能是错的?错过了什么?

闪存写入和CPU复位后,寄存器中有垃圾.

请善待,如果你知道,请告诉我在STM32F1上运行最简单的应用程序需要做些什么.

也许是某人可以列举在申请开始前必须做的事情,即.

  1. 初始化堆栈(有必要吗?)
  2. 设置一些东西
  3. 设置别的东西.

应用程序:

@Directives
    .thumb                  @.code 16
    .syntax unified

.section .text
    .org 0                  @ Alters location of pointer - in this case set to zero

vectors:                    @ Define basic vectors for specific capabilities
    .word _start + 1        @ Set - start address and increment pointer
    .word _nmi_handler + 1  @ Below all other vectors will be declared:
    .word _hard_fault + 1
    .word _memory_fault + 1
    .word _bus_fault + 1
    .word _usage_fault + 1

_start:
    mov …
Run Code Online (Sandbox Code Playgroud)

assembly cortex-m3 stm32

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

补偿ARM中断的延迟?

我正在研究STM32F4 CPU上的一个项目,产生信号.

我在STM32上有CPU时钟(没有预分频器)的通用定时器,在溢出时触发中断,然后用GPIO产生周期信号.

我需要在非常精确的时间触发GPIO(基本上低至一个CPU周期精度).通过设置优先级等,我已设法将此抖动减少到+ -5个周期,但这种抖动存在,具体取决于CPU的工作情况.

我需要补偿这几个周期的抖动.只要我在精确的时间切换GPIO,添加几个周期的延迟就不是问题.

我的想法是读取计数器的当前值,并有一个FIXED_NUMBER-CURRENT_VALUE时间的活动循环,确保我将在精确的时间退出循环.

然而,在C中做一个简单的循环 - 一个FOR循环,或一个while(counter-> value <TARGET)不起作用,因为它ADDS抖动而不是减少它.

我做错了什么/天真吗?我应该在集会中这样做吗?怎么会与C不同(我检查了用GCC反汇编来检查循环没有被优化掉,也不是我打了内存?)

(我确保空的,非优化的但不打击内存循环体)

编辑:在AVR上看到这个例子(我知道的更稳定)请参见示例http://lucidscience.com/pro-vga%20video%20generator-7.aspx (搜索"jitter")

edit2:我在汇编中尝试了一个简单的循环,例如(r0是我的计数器,等待的循环次数,在寄存器中)

loop : SUBS r0,#1 ; tried with 2 also
       BGE loop
Run Code Online (Sandbox Code Playgroud)

而且,如果没有它,抖动会更好.

总结起来,我已经知道我应该拖延多少.我只需要一种方法让代码分支在一个案例中可靠地消耗N个循环而在另一个案例中可以消耗M. 不幸的是,单独的分支似乎不起作用,因为管道填充似乎不需要可靠的循环次数,并且条件表达式也不会因为它们总是采用相同数量的循环(有时无效).

从RAM而不是闪存运行会提高一致性吗?(NB stm32f4有一个flash预取..)

counter arm interrupt stm32 low-latency

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

访问STM32 dma目标位置

我想知道从dma写入数据的内存中读取是否安全?

我有一个带有adc设置的stm32F1,可以连续执行转换并使用dma将数据传输到ram缓冲区.我知道我可以使用adc中断安全地访问缓冲区,但是如何从非中断上下文访问缓冲区呢?如果我尝试从dma写的相同位置读取数据,数据是否会被破坏?

stm32 dma

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

STM32上的ADC单次转换

我正在研究STM32 F103x上的ADC编程,从最简单的情况开始 - 单次转换.测量内部温度传感器(连接到ADC1)的值,并使用USART将其发送到COM端口.目标似乎很清楚但是当我尝试将源代码下载到闪存时,它不会向COM端口发送任何数据.USART功能运行良好,我猜这些问题来自ADC配置部分,因为我正处于等待完全转换的循环中:

while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET); //Wail for conversion complete
Run Code Online (Sandbox Code Playgroud)

这是我到目前为止的源代码.

/* Includes ------------------------------------------------------------*/
#include "stm32f10x.h"
#include <stdio.h>

    uint16_t AD_value;
    const uint16_t V25 = 1750; //when V25=1.41V
    const uint16_t Avg_Slope = 5; //when avg_slc
    uint16_t TemperatureC;

//Define output device
PUTCHAR_PROTOTYPE
{
    USART_SendData(USART1, (uint8_t) ch);
    while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
    {}
    return ch;
}

void Usart1Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);

    /* COnfig PA9 for USART Tx as alternate function push-pull */
    GPIO_InitStructure.GPIO_Pin …
Run Code Online (Sandbox Code Playgroud)

c serial-port stm32 adc usart

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

为什么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万
查看次数

使用STM32处理器与SD卡通信 - SDIO协议

我正在使用基于微控制器STM32F401RET6的Nucleo F401Re板.我连接到主板上的Micro SD插槽,并有兴趣将数据写入SD卡并从中读取数据.我使用软件STM32CubeX生成代码,特别是带有内置函数的SD库.我试着编写一个简单的代码,将一个数组写入一个特定的数组,然后尝试读取相同的数据.代码如下:

  int main(void)
{
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* Configure the system clock */
  SystemClock_Config();

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART2_UART_Init();
  MX_SDIO_SD_Init();

  char buffer[14] = "Hello, world\n";
  uint32_t to_send[512] ; // Te
  uint32_t to_receive[512];
  uint64_t address = 150; 
  HAL_SD_WriteBlocks(&hsd, to_send, address, 512, 1);
  HAL_SD_ReadBlocks(&hsd, to_receive, address, 512, 1);


  while (1)
  {
      HAL_UART_Transmit(&huart2, (uint8_t *)buffer, 14, 1000);
      HAL_UART_Transmit(&huart2, (uint8_t *)to_receive, 512, 1000);

}
Run Code Online (Sandbox Code Playgroud)

代码在函数HAL_Init()的中间停止,我收到以下消息:

The stack pointer …
Run Code Online (Sandbox Code Playgroud)

c stm32 iar stm32f4discovery

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

C++常量关键字异常行为

我们正在为STM32F103 MCU开发.我们在ARM GCC工具链中使用裸机C++代码.经过几个小时的可疑表达,我们发现constant关键字触发了该表达式的不同结果.使用x86 GCC工具链测试同一段代码时,问题就不存在了.
我们使用STM的GPIOS进行调试.
这是完全重现问题的代码:

#include "stm32f10x.h"
#include "system_stm32f10x.h"

#include "stdlib.h"
#include "stdio.h"

  const unsigned short RTC_FREQ = 62500;
  unsigned short prescaler_1ms = RTC_FREQ/1000;

int main()
{

//********** Clock Init **********
   RCC->CFGR |= RCC_CFGR_ADCPRE_0 | RCC_CFGR_ADCPRE_1; // ADC prescaler
   RCC->APB2ENR |= RCC_APB2ENR_AFIOEN; // Alternate Function I/O clock enable
   RCC->APB2ENR |= RCC_APB2ENR_IOPCEN; // I/O port C clock enable
   RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; // I/O port A clock enable
   RCC->APB2ENR |= RCC_APB2ENR_ADC1EN; // ADC 1 interface clock enable
   RCC->APB1ENR |= …
Run Code Online (Sandbox Code Playgroud)

c++ gcc arm stm32

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

如何使用HAL锁定和解锁功能?为什么?

我正在尝试理解由另一个程序员编写的代码.它使用I²C通信在STM32微控制器的EEPROM上写入数据.

一般来说,我理解他的代码是如何工作的,但我无法理解他为什么使用HAL_LOCKHAL_UNCLOCK函数.

这些是这些方法的代码:

typedef enum
{
    HAL_UNLOCKED = 0x00U,
    HAL_LOCKED   = 0x01U
} HAL_LockTypeDef;


#if (USE_RTOS == 1)

    /* Reserved for future use */
    #error "USE_RTOS should be 0 in the current HAL release"

#else

  #define __HAL_LOCK(__HANDLE__)                 \
      do{                                        \
          if((__HANDLE__)->Lock == HAL_LOCKED)   \
          {                                      \
             return HAL_BUSY;                    \
          }                                      \
          else                                   \
          {                                      \
             (__HANDLE__)->Lock = HAL_LOCKED;    \
          }                                      \
      } while (0)


  #define __HAL_UNLOCK(__HANDLE__)              \
      do{                                       \
          (__HANDLE__)->Lock = HAL_UNLOCKED;    \
      } …
Run Code Online (Sandbox Code Playgroud)

c hal stm32 i2c

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

STM32 SPI慢速计算

我正在使用STM32F4及其SPI与本教程中的74HC595进行通信。区别在于初学者,为简单起见,我使用非DMA版本。我使用STMCubeMX配置SPI和GPIO

问题是:我没有获得锁存器PIN,我将其设置为PA8以在传输期间足够快地切换。

在此处输入图片说明

我正在使用的代码:

        spiTxBuf[0] = 0b00000010;

        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET);


        HAL_SPI_Transmit(&hspi1, spiTxBuf, 1, HAL_MAX_DELAY);
//        while(HAL_SPI_GetState(&hspi1) != HAL_SPI_STATE_READY);

        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET);

        HAL_Delay(1);
Run Code Online (Sandbox Code Playgroud)

我尝试过的事情:

  1. 将引脚PA8的最大输出速度设置为非常快 在此处输入图片说明

  2. 等待SPI完成(请参见上面的注释行)

  3. 如此处所示,将DMA用于SPI,这实际上使它变慢了。

我如何才能更快地切换?我应该在SPI完成后创建并中断并在那里设置锁存器吗?

embedded spi stm32

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

标签 统计

stm32 ×10

c ×4

arm ×2

embedded ×2

i2c ×2

interrupt ×2

adc ×1

assembly ×1

c++ ×1

cortex-m3 ×1

counter ×1

dma ×1

gcc ×1

hal ×1

iar ×1

low-latency ×1

serial-port ×1

spi ×1

stm32-hal ×1

stm32f0 ×1

stm32f4discovery ×1

uart ×1

usart ×1