モノリシックプログラミング常用ビット演算
ビット定義-STM 32 ST公式ライブラリ参照
またはTI MSP 430のようなBIT 0 BIT 1を使用して名前を付ける
入力から1人または数人を取り出す
セット1(この3つの態様の利点は、左側のデータのみが右側のブートデータbitが1のビットに影響を受け、他のビットには影響を受けないことである)
0にする
に逆らう
モノリシックマシンの非連続ビットIO入力を連続Byteビットに変換する(入力データが連続するIO領域に接続できない場合がある)
連続したByteビットをモノリシックマシン非連続ビットIO出力に変換
シリアル通信出力(第2種より簡潔,推奨)1,低位先出
2、高位先出
シリアル通信入力1、下位ビット先入
2、上位先入
じゅんかんシフト
高くて低くて毎回1人だけ移動します
Nビットを高く、低く移動するたびに、N>0、データ有効長は8ビット
空の操作によるコンパイラの最適化を回避するためのソフトウェア遅延関数を添付します.
エラーの追加と指摘を歓迎します.ありがとうございます.
#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;
}
エラーの追加と指摘を歓迎します.ありがとうございます.