我正在使用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) 我在低功耗运行模式下从RAM 运行了 c代码(因此中断没有处理).此模式由代码序列启用:
所以在勘误表中描述的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指令执行后它将发生:
我使用手册PM0044,在第26页它内容漂亮的表:
有两种情况,代码执行在3个周期停止.所以我不确定在BTJT和WFE指令之间不会发生异步唤醒事件.
有没有办法确保严格的逻辑顺序(检查条件> wfe>唤醒事件)?
我想使用最新的HAL库而不是标准外设库.
我想读出BMA250E G传感器的chip_id,但它不起作用.
aRxBuffer的值始终保持为0x00.但它应该是0xf9!
我的代码有什么问题?
Run Code Online (Sandbox Code Playgroud)?#?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()
?#?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) 我编写了简单的示例代码(也可以在 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)