STM32CubeMXに関する事 1 デバッグできん! [STM32F]
さて、STマイクロのSTM32Fシリーズでは、従来はSPLライブラリが提供されてたのですが、最近リリースされるマイコンにはSPLライブラリは提供されず、代わりにSTM32CubeMXと言うコードジェネレータを使え!となっているので、しょうがないので触り始めて嵌っています、、、orz
今回の問題は、STM32CubeMXが出力するREMAPに関するマクロです。
ターゲットはSTM32F103VETです。
嵌ったのはI2Cを有効にするとデバッガーが暴走する!ってものでした。
くだんのマクロ集の抜粋です。( stm32f1xx_hal_gpio_ex.h )
SET BITは以下 ( stm32f1xx.h )
つまりRead Modify Writeをします。
ところがSTM32F103のREMAPを制御しているMAPRレジスタの説明にはこの様に書かれています。
なので、読み出しても正確な値ではない!
じっさいのところこのマクロを処理するとデバッグできなくなるので、逆アセンブルしてレジスタを追ってみると
100: JTAG-DP Disabled and SW-DP Disabled
が入ってきてしまいます。これでは動きませんよね、、、
対策はREMAPを行っているところでは必ず後ろに
__HAL_AFIO_REMAP_SWJ_NOJTAG();
などのデバッガを有効にするマクロを追加する?
( stm32f1xx_hal_msp.c )
しかしCubeMXでコードを生成する度にこの対策が消されてしまうのでは?と思っています、、、ハァ。
今回の問題は、STM32CubeMXが出力するREMAPに関するマクロです。
ターゲットはSTM32F103VETです。
嵌ったのはI2Cを有効にするとデバッガーが暴走する!ってものでした。
くだんのマクロ集の抜粋です。( stm32f1xx_hal_gpio_ex.h )
/** * @brief Enable the remapping of I2C1 alternate function SCL and SDA. * @note ENABLE: Remap (SCL/PB8, SDA/PB9) * @retval None */ #define __HAL_AFIO_REMAP_I2C1_ENABLE() SET_BIT(AFIO->MAPR, AFIO_MAPR_I2C1_REMAP)
SET BITは以下 ( stm32f1xx.h )
/** @addtogroup Exported_macros * @{ */ #define SET_BIT(REG, BIT) ((REG) |= (BIT)) #define CLEAR_BIT(REG, BIT) ((REG) &= ~(BIT)) #define READ_BIT(REG, BIT) ((REG) & (BIT)) #define CLEAR_REG(REG) ((REG) = (0x0)) #define WRITE_REG(REG, VAL) ((REG) = (VAL)) #define READ_REG(REG) ((REG)) #define MODIFY_REG(REG, CLEARMASK, SETMASK) WRITE_REG((REG), (((READ_REG(REG)) & (~(CLEARMASK))) | (SETMASK))) #define POSITION_VAL(VAL) (__CLZ(__RBIT(VAL)))
つまりRead Modify Writeをします。
ところがSTM32F103のREMAPを制御しているMAPRレジスタの説明にはこの様に書かれています。
なので、読み出しても正確な値ではない!
じっさいのところこのマクロを処理するとデバッグできなくなるので、逆アセンブルしてレジスタを追ってみると
100: JTAG-DP Disabled and SW-DP Disabled
が入ってきてしまいます。これでは動きませんよね、、、
対策はREMAPを行っているところでは必ず後ろに
__HAL_AFIO_REMAP_SWJ_NOJTAG();
などのデバッガを有効にするマクロを追加する?
( stm32f1xx_hal_msp.c )
void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c) { GPIO_InitTypeDef GPIO_InitStruct; if(hi2c->Instance==I2C1) { /* USER CODE BEGIN I2C1_MspInit 0 */ /* USER CODE END I2C1_MspInit 0 */ /**I2C1 GPIO Configuration PB8 ------> I2C1_SCL PB9 ------> I2C1_SDA */ GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9; GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); //__HAL_AFIO_REMAP_I2C1_ENABLE(); // <------ 訂正:コメントアウト // __HAL_AFIO_REMAP_SWJ_NOJTAG(); // <------ 訂正:コメントアウト /* Peripheral clock enable */ __HAL_RCC_I2C1_CLK_ENABLE(); /* USER CODE BEGIN I2C1_MspInit 1 */ uint32_t mapr = AFIO->MAPR; // <------ 訂正:マクロをやめて直接レジスタを操作 mapr &= ~(7UL << 24); mapr |= (2UL << 24); mapr |= (1UL << 1); AFIO->MAPR = mapr; /* USER CODE END I2C1_MspInit 1 */ } }
しかしCubeMXでコードを生成する度にこの対策が消されてしまうのでは?と思っています、、、ハァ。
2017-08-22 13:30
nice!(0)
コメント(0)
コメント 0