モノリシックプログラミング常用ビット演算


ビット定義-STM 32 ST公式ライブラリ参照
#define GPIO_PIN_0                 ((uint16_t)0x0001)  /* Pin 0 selected    */
#define GPIO_PIN_1                 ((uint16_t)0x0002)  /* Pin 1 selected    */
#define GPIO_PIN_2                 ((uint16_t)0x0004)  /* Pin 2 selected    */
#define GPIO_PIN_3                 ((uint16_t)0x0008)  /* Pin 3 selected    */
#define GPIO_PIN_4                 ((uint16_t)0x0010)  /* Pin 4 selected    */
#define GPIO_PIN_5                 ((uint16_t)0x0020)  /* Pin 5 selected    */
#define GPIO_PIN_6                 ((uint16_t)0x0040)  /* Pin 6 selected    */
#define GPIO_PIN_7                 ((uint16_t)0x0080)  /* Pin 7 selected    */
#define GPIO_PIN_8                 ((uint16_t)0x0100)  /* Pin 8 selected    */
#define GPIO_PIN_9                 ((uint16_t)0x0200)  /* Pin 9 selected    */
#define GPIO_PIN_10                ((uint16_t)0x0400)  /* Pin 10 selected   */
#define GPIO_PIN_11                ((uint16_t)0x0800)  /* Pin 11 selected   */
#define GPIO_PIN_12                ((uint16_t)0x1000)  /* Pin 12 selected   */
#define GPIO_PIN_13                ((uint16_t)0x2000)  /* Pin 13 selected   */
#define GPIO_PIN_14                ((uint16_t)0x4000)  /* Pin 14 selected   */
#define GPIO_PIN_15                ((uint16_t)0x8000)  /* Pin 15 selected   */
#define GPIO_PIN_All               ((uint16_t)0xFFFF)  /* All pins selected */

またはTI MSP 430のようなBIT 0 BIT 1を使用して名前を付ける
入力から1人または数人を取り出す
    oDat = iDat & GPIO_PIN_0
    oDat = iDat & (GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3)
    oDat = iDat & 0x0f

セット1(この3つの態様の利点は、左側のデータのみが右側のブートデータbitが1のビットに影響を受け、他のビットには影響を受けないことである)
    Dat |= 0x0f

0にする
    Dat &= ~0x0f

に逆らう
    Dat ^= 0x0f

モノリシックマシンの非連続ビットIO入力を連続Byteビットに変換する(入力データが連続するIO領域に接続できない場合がある)
    int dat1=GPIOD->IDR;
    int dat2=GPIOB->IDR;

    int oDat = 0;

    if(dat1 & GPIO_PIN_2) oDat |= GPIO_PIN_0;
    if(dat1 & GPIO_PIN_4) oDat |= GPIO_PIN_1;
    if(dat1 & GPIO_PIN_5) oDat |= GPIO_PIN_2;
    if(dat1 & GPIO_PIN_6) oDat |= GPIO_PIN_3;
    if(dat1 & GPIO_PIN_3) oDat |= GPIO_PIN_4;
    
    if(dat2 & GPIO_PIN_8) oDat |= GPIO_PIN_5;
    if(dat2 & GPIO_PIN_7) oDat |= GPIO_PIN_6;
    if(dat2 & GPIO_PIN_9) oDat |= GPIO_PIN_7;

連続したByteビットをモノリシックマシン非連続ビットIO出力に変換
    HAL_GPIO_WritePin(GPIOC, GPIO_PIN_6  , iDat & GPIO_PIN_0);
    HAL_GPIO_WritePin(GPIOC, GPIO_PIN_7  , iDat & GPIO_PIN_1);
    HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8  , iDat & GPIO_PIN_2);
    HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9  , iDat & GPIO_PIN_3);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8  , iDat & GPIO_PIN_4);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9  , iDat & GPIO_PIN_5);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_10 , iDat & GPIO_PIN_6);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15 , iDat & GPIO_PIN_7);

シリアル通信出力(第2種より簡潔,推奨)1,低位先出
char obit;
for(int cnt=0; cnt<8; cnt++)
{
    obit = iDat & GPIO_PIN_0;
    iDat >>=1;

    // obit = obit > 0; // if necessary
    // write obit to pin
}
  
char obit;
for(int cnt=0; cnt<8; cnt++)
{
    obit = iDat & (GPIO_PIN_0 << cnt);

    // obit = obit > 0; // if necessary
    // write obit to pin
}

2、高位先出
char obit;
for(int cnt=0; cnt<8; cnt++)
{
    obit = iDat & GPIO_PIN_7;
    iDat <<=1;

    // obit = obit > 0; // if necessary
    // write obit to pin
}
  
char obit;
for(int cnt=0; cnt<8; cnt++)
{
    obit = iDat & (GPIO_PIN_7 >> cnt);

    // obit = obit > 0; // if necessary
    // write obit to pin
}

シリアル通信入力1、下位ビット先入
int oDat = 0;
for(int cnt=0; cnt<8; cnt++)
{
    // get ibit
    // ibit = ibit > 0; // if ibit is not the LSB

    oDat >>= 1;
    if(ibit)
    {
        oDat |= GPIO_PIN_7;
    }
}

  
int oDat = 0;
for(int cnt=0; cnt<8; cnt++)
{
    // get ibit
    // ibit = ibit > 0; // if ibit is not the LSB

    oDat |= ibit << cnt;
}

2、上位先入
int oDat = 0;
for(int cnt=0; cnt<8; cnt++)
{
    // get ibit
    // ibit = ibit > 0; // if ibit is not the LSB

    oDat <<= 1;
    oDat |= ibit;
}
  
int oDat = 0;
for(int cnt=0; cnt<8; cnt++)
{
    // get ibit
    // ibit = ibit > 0; // if ibit is not the LSB

    oDat |= ibit << (7 - cnt);
}

じゅんかんシフト
高くて低くて毎回1人だけ移動します
	int ibit = Dat & 0x01;
	Dat >>= 1;
	Dat |= ibit << 7;

Nビットを高く、低く移動するたびに、N>0、データ有効長は8ビット
#define MaxBitNum	8 //         8

	N = N % MaxBitNum;

	int bitSel = (1 << N) - 1; // 2^-1, for example, N = 4 generate 00001111 with 4 1bits
	int ibit = 0;

	ibit = Dat & bitSel;
	Dat >>= N;
	Dat |= ibit << (MaxBitNum-N);

空の操作によるコンパイラの最適化を回避するためのソフトウェア遅延関数を添付します.
int UserDelay(int cnt)
{
    int a=0;
    while(cnt--)
    {
        a++;
    }
    return a;
}

 
エラーの追加と指摘を歓迎します.ありがとうございます.