SSブログ

STM32CubeMXに関する事 1 デバッグできん! [STM32F]

さて、STマイクロのSTM32Fシリーズでは、従来はSPLライブラリが提供されてたのですが、最近リリースされるマイコンにはSPLライブラリは提供されず、代わりにSTM32CubeMXと言うコードジェネレータを使え!となっているので、しょうがないので触り始めて嵌っています、、、orz

今回の問題は、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レジスタの説明にはこの様に書かれています。
stm32cubemx_001.png


なので、読み出しても正確な値ではない!

じっさいのところこのマクロを処理するとデバッグできなくなるので、逆アセンブルしてレジスタを追ってみると
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でコードを生成する度にこの対策が消されてしまうのでは?と思っています、、、ハァ。

nice!(0)  コメント(0) 

nice! 0

コメント 0

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。