标签: stm32

访问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万
查看次数

stm32 printf float变量

我想通过usart从stm32f405注销.在我的syscall.c文件中,我实现了通过usart打印的功能:

int _write(int file, char *ptr, int len)
{
    int todo;
    for (todo = 0; todo < len; todo++)
    {
    usart_send_char( *ptr++ );
    }
    return len;
}
Run Code Online (Sandbox Code Playgroud)

功能usart_send_char( *ptr++ );按预期工作.但是当我打电话时:

printf("%s, %d, %3.2f\r\n", "asd", 777, 13.2 );
Run Code Online (Sandbox Code Playgroud)

我得到: asd, 777, 0.00 浮动变量未正确打印.

Makefile文件:

PROCESSOR = -mcpu=cortex-m4 -mthumb -mfloat-abi=softfp -mfpu=fpv4-sp-d16
CFLAGS += $(PROCESSOR) $(INCLUDES) $(STFLAGS) -Wall -fno-strict-aliasing $(C_PROFILE)
LDFLAGS = $(PROCESSOR) -Wl,-Map=$(PROG).map,--cref,--gc-sections
Run Code Online (Sandbox Code Playgroud)

二手compilator:

Sourcery CodeBench Lite 2014.05-28
Run Code Online (Sandbox Code Playgroud)

哪里弄错了?

printf stm32

4
推荐指数
3
解决办法
9703
查看次数

STM32F4 - 我可以在中断例程中使用延迟吗?

我正在为一个项目使用 STM32F4 探索板,我想知道我是否正确地解决了这个问题。当我按下一个按钮时,会触发一个运行例程的外部中断;不使用延迟,这部分工作正常。当例程移动伺服器然后将其返回到其原始位置时,会添加一个延迟,以允许伺服器在返回到原始位置之前赶上新的 PWM 输出。当我运行带有延迟的新中断例程时,电路板锁定。在调试中,代码似乎在延迟循环中停滞。

延迟是一个简单的 sysstick 例程。把它放在我的中断中是不好的做法(因此是我崩溃的原因),我应该使用不同的方法吗?例如,在外部中断程序中设置一个一次性定时器,在设定的时间后返回伺服?

谢谢!

c arm stm32 stm32f4discovery

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

如何通过串口闪存STM32

我有一个STM32F102微控制器,我想通过串口编程.

虽然有一个可用于Windows的闪存,但我想在Linux机器上进行.我尝试用这个脚本来做

我已设置BOOT0 = 1且BOOT1 = 0,重启微控制器.但它不起作用.我得到以下输出

Can't init. Ensure BOOT0=1, BOOT1=0, and reset device
Traceback (most recent call last):
  File "stm32loader.py", line 552, in <module>
    bootversion = cmd.cmdGet()
  File "stm32loader.py", line 140, in cmdGet
    if self.cmdGeneric(0x00):
  File "stm32loader.py", line 137, in cmdGeneric
    return self._wait_for_ack(hex(cmd))
  File "stm32loader.py", line 88, in _wait_for_ack
    raise CmdException("No response to %s" % info)
__main__.CmdException: No response to 0x0
Run Code Online (Sandbox Code Playgroud)

linux embedded microcontroller stm32

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

无法通过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
查看次数

使用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
查看次数

STM32 USB CDC 的最大速度是多少?

我正在使用 stm32L151 通过 USB CDC 与 PC 通信。我使用 stm32 HAL 库来创建我的项目。我发现 USB 以 1ms 的间隔发送数据,每次发送 64 个字节。那么,USB CDC 的最大速度是 64kbyte/s 吗?而且这个速度远低于USB全速12Mbit/s。我怎样才能达到这个速度?或者至少是这个速度的一小部分?谢谢

usb cdc stm32

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

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 ×10

c ×4

arm ×2

stm32f4discovery ×2

adc ×1

c++ ×1

cdc ×1

dma ×1

embedded ×1

gcc ×1

hal ×1

i2c ×1

iar ×1

interrupt ×1

linux ×1

microcontroller ×1

printf ×1

serial-port ×1

stm32-hal ×1

stm32f0 ×1

uart ×1

usart ×1

usb ×1