标签: stm32

为什么入口点地址是0x800107d,但第一条指令开始于0x800107c

使用arm-none-eabi-readelf -h ideself.elf可以找到:

Entry point address:               0x800107d
Run Code Online (Sandbox Code Playgroud)

使用arm-none-eabi-objdump -D ideself.elf可以找到:

0800107c <Reset_Handler>:                       
 800107c:   f8df d034   ldr.w   sp, [pc, #52]   ; 80010b4 <LoopForever+0x2>
 8001080:......................................................
Run Code Online (Sandbox Code Playgroud)

为什么启动reset_handler不等于0x800107d而不是0x800107c

0x800107c 中的字节不执行?执行 3/4 四字节指令 ?

embedded arm gnu stm32 cortex-m

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

STM32F3 I2C读取数据

我正在使用STM32F373微控制器并编写了一个简单的函数来从总线i2c 1(PB7 PB6)上的MPU6050陀螺仪+加速器读取数据.问题是,当我尝试读取传感器寄存器数据时 - 标志I2C_ISR_TXIS总是等于RESET(未设置).为什么会这样?

这是有问题的源代码.

void i2c1_init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  I2C_InitTypeDef  I2C_InitStructure;

  RCC_I2CCLKConfig(RCC_I2C1CLK_SYSCLK);  

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);  
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);

  GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_4);
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_4);

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
  GPIO_Init(GPIOB, &GPIO_InitStructure);

  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_7;
  GPIO_Init(GPIOB, &GPIO_InitStructure);

  I2C_DeInit(I2C1);
  I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;  
  I2C_InitStructure.I2C_AnalogFilter = I2C_AnalogFilter_Enable;
  I2C_InitStructure.I2C_DigitalFilter = 0x00;
  I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
  I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
  I2C_InitStructure.I2C_Timing = 0xC062121F; 

  I2C_Init(I2C1, &I2C_InitStructure);  
  I2C_Cmd(I2C1, ENABLE);
}

uint8_t i2c_read(uint8_t DeviceAddr, uint8_t RegAddr, uint8_t* pBuffer, uint16_t len)
{ …
Run Code Online (Sandbox Code Playgroud)

embedded stm32 i2c stm32f4discovery

0
推荐指数
1
解决办法
7152
查看次数

stm32f4中的写周期很少

我正在使用STM32F401VCT6U"发现"板,我需要为用户提供一种在运行时在内存中写入地址的方法.

我写了可以简化为以下功能的内容:

uint8_t Write(uint32_t address, uint8_t* values, uint8_t count) 
{
    uint8_t index;
    for (index = 0; index < count; ++index) {
        if (IS_FLASH_ADDRESS(address+index)) {
            /* flash write */
            FLASH_Unlock();
            if (FLASH_ProgramByte(address+index, values[index]) != FLASH_COMPLETE) {
                  return FLASH_ERROR;
            }
            FLASH_Lock();
        } else {
            /* ram write */
            ((uint8_t*)address)[index] = values[index]
        }
    }
    return NO_ERROR;
}
Run Code Online (Sandbox Code Playgroud)

在上面,address是基址,values是一个至少大小的缓冲区,count它包含要写入内存count的字节和要写入的字节数.

现在,我的问题如下:当address在flash中使用base调用上述函数时count=100,它在前几次正常工作,将传递的values缓冲区写入flash.然而,在那些前几次调用之后,我不能再写任何值了:我只能复位flash中的值中的位,例如,尝试将0xFF写入0x7F将在闪存中留下0x7F,而将0xFE写入0x7F将留下0x7E,并且任何值的0x00都将成功(但之后其他任何值都不会写入该地址).

我仍然可以通过改变基数来正常写入闪存中的其他地址address,但是再次只能写几次(两次或三次调用count=100).

此行为表明已达到闪存的最大写入次数,但我无法想象它会如此之快.在用尽之前,我预计至少有10,000次写入.那么我做错了什么?

stm32 flash-memory stm32f4discovery

0
推荐指数
1
解决办法
3690
查看次数

原始c ++内存逻辑的奇怪行为

在带有stm32(arm cortex)CPU的IAR IDE中,我在原始情况下有非常奇怪的行为.

uint32_t s = 6654; //=0x000019FE
//next I'll see in IAR debugger

uint8_t res1 = 0;
res1 = (s&0xFF000000)>>24;  //see in debugger: res1=00
res1 = (s&0x00FF0000)>>16;  //res1=00
res1 = (s&0x0000FF00)>>8;   //res1=19
res1 = (s&0x000000FF);      //res1=FE

void *sp = &s;
uint8_t res2 = 0;
res2 = *((uint8_t*)sp+0);   //res2=FE            but must be 00!
res2 = *((uint8_t*)sp+1);   //res2=19            but must be 00!
res2 = *((uint8_t*)sp+2);   //res2=00            but must be 19!
res2 = *((uint8_t*)sp+3);   //res2=00            but must be FE!
Run Code Online (Sandbox Code Playgroud)

(请参阅我期望的评论,以及会发生什么.)为什么我得到这个结果?我没有解释.

c++ memory stm32 iar

0
推荐指数
1
解决办法
88
查看次数

人们为什么不仅仅使用微控制器中的最大可用时钟

这个话题很简单,我承认我在Google上找不到很多东西。

最近,我开始在STM32上进行编码,对于一个来自与PC相关的应用程序的人来说,设置所有时钟都是相当新的。

我想知道为什么开发人员会想放弃/避免最大时钟,在哪种情况下?假设微控制器可以在168Mhz上工作,为什么我应该选择84Mhz?

它主要与功耗有关吗?还有其他原因吗?

为什么STM32团队(以及我猜想也是微芯片)要在STM32CubeMX上设置一个非常好的UI来选择不同的组合而麻烦?如果我可以达到更高的工作频率,为什么我应该直接使用外部振荡器而不是PLL路径?

microcontroller clock stm32

0
推荐指数
3
解决办法
828
查看次数

STM32获得稳定的PWM频率和占空比

我有F401RB核板Timer4配置了这些值 在此输入图像描述

PWM输出变化很大,频率在40kHz到41.67 kHz之间,占空比在50%到52%之间. 在此输入图像描述 有没有办法达到更好的稳定性

在适当尊重Sealese逻辑的情况下,LA是否在捕获实际输出方面滞后?

stm32 pwm

0
推荐指数
1
解决办法
1212
查看次数

尝试(和失败)写入STM32上的const是否安全?

所以,我们正在尝试一种方法来执行一些矩阵数学.这是嵌入式的,因此内存是有限的,我们将有大型矩阵,因此它可以帮助我们将其中的一些存储在闪存而不是RAM中.

我写了一个矩阵结构,两个数组(一个const/flash和另一个RAM),以及一个"修改"和"获取"功能.一个矩阵,我初始化为RAM数据,另一个矩阵我初始化为闪存数据,使用从const*f32到*f32的转换.

我发现当我在STM32嵌入式处理器上运行此代码时,RAM矩阵是可修改的,指向闪存数据的矩阵根本不会改变(设置为12.0不"取",值仍然2.0).

(在改变之前)a = 2,b = 2,(改变之后)c = 2,d = 12

这是可接受的行为,通过设计我们不会尝试修改闪存数据的矩阵,但如果我们犯了错误,我们不希望它崩溃.

但是,如果我使用Visual C++在我的Windows机器上运行相同的代码,当我尝试运行下面的代码时,当我尝试将const数组修改为12.0时,我得到"访问冲突".

Windows会反对这并不奇怪,但我想更好地理解行为上的差异.这似乎与CPU架构有关.在我们的STM32上,让代码尝试写入const数组并让它无效吗?或者是否有副作用或避免这种情况的理由?

static const f32 constarray[9] = {1,2,3,1,2,3,1,2,3};
static f32 ramarray[9] = {1,2,3,1,2,3,1,2,3};

typedef struct {
     u16 rows;
     u16 cols;
     f32 * mat;
} matrix_versatile;

void modify_versatile_matrix(matrix_versatile * m, uint16_t r, uint16_t c, double new_value)
{
    m->mat[r * m->cols + c] = new_value;    
}

double get_versatile_matrix_value(matrix_versatile * m, uint16_t r, uint16_t c)
{
    return m->mat[r * m->cols + c];
}

double a;
double b;
double c; …
Run Code Online (Sandbox Code Playgroud)

embedded stm32 visual-c++

0
推荐指数
1
解决办法
137
查看次数

STM32上的USART接收器

嗨,我目前正在从事USART通讯,试图从任何GPIO引脚发送和接收数据。

在接收时,我成功地以任何波特率传输数据,但我陷入了困境。

我一次可以收到一个角色。该引脚通过RX引脚设置为外部下降沿中断。

但是,当我从终端向控制器传输“ test”之类的字符串时,仅收到“ t”,其余3个字符为垃圾值。我以为收到第一个字符并将其保存后,中断对于下一个字符的触发速度不会那么快。

在此示例代码中,出于测试目的,许多事情都进行了硬编码。

这里是接收器的示例代码

void EXTI0_IRQHandler(void){
r0 = GPIOA->IDR;
delay_us(delay_time);
r1 = GPIOA->IDR;
delay_us(delay_time);
r2 = GPIOA->IDR;
delay_us(delay_time);
r3 = GPIOA->IDR;
delay_us(delay_time);
r4 = GPIOA->IDR;
delay_us(delay_time);
r5 = GPIOA->IDR;
delay_us(delay_time);
r6 = GPIOA->IDR;
delay_us(delay_time);
r7 = GPIOA->IDR;
delay_us(delay_time);
r8 = GPIOA->IDR;
delay_us(delay_time);
r9 = GPIOA->IDR;
delay_us(delay_time);
r1 = r1 & 0x00000001;
r2 = r2 & 0x00000001;
r3 = r3 & 0x00000001;
r4 = r4 & 0x00000001;
r5 = r5 & 0x00000001;
r6 = r6 & 0x00000001; …
Run Code Online (Sandbox Code Playgroud)

c embedded stm32 usart

0
推荐指数
1
解决办法
510
查看次数

为什么我的中断会被调用,但不会进入处理程序?

我正在尝试以中断模式接收来自USART的通信。调试器向我展示了在按键时调用了中断,但是执行陷入了向量表定义。

我用以下命令初始化我的art。

static void MX_USART2_UART_Init(void)
{
  huart2.Instance = USART2;
  huart2.Init.BaudRate = 19200;
  huart2.Init.WordLength = UART_WORDLENGTH_8B;
  huart2.Init.StopBits = UART_STOPBITS_1;
  huart2.Init.Parity = UART_PARITY_NONE;
  huart2.Init.Mode = UART_MODE_TX_RX;
  huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart2.Init.OverSampling = UART_OVERSAMPLING_16;
  if (HAL_UART_Init(&huart2) != HAL_OK)
  {
    Error_Handler();
  }

  /* USER CODE END USART2_Init 2 */
  LED_Initialize();
  USART2->CR1=USART_CR1_RE|USART_CR1_TE|USART_CR1_UE|USART_CR1_RXNEIE; // Enable interrupt
  NVIC_SetPriority(USART2_IRQn, 2); // set priority level
  NVIC_EnableIRQ(USART2_IRQn); // Enable in NVIC
}


void USART2_IRQHandler(void)
{
    blink_led();
}
Run Code Online (Sandbox Code Playgroud)

如果我以调试模式运行该应用程序,按下一个键,然后停止并逐步执行代码,我发现它在包含的startup_stm32f446xx.s内部的分支指令上循环。

USART2_IRQHandler
        B USART2_IRQHandler
        PUBWEAK USART3_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)
Run Code Online (Sandbox Code Playgroud)

因此,我知道该中断正在生成,但似乎找不到我的处理程序。即使不在调试模式下,我的LED也不会闪烁,这是我已经单独测试的功能。我不确定此问题是否来自HAL库。我通读了他们的文档及其NVIC启用说明的变体,以得到相同的结果。usart在轮询中工作正常,但我需要中断其功能。

c++ interrupt stm32

0
推荐指数
1
解决办法
80
查看次数

C(嵌入):在评论FreeRTOS的RootTask时,代码大小不会缩小

我的FreeRTOS构造中有一个树形的流程/任务架构。main()只需创建一个RootTask(在初始化HAL之后),即可创建另外两个任务,依此类推。

我目前正在与Flash大小(基本上是代码+常量?)战斗,因此禁用任务(=对它们进行注释),以便向编译器显示甚至不需要大多数翻译单元,从而找出哪些模块最昂贵。

但是,我已经对main()提出了自己的看法,并取出了while(1)循环以外的所有内容。它仍然不适合128k Flash。尝试删除所有C ++转换单元,甚至使用gcc进行链接;但是仍然有大约100k个“ .text”部分(考虑到应用程序不执行任何操作,此时我可以选择10k)。

我正在使用arm-none-eabi-gcc / g ++ 5.4.1。链接描述文件由ST-CubeMX生成。

gcc标志: -mcpu=cortex-m0 -mthumb -Os -s -Wall -Wa -a -ad -alms=build/$(notdir $(<:.c=.lst))

链接器标志:( -mcpu=cortex-m0 -specs=nosys.specs -T$(LDSCRIPT) [some-libraries] -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref -Wl,--gc-sections,--undefined=uxTopUsedPriority,-flto 也由CubeMX生成,但-flto除外)

有人可以解释为什么编译器/链接器没有从最终二进制文件中删除未使用的代码吗?是否有进一步调查的工具?

请让我知道是否需要更多信息。

谢谢!

c c++ embedded stm32 freertos

0
推荐指数
1
解决办法
56
查看次数