小编imb*_*arr的帖子

STM32 CubeMX 自定义代码生成

我正在使用STM32CubeMX并尝试使用所用外围设备表生成自定义代码 (UM1718 第 141 页) 。在闪存中很容易拥有常量表,其中包含按预期用途分组的外围句柄和实例。例如这个头文件:

一些.h:

/* TIM table */
#define EM_TIM1     0       // index
#define EM_TIM6     1

#define TIM_CNT     2       // count

#define TIM_0_INST      TIM1        // table of instaces
#define TIM_1_INST      TIM6

extern TIM_HandleTypeDef htim1;     // table of handles
extern TIM_HandleTypeDef htim6;

#define TIM_0_HNDL      htim1       // table of handles
#define TIM_1_HNDL      htim6

struct tim_tab_s {
    TIM_TypeDef * inst;
    TIM_HandleTypeDef * hndl;
};

extern struct tim_tab_s const tim_tab[TIM_CNT];
Run Code Online (Sandbox Code Playgroud)

我已经使用此自定义模板生成:

一些_h.ftl:

[#ftl]
[#list configs as dt] …
Run Code Online (Sandbox Code Playgroud)

code-generation freemarker stm32

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

STM8 ASM安全地执行WFE

我在低功耗运行模式下从RAM 运行了 c代码(因此中断没有处理).此模式由代码序列启用:

  • 跳到RAM
  • SIM卡
  • 关闭内部闪光灯和电源调节器,切换到低速时钟源(LSE)
  • 在WFE模式下工作(低功耗等待模式)
  • 打开电源调节器和闪光灯,恢复时钟源
  • 轮缘
  • 跳到闪光灯

所以在勘误表中描述的WFE指令没有问题.这种结构的问题,可能是永远低功耗等待模式下 CPU锁定的原因:

while nbit(TIM1_SR1,CC3IF) asm("wfe");
Run Code Online (Sandbox Code Playgroud)

这是拆卸为:

000035    720252B602     BTJT      TIM1_SR1, #1, 0xB6
00003A    728F           WFE
Run Code Online (Sandbox Code Playgroud)

来自定时器的事件具有概率性质,并且此代码不保证在WFE指令执行后它将发生:

  • BTJT指令在2个周期内完成,长度为5;
  • 从RAM执行的代码可能不连续,因为"fetch"状态会在几个周期内暂停执行

我使用手册PM0044,在第26页它内容漂亮的表:

RAM中的示例代码执行

有两种情况,代码执行在3个周期停止.所以我不确定在BTJT和WFE指令之间不会发生异步唤醒事件.

有没有办法确保严格的逻辑顺序(检查条件> wfe>唤醒事件)?

c embedded assembly stm8

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

如何使用STM32CUBEF4 HAL库通过i2c读取传感器数据?

我想使用最新的HAL库而不是标准外设库.

我想读出BMA250E G传感器的chip_id,但它不起作用.

aRxBuffer的值始终保持为0x00.但它应该是0xf9!

我的代码有什么问题?

?#?include? "stm32f4xx_hal.h" 

#define I2Cx_SDA_GPIO_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE()
#define I2Cx_SDA_PIN GPIO_PIN_9
#define I2Cx_SDA_GPIO_PORT GPIOB
#define I2Cx_SDA_AF GPIO_AF4_I2C1

#define I2Cx_SCL_GPIO_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE()
#define I2Cx_SCL_PIN GPIO_PIN_6
#define I2Cx_SCL_GPIO_PORT GPIOB
#define I2Cx_SCL_AF GPIO_AF4_I2C1

#define I2Cx_CLK_ENABLE() __HAL_RCC_I2C1_CLK_ENABLE()
#define I2Cx_FORCE_RESET() __HAL_RCC_I2C1_FORCE_RESET()
#define I2Cx_RELEASE_RESET() __HAL_RCC_I2C1_RELEASE_RESET() 
Run Code Online (Sandbox Code Playgroud)
?#?define? I2C_ADDRESS 0x18 

static void SystemClock_Config(void); 

uint8_t aTxBuffer[2],aRxBuffer; 

int main()
{ 
    HAL_Init(); 
    SystemClock_Config(); 
    I2C_HandleTypeDef I2cHandle;

    I2cHandle.Instance = I2C1;
    I2cHandle.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
    I2cHandle.Init.ClockSpeed = 400000;
    I2cHandle.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; 
    I2cHandle.Init.DutyCycle = I2C_DUTYCYCLE_16_9;
    I2cHandle.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; 
    I2cHandle.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
    I2cHandle.Init.OwnAddress1 = 0; 
    I2cHandle.Init.OwnAddress2 …
Run Code Online (Sandbox Code Playgroud)

stm32 i2c stm32f4

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

c 中的 sizeof 初始化常量

我编写了简单的示例代码(也可以在 ideone 上找到)来显示我发现问题的地方。Sizeof 在常量的情况下返回错误的结果s。波纹管是文件main.c

#include <stdint.h>
#include <stdio.h>

// comment this option if you know what is UB and want to avoit it 
#define I_DONT_KNOW_WHAT_IS_UB ( 1 )

struct _sa {
    uint32_t w;
    uint8_t const a[];
};

uint8_t const a[] = { 7,6,5,4,3,2,1,0 };

struct _sa const s = {
    .w = 8,
    .a = { 7,6,5,4,3,2,1,0 },
};

char const b[] = "line";

int main(void)
{
    #ifdef I_DONT_KNOW_WHAT_IS_UB
    printf("sizeof(a) = %d \n", (int)sizeof(a)); …
Run Code Online (Sandbox Code Playgroud)

c sizeof

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

标签 统计

c ×2

stm32 ×2

assembly ×1

code-generation ×1

embedded ×1

freemarker ×1

i2c ×1

sizeof ×1

stm32f4 ×1

stm8 ×1